/[suikacvs]/markup/html/whatpm/t/HTML-tree.t
Suika

Contents of /markup/html/whatpm/t/HTML-tree.t

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.42 - (hide annotations) (download) (as text)
Tue Oct 14 07:40:52 2008 UTC (16 years ago) by wakaba
Branch: MAIN
Changes since 1.41: +2 -2 lines
File MIME type: application/x-troff
++ whatpm/t/ChangeLog	14 Oct 2008 07:37:19 -0000
	* tree-test-phrasing.dat: Wrong test results fixed.

	* tree-test-foreign.dat: New tests added.

	* testfiles.pl: "#..." line at the end of a test entry was not
	supported.

	* HTML-tree.t: Show the "#data" content in "no #errors" error
	message.

	* tokenizer-test-2.dat: A wrong test result fixed.

2008-10-14  Wakaba  <wakaba@suika.fam.cx>

1 wakaba 1.1 #!/usr/bin/perl
2     use strict;
3    
4 wakaba 1.23 my $DEBUG = $ENV{DEBUG};
5 wakaba 1.33
6 wakaba 1.32 use lib qw[/home/wakaba/work/manakai2/lib];
7 wakaba 1.41 my $test_dir_name = 't/';
8     my $dir_name = 't/tree-construction/';
9 wakaba 1.1
10     use Test;
11 wakaba 1.41 BEGIN { plan tests => 4935 }
12 wakaba 1.1
13     use Data::Dumper;
14     $Data::Dumper::Useqq = 1;
15     sub Data::Dumper::qquote {
16     my $s = shift;
17     $s =~ s/([^\x20\x21-\x26\x28-\x5B\x5D-\x7E])/sprintf '\x{%02X}', ord $1/ge;
18     return q<qq'> . $s . q<'>;
19     } # Data::Dumper::qquote
20    
21 wakaba 1.23 if ($DEBUG) {
22 wakaba 1.25 my $not_found = {%{$Whatpm::HTML::Debug::cp or {}}};
23 wakaba 1.23 $Whatpm::HTML::Debug::cp_pass = sub {
24     my $id = shift;
25     delete $not_found->{$id};
26     };
27    
28     END {
29     for my $id (sort {$a <=> $b || $a cmp $b} keys %$not_found) {
30     print "# checkpoint $id is not reached\n";
31     }
32     }
33     }
34    
35 wakaba 1.39 my @FILES = grep {$_} split /\s+/, qq[
36 wakaba 1.12 ${test_dir_name}tokenizer-test-2.dat
37 wakaba 1.31 ${test_dir_name}tokenizer-test-3.dat
38 wakaba 1.2 ${dir_name}tests1.dat
39     ${dir_name}tests2.dat
40     ${dir_name}tests3.dat
41     ${dir_name}tests4.dat
42 wakaba 1.11 ${dir_name}tests5.dat
43     ${dir_name}tests6.dat
44 wakaba 1.27 ${dir_name}tests7.dat
45 wakaba 1.38 ${dir_name}tests8.dat
46     ${dir_name}tests9.dat
47     ${dir_name}tests10.dat
48     ${dir_name}tests11.dat
49     ${dir_name}tests12.dat
50 wakaba 1.2 ${test_dir_name}tree-test-1.dat
51 wakaba 1.14 ${test_dir_name}tree-test-2.dat
52 wakaba 1.29 ${test_dir_name}tree-test-3.dat
53 wakaba 1.34 ${test_dir_name}tree-test-void.dat
54 wakaba 1.35 ${test_dir_name}tree-test-flow.dat
55     ${test_dir_name}tree-test-phrasing.dat
56 wakaba 1.37 ${test_dir_name}tree-test-form.dat
57 wakaba 1.36 ${test_dir_name}tree-test-foreign.dat
58 wakaba 1.39 ];
59    
60     require 't/testfiles.pl';
61     execute_test ($_, {
62     errors => {is_list => 1},
63     shoulds => {is_list => 1},
64     document => {is_prefixed => 1},
65     'document-fragment' => {is_prefixed => 1},
66     }, \&test) for @FILES;
67 wakaba 1.1
68 wakaba 1.4 use Whatpm::HTML;
69     use Whatpm::NanoDOM;
70 wakaba 1.33 use Whatpm::Charset::UnicodeChecker;
71 wakaba 1.1
72     sub test ($) {
73     my $test = shift;
74    
75 wakaba 1.39 if ($test->{'document-fragment'}) {
76     if (@{$test->{'document-fragment'}->[1]}) {
77     ## NOTE: Old format.
78     $test->{element} = $test->{'document-fragment'}->[1]->[0];
79     $test->{document} ||= $test->{'document-fragment'};
80     } else {
81     ## NOTE: New format.
82     $test->{element} = $test->{'document-fragment'}->[0];
83     }
84     }
85    
86 wakaba 1.4 my $doc = Whatpm::NanoDOM::Document->new;
87 wakaba 1.1 my @errors;
88 wakaba 1.30 my @shoulds;
89 wakaba 1.1
90     $SIG{INT} = sub {
91 wakaba 1.3 print scalar serialize ($doc);
92 wakaba 1.1 exit;
93     };
94 wakaba 1.3
95 wakaba 1.5 my $onerror = sub {
96     my %opt = @_;
97 wakaba 1.30 if ($opt{level} eq 's') {
98     push @shoulds, join ':', $opt{line}, $opt{column}, $opt{type};
99     } else {
100     push @errors, join ':', $opt{line}, $opt{column}, $opt{type};
101     }
102 wakaba 1.5 };
103 wakaba 1.33
104     my $chk = sub {
105     return Whatpm::Charset::UnicodeChecker->new_handle ($_[0], 'html5');
106     }; # $chk
107    
108 wakaba 1.5 my $result;
109     unless (defined $test->{element}) {
110 wakaba 1.39 Whatpm::HTML->parse_char_string
111     ($test->{data}->[0] => $doc, $onerror, $chk);
112 wakaba 1.5 $result = serialize ($doc);
113     } else {
114     my $el = $doc->create_element_ns
115     ('http://www.w3.org/1999/xhtml', [undef, $test->{element}]);
116 wakaba 1.39 Whatpm::HTML->set_inner_html ($el, $test->{data}->[0], $onerror, $chk);
117 wakaba 1.5 $result = serialize ($el);
118     }
119 wakaba 1.39
120 wakaba 1.42 warn "No #errors section ($test->{data}->[0])" unless $test->{errors};
121 wakaba 1.5
122 wakaba 1.39 ok scalar @errors, scalar @{$test->{errors}->[0] or []},
123     'Parse error: ' . Data::Dumper::qquote ($test->{data}->[0]) . '; ' .
124     join (', ', @errors) . ';' . join (', ', @{$test->{errors}->[0] or []});
125     ok scalar @shoulds, scalar @{$test->{shoulds}->[0] or []},
126     'SHOULD-level error: ' . Data::Dumper::qquote ($test->{data}->[0]) . '; ' .
127     join (', ', @shoulds) . ';' . join (', ', @{$test->{shoulds}->[0] or []});
128 wakaba 1.1
129 wakaba 1.41 $test->{document}->[0] .= "\x0A" if length $test->{document}->[0];
130     ok $result, $test->{document}->[0],
131 wakaba 1.39 'Document tree: ' . Data::Dumper::qquote ($test->{data}->[0]);
132 wakaba 1.1 } # test
133    
134 wakaba 1.39 ## NOTE: Spec: <http://wiki.whatwg.org/wiki/Parser_tests>.
135 wakaba 1.1 sub serialize ($) {
136     my $node = shift;
137     my $r = '';
138    
139 wakaba 1.41 my $ns_id = {
140     q<http://www.w3.org/1999/xhtml> => 'html',
141     q<http://www.w3.org/2000/svg> => 'svg',
142     q<http://www.w3.org/1998/Math/MathML> => 'math',
143     q<http://www.w3.org/1999/xlink> => 'xlink',
144     q<http://www.w3.org/XML/1998/namespace> => 'xml',
145     q<http://www.w3.org/2002/xmlns/> => 'xmlns',
146     };
147    
148 wakaba 1.1 my @node = map { [$_, ''] } @{$node->child_nodes};
149     while (@node) {
150     my $child = shift @node;
151     my $nt = $child->[0]->node_type;
152     if ($nt == $child->[0]->ELEMENT_NODE) {
153 wakaba 1.41 my $ns = $child->[0]->namespace_uri;
154     unless (defined $ns) {
155     $ns = '{} ';
156     } elsif ($ns eq q<http://www.w3.org/1999/xhtml>) {
157     $ns = '';
158     } elsif ($ns_id->{$ns}) {
159     $ns = $ns_id->{$ns} . ' ';
160     } else {
161     $ns = '{' . $ns . '} ';
162     }
163     $r .= $child->[1] . '<' . $ns . $child->[0]->manakai_local_name . ">\x0A";
164 wakaba 1.1
165 wakaba 1.41 for my $attr (sort {$a->[0] cmp $b->[0]} map { [do {
166     my $ns = $_->namespace_uri;
167     unless (defined $ns) {
168     $ns = '';
169     } elsif ($ns_id->{$ns}) {
170     $ns = $ns_id->{$ns} . ' ';
171     } else {
172     $ns = '{' . $ns . '} ';
173     }
174     $ns . $_->manakai_local_name;
175     }, $_->value] }
176 wakaba 1.1 @{$child->[0]->attributes}) {
177 wakaba 1.39 $r .= $child->[1] . ' ' . $attr->[0] . '="'; ## ISSUE: case?
178 wakaba 1.1 $r .= $attr->[1] . '"' . "\x0A";
179     }
180    
181     unshift @node,
182     map { [$_, $child->[1] . ' '] } @{$child->[0]->child_nodes};
183     } elsif ($nt == $child->[0]->TEXT_NODE) {
184 wakaba 1.39 $r .= $child->[1] . '"' . $child->[0]->data . '"' . "\x0A";
185 wakaba 1.1 } elsif ($nt == $child->[0]->COMMENT_NODE) {
186 wakaba 1.39 $r .= $child->[1] . '<!-- ' . $child->[0]->data . " -->\x0A";
187 wakaba 1.1 } elsif ($nt == $child->[0]->DOCUMENT_TYPE_NODE) {
188 wakaba 1.39 $r .= $child->[1] . '<!DOCTYPE ' . $child->[0]->name;
189 wakaba 1.24 my $pubid = $child->[0]->public_id;
190     my $sysid = $child->[0]->system_id;
191 wakaba 1.40 if (length $pubid or length $sysid) {
192     $r .= ' "' . $pubid . '"';
193     $r .= ' "' . $sysid . '"';
194     }
195 wakaba 1.24 $r .= ">\x0A";
196 wakaba 1.1 } else {
197 wakaba 1.39 $r .= $child->[1] . $child->[0]->node_type . "\x0A"; # error
198 wakaba 1.1 }
199     }
200    
201     return $r;
202     } # serialize
203    
204     ## License: Public Domain.
205 wakaba 1.42 ## $Date: 2008/10/14 06:48:05 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24