add strictures commit (out of order)
[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
34# el[attr]
27ed8809 35is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
3de6bc44 36 ->select('div[frew]')
37 ->replace_content('grg')
38 ->to_html,
27ed8809 39 '<div frew="yo">grg</div>'.$stub,
3de6bc44 40 'E[attr] works' );
41
6d80bb9a 42# *[attr]
43is( HTML::Zoom->from_html('<div frew="yo"></div><span frew="ay"></span>'.$stub)
44 ->select('*[frew]')
45 ->replace_content('grg')
46 ->to_html,
47 '<div frew="yo">grg</div><span frew="ay">grg</span>'.$stub,
48 '*[attr] works' );
49
3de6bc44 50# el[attr="foo"]
27ed8809 51is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
3de6bc44 52 ->select('div[frew="yo"]')
53 ->replace_content('grg')
54 ->to_html,
27ed8809 55 '<div frew="yo">grg</div>'.$stub,
3de6bc44 56 'E[attr="val"] works' );
57
682fa876 58# el[attr=foo]
27ed8809 59is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
682fa876 60 ->select('div[frew=yo]')
61 ->replace_content('grg')
62 ->to_html,
27ed8809 63 '<div frew="yo">grg</div>'.$stub,
682fa876 64 'E[attr=val] works' );
24725e7b 65
66# el[attr!="foo"]
67is( HTML::Zoom->from_html('<div f="f"></div><div class="quux"></div>'.$stub)
68 ->select('div[class!="waargh"]')
69 ->replace_content('grg')
70 ->to_html,
71 '<div f="f">grg</div><div class="quux">grg</div>'.$stub,
72 'E[attr!="val"] works' );
682fa876 73
3de6bc44 74# el[attr*="foo"]
27ed8809 75is( HTML::Zoom->from_html('<div f="frew goog"></div>'.$stub)
3de6bc44 76 ->select('div[f*="oo"]')
77 ->replace_content('grg')
78 ->to_html,
27ed8809 79 '<div f="frew goog">grg</div>'.$stub,
3de6bc44 80 'E[attr*="val"] works' );
81
82# el[attr^="foo"]
27ed8809 83is( HTML::Zoom->from_html('<div f="foobar"></div>'.$stub)
3de6bc44 84 ->select('div[f^="foo"]')
85 ->replace_content('grg')
86 ->to_html,
27ed8809 87 '<div f="foobar">grg</div>'.$stub,
3de6bc44 88 'E[attr^="val"] works' );
89
90# el[attr$="foo"]
27ed8809 91is( HTML::Zoom->from_html('<div f="foobar"></div>'.$stub)
3de6bc44 92 ->select('div[f$="bar"]')
93 ->replace_content('grg')
94 ->to_html,
27ed8809 95 '<div f="foobar">grg</div>'.$stub,
3de6bc44 96 'E[attr$="val"] works' );
97
98# el[attr*="foo"]
27ed8809 99is( HTML::Zoom->from_html('<div f="foo bar"></div>'.$stub)
3de6bc44 100 ->select('div[f*="bar"]')
101 ->replace_content('grg')
102 ->to_html,
27ed8809 103 '<div f="foo bar">grg</div>'.$stub,
3de6bc44 104 'E[attr*="val"] works' );
105
5b63d244 106# el[attr~="foo"]
107is( HTML::Zoom->from_html('<div frew="foo bar baz"></div>'.$stub)
108 ->select('div[frew~="bar"]')
109 ->replace_content('grg')
110 ->to_html,
111 '<div frew="foo bar baz">grg</div>'.$stub,
112 'E[attr~="val"] works' );
113
52878e73 114# el[attr|="foo"]
115is( 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')
119 ->to_html,
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' );
123
682fa876 124# [attr=bar]
125ok( check_select( '[prop=moo]'), '[attr=bar]' );
126
127# el[attr=bar],[prop=foo]
128is( check_select('span[class=career],[prop=moo]'), 2,
129 'Multiple selectors: el[attr=bar],[attr=foo]');
130
bd4e2ca0 131
132# selector parse error test:
133eval{
134 HTML::Zoom->from_html('<span att="bar"></span>')
135 ->select('[att=bar')
136 ->replace_content('cats')
c9448e21 137 ->to_html;
c9448e21 138};
bd4e2ca0 139like( $@, qr/Error parsing dispatch specification/,
140 'Malformed attribute selector ([att=bar) results in a helpful error' );
c9448e21 141
682fa876 142
8c9ef555 143TODO: {
144local $TODO = "descendant selectors doesn't work yet";
3de6bc44 145# sel1 sel2
8c9ef555 146is( eval { HTML::Zoom->from_html('<table><tr></tr><tr></tr></table>')
3de6bc44 147 ->select('table tr')
8c9ef555 148 ->replace_content('<td></td>')
149 ->to_html },
3de6bc44 150 '<table><tr><td></td></tr><tr><td></td></tr></table>',
151 'sel1 sel2 works' );
8c9ef555 152diag($@) if $@;
3de6bc44 153
154# sel1 sel2 sel3
8c9ef555 155is( eval { HTML::Zoom->from_html('<table><tr><td></td></tr><tr><td></td></tr></table>')
3de6bc44 156 ->select('table tr td')
157 ->replace_content('frew')
8c9ef555 158 ->to_html },
3de6bc44 159 '<table><tr><td>frew</td></tr><tr><td>frew</td></tr></table>',
160 'sel1 sel2 sel3 works' );
8c9ef555 161diag($@) if $@;
162}
27ed8809 163
3de6bc44 164done_testing;
682fa876 165
166
8c9ef555 167sub check_select {
682fa876 168 # less crude?:
169 my $output = HTML::Zoom
170 ->from_html($tmpl)
171 ->select(shift)->replace("the monkey")->to_html;
172 my $count = 0;
eacf665f 173 while ( $output =~ /the monkey/g ){
682fa876 174 $count++;
175 }
176 return $count;
177}