1#============================================================= -*-perl-*-
2#
3# t/universal.t
4#
5# Test script for the query() method.
6#
7# Written by Chelsea Rio/Kevin Kamel, September 24, 2010
8#
9#========================================================================
10
11use strict;
12use warnings;
13use lib qw( ./lib ../lib );
14use HTML::TreeBuilder;
15use Badger::Filesystem '$Bin Dir';
16use Badger::Test
17    tests => 47,
18    debug => 'HTML::Query',
19    args  => \@ARGV;
20
21use HTML::Query 'Query';
22
23our $Query    = 'HTML::Query';
24our $Builder  = 'HTML::TreeBuilder';
25our $test_dir = Dir($Bin);
26our $html_dir = $test_dir->dir('html')->must_exist;
27our $multi = $html_dir->file('universal.html')->must_exist;
28
29my ($query, $tree);
30
31#-----------------------------------------------------------------------
32# load up second test file and create an HTML::Query object for it.
33#-----------------------------------------------------------------------
34
35$tree = $Builder->new;
36$tree->parse_file( $multi->absolute );
37ok( $tree, 'parsed tree for second test file: ' . $multi->name );
38$query = Query $tree;
39ok( $query, 'created query' );
40
41$query->suppress_errors(1);
42
43#-----------------------------------------------------------------------
44# Make sure suppression was stored successfully
45#-----------------------------------------------------------------------
46
47my $test0 = $query->suppress_errors();
48is ($test0, 1, 'errors suppressed');
49
50#-----------------------------------------------------------------------
51# look for some basic elements using the *
52#-----------------------------------------------------------------------
53
54my $test1 = $query->query('div.danger *');
55ok( $test1, 'div.danger *' );
56is( $test1->size, 4, 'div.danger *' ); #includes javascript and metas
57is( join(', ', $test1->as_trimmed_text), '(div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div), (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div), (div class="danger") (div class="green")(/div) (/div), (div class="green")(/div)','got var' );
58
59my $test2 = $query->query('* div.danger');
60ok( $test2, '* div.danger' );
61is( $test2->size, 2, '* div.danger' ); #includes javascript and metas
62is( join(', ', $test2->as_trimmed_text), '(div class="danger") (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div) (/div), (div class="danger") (div class="green")(/div) (/div)','got var' );
63
64my $test22 = $query->query('div.danger *, * div.danger');
65ok( $test22, 'div.danger *, * div.danger' );
66is( $test22->size, 5, 'div.danger *, * div.danger' ); #includes javascript and metas
67is( join(', ', $test22->as_trimmed_text), '(div class="danger") (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div) (/div), (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div), (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div), (div class="danger") (div class="green")(/div) (/div), (div class="green")(/div)','got var' );
68
69my $test3 = $query->query('div.green');
70ok( $test3, 'div.green' );
71is( $test3->size, 2, 'div.green' );
72is( join(', ', $test3->as_trimmed_text), '(div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div), (div class="green")(/div)','got var' );
73
74my $test4 = $query->query('div.yellow');
75ok( $test4, 'div.yellow' );
76is( $test4->size, 1, 'div.yellow' );
77is( join(', ', $test4->as_trimmed_text), '(div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div)','got var' );
78
79my $test5 = $query->query('div.danger * [class="green"]');
80ok( $test5, 'div.danger * [class="green"]' );
81is( $test5->size, 1, 'div.danger * [class="green"]' );
82is( join(', ', $test5->as_trimmed_text), '(div class="green")(/div)','got var' );
83
84my $test6 = $query->query('div.danger *[class="green"]');
85ok( $test6, 'div.danger *[class="green"]' );
86is( $test6->size, 2, 'div.danger *[class="green"]' );
87is( join(', ', $test6->as_trimmed_text), '(div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div), (div class="green")(/div)','got var' );
88
89my $test7 = $query->query('div.danger * *[class="green"]');
90ok( $test7, 'div.danger * *[class="green"]' );
91is( $test7->size, 1, 'div.danger * *[class="green"]' );
92is( join(', ', $test7->as_trimmed_text), '(div class="green")(/div)','got var' );
93
94my $test8 = $query->query('div.danger * * *[class="green"]');
95ok( $test8, 'div.danger * * *[class="green"]' );
96is( $test8->size, 1, 'div.danger * * *[class="green"]' );
97is( join(', ', $test8->as_trimmed_text), '(div class="green")(/div)','got var' );
98
99my $test9 = $query->query('body * div');
100ok( $test9, 'body * div' );
101is( $test9->size, 8, 'body * div' );
102is( join(', ', $test9->as_trimmed_text), '(div) (div class="danger") (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div) (/div) (div)(/div)(div)(/div) (/div), (div class="danger") (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div) (/div), (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div), (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div), (div class="danger") (div class="green")(/div) (/div), (div class="green")(/div), (div)(/div), (div)(/div)','got var' );
103
104#you must use spaces for this operator
105
106my $test10 = $query->query('body* div');
107ok( !defined($test10), 'No object returned');
108is( $query->get_error(), 'Invalid specification "body*" in query: body* div', 'Rejected bad selector' );
109
110my $test11 = $query->query('body *div');
111ok( !defined($test11), 'No object returned');
112is( $query->get_error(), 'Invalid specification "*div" in query: body *div', 'Rejected bad selector' );
113
114my $test12 = $query->query('body*');
115ok( !defined($test12), 'No object returned');
116is( $query->get_error(), 'Invalid specification "body*" in query: body*', 'Rejected bad selector' );
117
118my $test13 = $query->query('*div');
119ok( !defined($test13), 'No object returned');
120is( $query->get_error(), 'Invalid specification "*div" in query: *div', 'Rejected bad selector' );
121
122my $test14 = $query->query('* div');
123ok( $test14, '* div' );
124is( $test14->size, 9, '* div' );
125is( join(', ', $test14->as_trimmed_text), '(div) (div) (div class="danger") (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div) (/div) (div)(/div)(div)(/div) (/div) (/div), (div) (div class="danger") (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div) (/div) (div)(/div)(div)(/div) (/div), (div class="danger") (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div) (/div), (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div), (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div), (div class="danger") (div class="green")(/div) (/div), (div class="green")(/div), (div)(/div), (div)(/div)','got var' );
126
127#should match the prior test...
128my $test15 = $query->query(' * div');
129ok( $test15, ' * div' );
130is( $test15->size, 9, ' * div' );
131is( join(', ', $test15->as_trimmed_text), '(div) (div) (div class="danger") (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div) (/div) (div)(/div)(div)(/div) (/div) (/div), (div) (div class="danger") (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div) (/div) (div)(/div)(div)(/div) (/div), (div class="danger") (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div) (/div), (div class="green") (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div) (/div), (div class="yellow") (div class="danger") (div class="green")(/div) (/div) (/div), (div class="danger") (div class="green")(/div) (/div), (div class="green")(/div), (div)(/div), (div)(/div)','got var' );
132
1331;
134