additional test
[catagits/HTML-Zoom.git] / t / dwim-autoload.t
1 use strict;
2 use warnings FATAL => 'all';
3
4 use HTML::Zoom;
5 use Test::More;
6
7 ok my $zoom = HTML::Zoom->from_html(<<HTML);
8 <html>
9   <head>
10     <title>Hi!</title>
11   </head>
12   <body id="content-area">
13     <h1>Test</h1>
14     <div>
15       <p class="first-para">Some Stuff</p>
16       <p class="body-para">More Stuff</p>
17       <p class="body-para">Even More Stuff</p>
18       <ol>
19         <li class="first-item odd">First</li>
20         <li class="body-items even">Stuff A</li>
21         <li class="body-items odd">Stuff B</li>
22         <li class="body-items even">Stuff C</li>
23         <li class="last-item odd">Last</li>
24       </ol>
25       <ul class="items">
26         <li class="first">space</li>
27         <li class="second">space</li>
28       </ul>
29       <p class="body-para">Even More stuff</p>
30       <p class="last-para">Some Stuff</p>
31     </div>
32     <div id="blocks">
33       <h2 class="h2-item">Sub Item</h2>
34     </div>
35     <ul id="people">
36         <li class="name">name</li>
37         <li class="email">email</li>
38     </ul>
39     <ul id="people2">
40         <li class="name">name</li>
41         <li class="email">email</li>
42     </ul>
43     <ul id="object">
44         <li class="aa">AA</li>
45         <li class="bb">BB</li>
46     </ul>
47     <p id="footer">Copyright 2222</p>
48   </body>
49 </html>
50 HTML
51
52 ok ! eval { $zoom->non_method('.first-param' => 'First!'); 1},
53   'Properly die on bad method';
54
55 ok my $title = sub {
56   my ($z, $content) = @_;
57   $z = $z->replace_content(title =>$content);
58   return $z;
59 };
60
61 ok my $dwim = $zoom
62   ->$title('Hello NYC')
63   ->replace_content('.first-para' => 'First!')
64   ->replace_content('.last-para' => 'Last!')
65   ->add_to_attribute(p => class => 'para')
66   ->prepend_content('.first-item' => [{type=>'TEXT', raw=>'FIRST: '}])
67   ->prepend_content('.last-item' => [{type=>'TEXT', raw=>'LAST: '}])
68   ->replace_content('title' => 'Hello World')
69   ->repeat_content(
70     '.items' => [ 
71       map { 
72         my $v = $_;
73         sub {
74           $_->replace_content('.first' => $v)
75             ->replace_content('.second' => $v);
76         },
77       } (111,222)
78     ]
79   )
80   ->to_html;
81
82 like(
83   HTML::Zoom
84     ->from_html(q[<title>Hi!</title>])
85     ->$title('Hello NYC')
86     ->to_html,
87   qr/Hello NYC/,
88   'Got correct title(custom subref)'
89 );
90
91 like(
92   HTML::Zoom
93     ->from_html(q[<p>Hi!</p>])
94     ->replace_content(p=>'Ask not what your country can do for you...')
95     ->to_html,
96   qr/Ask not what your country can do for you\.\.\./,
97   'Got correct from replace_content'
98 );
99
100 like(
101   HTML::Zoom
102     ->from_html(q[<p class="first">Hi!</p>])
103     ->add_to_attribute('p', class => 'para')
104     ->to_html,
105   qr/first para/,
106   'Got correct from add_to_attribute'
107 );
108
109 like(
110   HTML::Zoom
111     ->from_html(q[<p class="first">Hi!</p>])
112     ->set_attribute('p', class => 'para')
113     ->to_html,
114   qr/class="para"/,
115   'Got correct from set_attribute'
116 );
117
118 is(
119   HTML::Zoom
120     ->from_html(q[<p class="first">Hi!</p>])
121     ->add_before(p=>[{type=>'TEXT', raw=>'added before'}])
122     ->to_html,
123   'added before<p class="first">Hi!</p>',
124   'Got correct from add_before'
125 );
126
127 is(
128   HTML::Zoom
129     ->from_html(q[<p class="first">Hi!</p>])
130     ->add_after(p=>[{type=>'TEXT', raw=>'added after'}])
131     ->to_html,
132   '<p class="first">Hi!</p>added after',
133   'Got correct from add_after'
134 );
135
136 is(
137   HTML::Zoom
138     ->from_html(q[<p class="first">Hi!</p>])
139     ->prepend_content(p=>[{type=>'TEXT', raw=>'prepend_content'}])
140     ->to_html,
141   '<p class="first">prepend_contentHi!</p>',
142   'Got correct from prepend_content'
143 );
144
145 is(
146   HTML::Zoom
147     ->from_html(q[<p class="first">Hi!</p>])
148     ->append_content(p=>[{type=>'TEXT', raw=>'append_content'}])
149     ->to_html,
150   '<p class="first">Hi!append_content</p>',
151   'Got correct from append_content'
152 );
153
154 {
155     my @body;
156     ok my $body = HTML::Zoom
157       ->from_html(q[<div>My Stuff Is Here</div>])
158       ->collect_content(div => { into => \@body, passthrough => 1})
159       ->to_html, 'Collected Content';
160
161     is $body, "<div>My Stuff Is Here</div>", "Got expected";
162
163     is(
164       HTML::Zoom->from_events(\@body)->to_html,
165       'My Stuff Is Here',
166       'Collected the right stuff',
167     );
168 }
169
170 like(
171   HTML::Zoom
172     ->from_html(q[<ul class="items"><li class="first">first</li><li class="second">second</li></ul>])
173     ->repeat_content(
174       '.items' => [ 
175         map { 
176           my $v = $_;
177           sub {
178             $_->replace_content('.first' => $v)
179               ->replace_content('.second' => $v);
180           },
181         } (111,222)
182       ]
183     )
184     ->to_html,
185   qr[<ul class="items"><li class="first">111</li><li class="second">111</li><li class="first">222</li><li class="second">222</li></ul>],
186   'Got correct list'
187 );
188
189 {
190   ok my $z = HTML::Zoom
191     ->from_html(q[<div>Life, whatever</div><p class="first">Hi!</p>])
192     ->add_before(p=>'added before');
193
194   is $z->to_html, '<div>Life, whatever</div>added before<p class="first">Hi!</p>',
195     'Got correct from add_before';
196 }
197
198 {
199   ok my $z = HTML::Zoom
200     ->from_html(q[<div>Life, whatever</div><p class="first">Hi!</p>])
201     ->add_after(p=>'added after');
202
203   is $z->to_html, '<div>Life, whatever</div><p class="first">Hi!</p>added after',
204     'Got correct from add_after';
205 }
206
207 {
208   ok my $z = HTML::Zoom
209     ->from_html(q[<div>Life, whatever</div><p class="first">Hi!</p>])
210     ->append_content(p=>'appended');
211
212   is $z->to_html, '<div>Life, whatever</div><p class="first">Hi!appended</p>',
213     'Got correct from append_content';
214 }
215
216 {
217   ok my $z = HTML::Zoom
218     ->from_html(q[<div>Life, whatever</div><p class="first">Hi!</p>])
219     ->prepend_content(p=>'prepended');
220     
221
222   is $z->to_html, '<div>Life, whatever</div><p class="first">prependedHi!</p>',
223     'Got correct from prepend_content';
224 }
225
226 {
227   ok my $z = HTML::Zoom
228     ->from_html(q[<ul><li>Test</li></ul>])
229     ->select('ul')
230     ->repeat_content(
231       [
232         sub { $_->select('li')->replace_content('Real Life1') },
233         sub { $_->select('li')->replace_content('Real Life2') },
234         sub { $_->select('li')->replace_content('Real Life3') },
235       ],
236     )
237     ->to_html;
238
239   is $z, '<ul><li>Real Life1</li><li>Real Life2</li><li>Real Life3</li></ul>',
240     'Got correct from repeat_content';
241 }
242
243 {
244   ok my $z = HTML::Zoom
245     ->from_html(q[<ul><li>Test</li></ul>])
246     ->select('ul')
247     ->repeat_content([
248       map { my $i = $_; +sub {$_->select('li')->replace_content("Real Life$i")} } (1,2,3)
249     ])
250     ->to_html;
251
252   is $z, '<ul><li>Real Life1</li><li>Real Life2</li><li>Real Life3</li></ul>',
253     'Got correct from repeat_content';
254 }
255
256
257 use HTML::Zoom::CodeStream;
258 sub code_stream (&) {
259   my $code = shift;
260   return sub {
261     HTML::Zoom::CodeStream->new({
262       code => $code,
263     });
264   }
265 }
266
267 {
268   my @list = qw(foo bar baz);
269   ok my $z = HTML::Zoom
270     ->from_html(q[<ul><li>Test</li></ul>])
271     ->select('ul')
272     ->repeat_content(code_stream {
273       if (my $name = shift @list) {
274         return sub { $_->select('li')->replace_content($name) };
275       } else {
276         return
277       }
278     })
279     ->to_html;
280   
281   is $z, '<ul><li>foo</li><li>bar</li><li>baz</li></ul>',
282     'Got correct from repeat_content';
283 }
284
285 {
286   my @list = qw(foo bar baz);
287   ok my $z = HTML::Zoom
288     ->from_html(q[<ul><li>Test</li></ul>])
289     ->select('ul')
290     ->repeat_content(sub {
291       HTML::Zoom::CodeStream->new({
292         code => sub {
293           if (my $name = shift @list) {
294             return sub { $_->select('li')->replace_content($name) };
295           } else {
296             return
297           }
298         }
299       });
300     })
301     ->to_html;
302   
303   is $z, '<ul><li>foo</li><li>bar</li><li>baz</li></ul>',
304     'Got correct from repeat_content';
305 }
306
307 {
308   ok my $dwim = HTML::Zoom
309     ->from_html(q[<ul><li class="foo"></li><li class="bar"></li></ul>])
310     ->replace_content({
311       'li.foo' => ['foo'],
312       'li.bar' => ['bar'],
313     })->to_html;
314   is $dwim, '<ul><li class="foo">foo</li><li class="bar">bar</li></ul>',
315     'Multiple selectors from hashref (via replace_content)';
316 }
317
318 {
319   ok my $dwim = HTML::Zoom
320   ->from_html(q[<ul><li class="foo"></li><li class="bar"></li></ul>])
321     ->set_attribute({
322       'li.foo' => [ class => 'baz' ],
323       'li.bar' => [ class => 'qux' ],
324     })->to_html;
325   is $dwim, '<ul><li class="baz"></li><li class="qux"></li></ul>',
326     'Multiple selectors from hashref (via set_attribute)';
327 }
328
329 done_testing;