9 <span prop='moo' class="hilight name">Bob</span>
10 <span class="career">Builder</span>
16 my $stub = '<div class="waargh"></div>';
19 is( HTML::Zoom->from_html('<div id="yo"></div>'.$stub)
21 ->replace_content('grg')
23 '<div id="yo">grg</div>'.$stub,
27 is( HTML::Zoom->from_html('<div class="yo"></div>'.$stub)
29 ->replace_content('grg')
31 '<div class="yo">grg</div>'.$stub,
36 is( HTML::Zoom->from_html('<div class="yo.yo"></div>'.$stub)
37 ->select('div.yo\.yo')
38 ->replace_content('grg')
40 '<div class="yo.yo">grg</div>'.$stub,
44 is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
46 ->replace_content('grg')
48 '<div frew="yo">grg</div>'.$stub,
52 is( HTML::Zoom->from_html('<div frew="yo"></div><span frew="ay"></span>'.$stub)
54 ->replace_content('grg')
56 '<div frew="yo">grg</div><span frew="ay">grg</span>'.$stub,
60 is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
61 ->select('div[frew="yo"]')
62 ->replace_content('grg')
64 '<div frew="yo">grg</div>'.$stub,
65 'E[attr="val"] works' );
68 is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
69 ->select('div[frew=yo]')
70 ->replace_content('grg')
72 '<div frew="yo">grg</div>'.$stub,
73 'E[attr=val] works' );
76 local $TODO = 'mixed-case attribute names are broken';
78 is( HTML::Zoom->from_html('<div FreW="yo"></div>'.$stub)
79 ->select('div[FreW=yo]')
80 ->replace_content('grg')
82 '<div FreW="yo">grg</div>'.$stub,
83 'E[attr=val] works with mixed-case attribute names' );
87 is( HTML::Zoom->from_html('<div frew="yo.yo"></div>'.$stub)
88 ->select('div[frew=yo\.yo]')
89 ->replace_content('grg')
91 '<div frew="yo.yo">grg</div>'.$stub,
92 'E[attr=foo\.bar] works' );
95 is( HTML::Zoom->from_html('<div f="f"></div><div class="quux"></div>'.$stub)
96 ->select('div[class!="waargh"]')
97 ->replace_content('grg')
99 '<div f="f">grg</div><div class="quux">grg</div>'.$stub,
100 'E[attr!="val"] works' );
103 is( HTML::Zoom->from_html('<div f="frew goog"></div>'.$stub)
104 ->select('div[f*="oo"]')
105 ->replace_content('grg')
107 '<div f="frew goog">grg</div>'.$stub,
108 'E[attr*="val"] works' );
111 is( HTML::Zoom->from_html('<div f="foobar"></div>'.$stub)
112 ->select('div[f^="foo"]')
113 ->replace_content('grg')
115 '<div f="foobar">grg</div>'.$stub,
116 'E[attr^="val"] works' );
119 is( HTML::Zoom->from_html('<div f="foobar"></div>'.$stub)
120 ->select('div[f$="bar"]')
121 ->replace_content('grg')
123 '<div f="foobar">grg</div>'.$stub,
124 'E[attr$="val"] works' );
127 is( HTML::Zoom->from_html('<div f="foo bar"></div>'.$stub)
128 ->select('div[f*="bar"]')
129 ->replace_content('grg')
131 '<div f="foo bar">grg</div>'.$stub,
132 'E[attr*="val"] works' );
135 is( HTML::Zoom->from_html('<div frew="foo bar baz"></div>'.$stub)
136 ->select('div[frew~="bar"]')
137 ->replace_content('grg')
139 '<div frew="foo bar baz">grg</div>'.$stub,
140 'E[attr~="val"] works' );
143 is( 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')
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' );
153 ok( check_select( '[prop=moo]'), '[attr=bar]' );
155 # el[attr=bar],[prop=foo]
156 is( check_select('span[class=career],[prop=moo]'), 2,
157 'Multiple selectors: el[attr=bar],[attr=foo]');
160 # selector parse error test:
162 HTML::Zoom->from_html('<span att="bar"></span>')
164 ->replace_content('cats')
167 like( $@, qr/Error parsing dispatch specification/,
168 'Malformed attribute selector ([att=bar) results in a helpful error' );
172 local $TODO = "descendant selectors doesn't work yet";
174 is( eval { HTML::Zoom->from_html('<table><tr></tr><tr></tr></table>')
176 ->replace_content('<td></td>')
178 '<table><tr><td></td></tr><tr><td></td></tr></table>',
183 is( eval { HTML::Zoom->from_html('<table><tr><td></td></tr><tr><td></td></tr></table>')
184 ->select('table tr td')
185 ->replace_content('frew')
187 '<table><tr><td>frew</td></tr><tr><td>frew</td></tr></table>',
188 'sel1 sel2 sel3 works' );
197 my $output = HTML::Zoom
199 ->select(shift)->replace("the monkey")->to_html;
201 while ( $output =~ /the monkey/g ){