Commit | Line | Data |
1cf03540 |
1 | use strictures 1; |
3de6bc44 |
2 | use Test::More; |
3 | |
4 | use HTML::Zoom; |
5 | |
682fa876 |
6 | my $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> |
14 | END |
15 | |
27ed8809 |
16 | my $stub = '<div class="waargh"></div>'; |
17 | |
3de6bc44 |
18 | # el#id |
27ed8809 |
19 | is( 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 |
27 | is( 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 |
36 | is( 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 |
44 | is( 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] |
52 | is( 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 |
60 | is( 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 |
68 | is( 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] |
87 | is( 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"] |
95 | is( 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 |
103 | is( 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 |
111 | is( 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 |
119 | is( 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 |
127 | is( 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"] |
135 | is( 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"] |
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') |
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] |
153 | ok( check_select( '[prop=moo]'), '[attr=bar]' ); |
154 | |
155 | # el[attr=bar],[prop=foo] |
156 | is( check_select('span[class=career],[prop=moo]'), 2, |
157 | 'Multiple selectors: el[attr=bar],[attr=foo]'); |
158 | |
bd4e2ca0 |
159 | |
160 | # selector parse error test: |
161 | eval{ |
162 | HTML::Zoom->from_html('<span att="bar"></span>') |
163 | ->select('[att=bar') |
164 | ->replace_content('cats') |
c9448e21 |
165 | ->to_html; |
c9448e21 |
166 | }; |
bd4e2ca0 |
167 | like( $@, qr/Error parsing dispatch specification/, |
168 | 'Malformed attribute selector ([att=bar) results in a helpful error' ); |
c9448e21 |
169 | |
682fa876 |
170 | |
8c9ef555 |
171 | TODO: { |
172 | local $TODO = "descendant selectors doesn't work yet"; |
3de6bc44 |
173 | # sel1 sel2 |
8c9ef555 |
174 | is( 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 |
180 | diag($@) if $@; |
3de6bc44 |
181 | |
182 | # sel1 sel2 sel3 |
8c9ef555 |
183 | is( 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 |
189 | diag($@) if $@; |
190 | } |
27ed8809 |
191 | |
3de6bc44 |
192 | done_testing; |
682fa876 |
193 | |
194 | |
8c9ef555 |
195 | sub 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 | } |