Catch unmatched "[" in selector parser with a helpful error
[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
43# el[attr="foo"]
27ed8809 44is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
3de6bc44 45 ->select('div[frew="yo"]')
46 ->replace_content('grg')
47 ->to_html,
27ed8809 48 '<div frew="yo">grg</div>'.$stub,
3de6bc44 49 'E[attr="val"] works' );
50
682fa876 51# el[attr=foo]
27ed8809 52is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
682fa876 53 ->select('div[frew=yo]')
54 ->replace_content('grg')
55 ->to_html,
27ed8809 56 '<div frew="yo">grg</div>'.$stub,
682fa876 57 'E[attr=val] works' );
58
59
3de6bc44 60# el[attr*="foo"]
27ed8809 61is( HTML::Zoom->from_html('<div f="frew goog"></div>'.$stub)
3de6bc44 62 ->select('div[f*="oo"]')
63 ->replace_content('grg')
64 ->to_html,
27ed8809 65 '<div f="frew goog">grg</div>'.$stub,
3de6bc44 66 'E[attr*="val"] works' );
67
68# el[attr^="foo"]
27ed8809 69is( HTML::Zoom->from_html('<div f="foobar"></div>'.$stub)
3de6bc44 70 ->select('div[f^="foo"]')
71 ->replace_content('grg')
72 ->to_html,
27ed8809 73 '<div f="foobar">grg</div>'.$stub,
3de6bc44 74 'E[attr^="val"] works' );
75
76# el[attr$="foo"]
27ed8809 77is( HTML::Zoom->from_html('<div f="foobar"></div>'.$stub)
3de6bc44 78 ->select('div[f$="bar"]')
79 ->replace_content('grg')
80 ->to_html,
27ed8809 81 '<div f="foobar">grg</div>'.$stub,
3de6bc44 82 'E[attr$="val"] works' );
83
84# el[attr*="foo"]
27ed8809 85is( HTML::Zoom->from_html('<div f="foo bar"></div>'.$stub)
3de6bc44 86 ->select('div[f*="bar"]')
87 ->replace_content('grg')
88 ->to_html,
27ed8809 89 '<div f="foo bar">grg</div>'.$stub,
3de6bc44 90 'E[attr*="val"] works' );
91
682fa876 92# [attr=bar]
93ok( check_select( '[prop=moo]'), '[attr=bar]' );
94
95# el[attr=bar],[prop=foo]
96is( check_select('span[class=career],[prop=moo]'), 2,
97 'Multiple selectors: el[attr=bar],[attr=foo]');
98
bd4e2ca0 99
100# selector parse error test:
101eval{
102 HTML::Zoom->from_html('<span att="bar"></span>')
103 ->select('[att=bar')
104 ->replace_content('cats')
c9448e21 105 ->to_html;
c9448e21 106};
bd4e2ca0 107like( $@, qr/Error parsing dispatch specification/,
108 'Malformed attribute selector ([att=bar) results in a helpful error' );
c9448e21 109
27ed8809 110=pod
682fa876 111
3de6bc44 112# sel1 sel2
113is( HTML::Zoom->from_html('<table><tr></tr><tr></tr></table>')
114 ->select('table tr')
115 ->replace_content(\'<td></td>')
116 ->to_html,
117 '<table><tr><td></td></tr><tr><td></td></tr></table>',
118 'sel1 sel2 works' );
119
120
121# sel1 sel2 sel3
122is( HTML::Zoom->from_html('<table><tr><td></td></tr><tr><td></td></tr></table>')
123 ->select('table tr td')
124 ->replace_content('frew')
125 ->to_html,
126 '<table><tr><td>frew</td></tr><tr><td>frew</td></tr></table>',
127 'sel1 sel2 sel3 works' );
128
c9448e21 129
130
27ed8809 131=cut
132
3de6bc44 133done_testing;
682fa876 134
135
136sub check_select{
137 # less crude?:
138 my $output = HTML::Zoom
139 ->from_html($tmpl)
140 ->select(shift)->replace("the monkey")->to_html;
141 my $count = 0;
eacf665f 142 while ( $output =~ /the monkey/g ){
682fa876 143 $count++;
144 }
145 return $count;
146}