getting things synced up for a release
[catagits/HTML-Zoom.git] / t / selectors.t
CommitLineData
1cf03540 1use strictures 1;
3de6bc44 2use Test::More;
3
4use HTML::Zoom;
5
682fa876 6my $tmpl = <<END;
7<body>
8 <div class="main">
9 <span prop='moo' class="hilight name">Bob</span>
10 <span class="career">Builder</span>
11 <hr />
12 </div>
13</body>
14END
15
27ed8809 16my $stub = '<div class="waargh"></div>';
17
3de6bc44 18# el#id
27ed8809 19is( HTML::Zoom->from_html('<div id="yo"></div>'.$stub)
3de6bc44 20 ->select('div#yo')
21 ->replace_content('grg')
22 ->to_html,
27ed8809 23 '<div id="yo">grg</div>'.$stub,
3de6bc44 24 'E#id works' );
25
26# el.class1
27ed8809 27is( HTML::Zoom->from_html('<div class="yo"></div>'.$stub)
3de6bc44 28 ->select('div.yo')
29 ->replace_content('grg')
30 ->to_html,
27ed8809 31 '<div class="yo">grg</div>'.$stub,
3de6bc44 32 'E.class works' );
33
619fe6fe 34
35# el.class\.1
36is( HTML::Zoom->from_html('<div class="yo.yo"></div>'.$stub)
37 ->select('div.yo\.yo')
38 ->replace_content('grg')
39 ->to_html,
40 '<div class="yo.yo">grg</div>'.$stub,
41 'E.class\.0 works' );
42
3de6bc44 43# el[attr]
27ed8809 44is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
3de6bc44 45 ->select('div[frew]')
46 ->replace_content('grg')
47 ->to_html,
27ed8809 48 '<div frew="yo">grg</div>'.$stub,
3de6bc44 49 'E[attr] works' );
50
6d80bb9a 51# *[attr]
52is( HTML::Zoom->from_html('<div frew="yo"></div><span frew="ay"></span>'.$stub)
53 ->select('*[frew]')
54 ->replace_content('grg')
55 ->to_html,
56 '<div frew="yo">grg</div><span frew="ay">grg</span>'.$stub,
57 '*[attr] works' );
58
3de6bc44 59# el[attr="foo"]
27ed8809 60is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
3de6bc44 61 ->select('div[frew="yo"]')
62 ->replace_content('grg')
63 ->to_html,
27ed8809 64 '<div frew="yo">grg</div>'.$stub,
3de6bc44 65 'E[attr="val"] works' );
66
682fa876 67# el[attr=foo]
27ed8809 68is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
682fa876 69 ->select('div[frew=yo]')
70 ->replace_content('grg')
71 ->to_html,
27ed8809 72 '<div frew="yo">grg</div>'.$stub,
682fa876 73 'E[attr=val] works' );
24725e7b 74
8b2ea04e 75{
76 local $TODO = 'mixed-case attribute names are broken';
77 # el[Attr=foo]
78 is( HTML::Zoom->from_html('<div FreW="yo"></div>'.$stub)
79 ->select('div[FreW=yo]')
80 ->replace_content('grg')
81 ->to_html,
82 '<div FreW="yo">grg</div>'.$stub,
83 'E[attr=val] works with mixed-case attribute names' );
84}
85
619fe6fe 86# el[attr=foo\.bar]
87is( HTML::Zoom->from_html('<div frew="yo.yo"></div>'.$stub)
88 ->select('div[frew=yo\.yo]')
89 ->replace_content('grg')
90 ->to_html,
91 '<div frew="yo.yo">grg</div>'.$stub,
92 'E[attr=foo\.bar] works' );
93
24725e7b 94# el[attr!="foo"]
95is( HTML::Zoom->from_html('<div f="f"></div><div class="quux"></div>'.$stub)
96 ->select('div[class!="waargh"]')
97 ->replace_content('grg')
98 ->to_html,
99 '<div f="f">grg</div><div class="quux">grg</div>'.$stub,
100 'E[attr!="val"] works' );
682fa876 101
3de6bc44 102# el[attr*="foo"]
27ed8809 103is( HTML::Zoom->from_html('<div f="frew goog"></div>'.$stub)
3de6bc44 104 ->select('div[f*="oo"]')
105 ->replace_content('grg')
106 ->to_html,
27ed8809 107 '<div f="frew goog">grg</div>'.$stub,
3de6bc44 108 'E[attr*="val"] works' );
109
110# el[attr^="foo"]
27ed8809 111is( HTML::Zoom->from_html('<div f="foobar"></div>'.$stub)
3de6bc44 112 ->select('div[f^="foo"]')
113 ->replace_content('grg')
114 ->to_html,
27ed8809 115 '<div f="foobar">grg</div>'.$stub,
3de6bc44 116 'E[attr^="val"] works' );
117
118# el[attr$="foo"]
27ed8809 119is( HTML::Zoom->from_html('<div f="foobar"></div>'.$stub)
3de6bc44 120 ->select('div[f$="bar"]')
121 ->replace_content('grg')
122 ->to_html,
27ed8809 123 '<div f="foobar">grg</div>'.$stub,
3de6bc44 124 'E[attr$="val"] works' );
125
126# el[attr*="foo"]
27ed8809 127is( HTML::Zoom->from_html('<div f="foo bar"></div>'.$stub)
3de6bc44 128 ->select('div[f*="bar"]')
129 ->replace_content('grg')
130 ->to_html,
27ed8809 131 '<div f="foo bar">grg</div>'.$stub,
3de6bc44 132 'E[attr*="val"] works' );
133
5b63d244 134# el[attr~="foo"]
135is( HTML::Zoom->from_html('<div frew="foo bar baz"></div>'.$stub)
136 ->select('div[frew~="bar"]')
137 ->replace_content('grg')
138 ->to_html,
139 '<div frew="foo bar baz">grg</div>'.$stub,
140 'E[attr~="val"] works' );
141
52878e73 142# el[attr|="foo"]
143is( HTML::Zoom->from_html('<div lang="pl"></div><div lang="english"></div>'.
144 '<div lang="en"></div><div lang="en-US"></div>'.$stub)
145 ->select('div[lang|="en"]')
146 ->replace_content('grg')
147 ->to_html,
148 '<div lang="pl"></div><div lang="english"></div>'.
149 '<div lang="en">grg</div><div lang="en-US">grg</div>'.$stub,
150 'E[attr|="val"] works' );
151
682fa876 152# [attr=bar]
153ok( check_select( '[prop=moo]'), '[attr=bar]' );
154
155# el[attr=bar],[prop=foo]
156is( check_select('span[class=career],[prop=moo]'), 2,
157 'Multiple selectors: el[attr=bar],[attr=foo]');
158
bd4e2ca0 159
160# selector parse error test:
161eval{
162 HTML::Zoom->from_html('<span att="bar"></span>')
163 ->select('[att=bar')
164 ->replace_content('cats')
c9448e21 165 ->to_html;
c9448e21 166};
bd4e2ca0 167like( $@, qr/Error parsing dispatch specification/,
168 'Malformed attribute selector ([att=bar) results in a helpful error' );
c9448e21 169
682fa876 170
8c9ef555 171TODO: {
172local $TODO = "descendant selectors doesn't work yet";
3de6bc44 173# sel1 sel2
8c9ef555 174is( eval { HTML::Zoom->from_html('<table><tr></tr><tr></tr></table>')
3de6bc44 175 ->select('table tr')
8c9ef555 176 ->replace_content('<td></td>')
177 ->to_html },
3de6bc44 178 '<table><tr><td></td></tr><tr><td></td></tr></table>',
179 'sel1 sel2 works' );
8c9ef555 180diag($@) if $@;
3de6bc44 181
182# sel1 sel2 sel3
8c9ef555 183is( eval { HTML::Zoom->from_html('<table><tr><td></td></tr><tr><td></td></tr></table>')
3de6bc44 184 ->select('table tr td')
185 ->replace_content('frew')
8c9ef555 186 ->to_html },
3de6bc44 187 '<table><tr><td>frew</td></tr><tr><td>frew</td></tr></table>',
188 'sel1 sel2 sel3 works' );
8c9ef555 189diag($@) if $@;
190}
27ed8809 191
3de6bc44 192done_testing;
682fa876 193
194
8c9ef555 195sub check_select {
682fa876 196 # less crude?:
197 my $output = HTML::Zoom
198 ->from_html($tmpl)
199 ->select(shift)->replace("the monkey")->to_html;
200 my $count = 0;
eacf665f 201 while ( $output =~ /the monkey/g ){
682fa876 202 $count++;
203 }
204 return $count;
205}