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