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,
35 is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
37 ->replace_content('grg')
39 '<div frew="yo">grg</div>'.$stub,
43 is( HTML::Zoom->from_html('<div frew="yo"></div><span frew="ay"></span>'.$stub)
45 ->replace_content('grg')
47 '<div frew="yo">grg</div><span frew="ay">grg</span>'.$stub,
51 is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
52 ->select('div[frew="yo"]')
53 ->replace_content('grg')
55 '<div frew="yo">grg</div>'.$stub,
56 'E[attr="val"] works' );
59 is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
60 ->select('div[frew=yo]')
61 ->replace_content('grg')
63 '<div frew="yo">grg</div>'.$stub,
64 'E[attr=val] works' );
67 is( HTML::Zoom->from_html('<div f="f"></div><div class="quux"></div>'.$stub)
68 ->select('div[class!="waargh"]')
69 ->replace_content('grg')
71 '<div f="f">grg</div><div class="quux">grg</div>'.$stub,
72 'E[attr!="val"] works' );
75 is( HTML::Zoom->from_html('<div f="frew goog"></div>'.$stub)
76 ->select('div[f*="oo"]')
77 ->replace_content('grg')
79 '<div f="frew goog">grg</div>'.$stub,
80 'E[attr*="val"] works' );
83 is( HTML::Zoom->from_html('<div f="foobar"></div>'.$stub)
84 ->select('div[f^="foo"]')
85 ->replace_content('grg')
87 '<div f="foobar">grg</div>'.$stub,
88 'E[attr^="val"] works' );
91 is( HTML::Zoom->from_html('<div f="foobar"></div>'.$stub)
92 ->select('div[f$="bar"]')
93 ->replace_content('grg')
95 '<div f="foobar">grg</div>'.$stub,
96 'E[attr$="val"] works' );
99 is( HTML::Zoom->from_html('<div f="foo bar"></div>'.$stub)
100 ->select('div[f*="bar"]')
101 ->replace_content('grg')
103 '<div f="foo bar">grg</div>'.$stub,
104 'E[attr*="val"] works' );
107 is( HTML::Zoom->from_html('<div frew="foo bar baz"></div>'.$stub)
108 ->select('div[frew~="bar"]')
109 ->replace_content('grg')
111 '<div frew="foo bar baz">grg</div>'.$stub,
112 'E[attr~="val"] works' );
115 is( HTML::Zoom->from_html('<div lang="pl"></div><div lang="english"></div>'.
116 '<div lang="en"></div><div lang="en-US"></div>'.$stub)
117 ->select('div[lang|="en"]')
118 ->replace_content('grg')
120 '<div lang="pl"></div><div lang="english"></div>'.
121 '<div lang="en">grg</div><div lang="en-US">grg</div>'.$stub,
122 'E[attr|="val"] works' );
125 ok( check_select( '[prop=moo]'), '[attr=bar]' );
127 # el[attr=bar],[prop=foo]
128 is( check_select('span[class=career],[prop=moo]'), 2,
129 'Multiple selectors: el[attr=bar],[attr=foo]');
132 # selector parse error test:
134 HTML::Zoom->from_html('<span att="bar"></span>')
136 ->replace_content('cats')
139 like( $@, qr/Error parsing dispatch specification/,
140 'Malformed attribute selector ([att=bar) results in a helpful error' );
144 local $TODO = "descendant selectors doesn't work yet";
146 is( eval { HTML::Zoom->from_html('<table><tr></tr><tr></tr></table>')
148 ->replace_content('<td></td>')
150 '<table><tr><td></td></tr><tr><td></td></tr></table>',
155 is( eval { HTML::Zoom->from_html('<table><tr><td></td></tr><tr><td></td></tr></table>')
156 ->select('table tr td')
157 ->replace_content('frew')
159 '<table><tr><td>frew</td></tr><tr><td>frew</td></tr></table>',
160 'sel1 sel2 sel3 works' );
169 my $output = HTML::Zoom
171 ->select(shift)->replace("the monkey")->to_html;
173 while ( $output =~ /the monkey/g ){