/[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.33 - (hide annotations) (download) (as text)
Mon Sep 15 07:19:03 2008 UTC (16 years, 10 months ago) by wakaba
Branch: MAIN
Changes since 1.32: +11 -3 lines
File MIME type: application/x-troff
++ whatpm/Whatpm/ChangeLog	15 Sep 2008 07:17:34 -0000
	* HTML.pm.src: Remove checking for control character, surrogate
	pair, or noncharacter code points and non-Unicode code
	points (they should be handled by Whatpm::Charset::UnicodeChecker).
	(parse_char_stream): Support for the |$get_wrapper| argument and
	character stream error handlers.

2008-09-15  Wakaba  <wakaba@suika.fam.cx>

++ whatpm/Whatpm/Charset/ChangeLog	15 Sep 2008 07:18:45 -0000
	* DecodeHandle.pm (onerror): Return |undef| if no explicit value
	is set.

	* UnicodeChecker.pm: Support for HTML5 parse errors.
	(onerror): Return |undef| if no explicit value is set.

2008-09-15  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.33
8 wakaba 1.1 my $dir_name;
9 wakaba 1.2 my $test_dir_name;
10 wakaba 1.1 BEGIN {
11 wakaba 1.2 $test_dir_name = 't/';
12 wakaba 1.1 $dir_name = 't/tree-construction/';
13     my $skip = "You don't have make command";
14     eval q{
15     system ("cd $test_dir_name; make tree-construction-files") == 0 or die
16     unless -f $dir_name.'tests1.dat';
17     $skip = '';
18     };
19     if ($skip) {
20     print "1..1\n";
21     print "ok 1 # $skip\n";
22     exit;
23     }
24     }
25    
26     use Test;
27 wakaba 1.30 BEGIN { plan tests => 3105 }
28 wakaba 1.1
29     use Data::Dumper;
30     $Data::Dumper::Useqq = 1;
31     sub Data::Dumper::qquote {
32     my $s = shift;
33     $s =~ s/([^\x20\x21-\x26\x28-\x5B\x5D-\x7E])/sprintf '\x{%02X}', ord $1/ge;
34     return q<qq'> . $s . q<'>;
35     } # Data::Dumper::qquote
36    
37 wakaba 1.23
38     if ($DEBUG) {
39 wakaba 1.25 my $not_found = {%{$Whatpm::HTML::Debug::cp or {}}};
40 wakaba 1.23 $Whatpm::HTML::Debug::cp_pass = sub {
41     my $id = shift;
42     delete $not_found->{$id};
43     };
44    
45     END {
46     for my $id (sort {$a <=> $b || $a cmp $b} keys %$not_found) {
47     print "# checkpoint $id is not reached\n";
48     }
49     }
50     }
51    
52 wakaba 1.2 for my $file_name (grep {$_} split /\s+/, qq[
53 wakaba 1.12 ${test_dir_name}tokenizer-test-2.dat
54 wakaba 1.31 ${test_dir_name}tokenizer-test-3.dat
55 wakaba 1.2 ${dir_name}tests1.dat
56     ${dir_name}tests2.dat
57     ${dir_name}tests3.dat
58     ${dir_name}tests4.dat
59 wakaba 1.11 ${dir_name}tests5.dat
60     ${dir_name}tests6.dat
61 wakaba 1.27 ${dir_name}tests7.dat
62 wakaba 1.2 ${test_dir_name}tree-test-1.dat
63 wakaba 1.14 ${test_dir_name}tree-test-2.dat
64 wakaba 1.29 ${test_dir_name}tree-test-3.dat
65 wakaba 1.1 ]) {
66 wakaba 1.2 open my $file, '<', $file_name
67     or die "$0: $file_name: $!";
68 wakaba 1.13 print "# $file_name\n";
69 wakaba 1.1
70     my $test;
71     my $mode = 'data';
72 wakaba 1.12 my $escaped;
73 wakaba 1.1 while (<$file>) {
74     s/\x0D\x0A/\x0A/;
75     if (/^#data$/) {
76     undef $test;
77     $test->{data} = '';
78     $mode = 'data';
79 wakaba 1.12 undef $escaped;
80     } elsif (/^#data escaped$/) {
81     undef $test;
82     $test->{data} = '';
83     $mode = 'data';
84     $escaped = 1;
85 wakaba 1.1 } elsif (/^#errors$/) {
86     $test->{errors} = [];
87     $mode = 'errors';
88 wakaba 1.13 $test->{data} =~ s/\x0D?\x0A\z//;
89     $test->{data} =~ s/\\u([0-9A-Fa-f]{4})/chr hex $1/ge if $escaped;
90 wakaba 1.24 $test->{data} =~ s/\\U([0-9A-Fa-f]{8})/chr hex $1/ge if $escaped;
91 wakaba 1.12 undef $escaped;
92 wakaba 1.30 } elsif (/^#shoulds$/) {
93     $test->{shoulds} = [];
94     $mode = 'shoulds';
95 wakaba 1.1 } elsif (/^#document$/) {
96     $test->{document} = '';
97     $mode = 'document';
98 wakaba 1.12 undef $escaped;
99     } elsif (/^#document escaped$/) {
100     $test->{document} = '';
101     $mode = 'document';
102     $escaped = 1;
103 wakaba 1.19 } elsif (/^#document-fragment$/) {
104     $test->{element} = '';
105     $mode = 'element';
106     undef $escaped;
107 wakaba 1.5 } elsif (/^#document-fragment (\S+)$/) {
108     $test->{document} = '';
109     $mode = 'document';
110     $test->{element} = $1;
111 wakaba 1.12 undef $escaped;
112     } elsif (/^#document-fragment (\S+) escaped$/) {
113     $test->{document} = '';
114     $mode = 'document';
115     $test->{element} = $1;
116     $escaped = 1;
117 wakaba 1.2 } elsif (defined $test->{document} and /^$/) {
118 wakaba 1.13 $test->{document} =~ s/\\u([0-9A-Fa-f]{4})/chr hex $1/ge if $escaped;
119 wakaba 1.24 $test->{document} =~ s/\\U([0-9A-Fa-f]{8})/chr hex $1/ge if $escaped;
120 wakaba 1.2 test ($test);
121 wakaba 1.1 undef $test;
122     } else {
123     if ($mode eq 'data' or $mode eq 'document') {
124 wakaba 1.13 $test->{$mode} .= $_;
125 wakaba 1.19 } elsif ($mode eq 'element') {
126     tr/\x0D\x0A//d;
127     $test->{$mode} .= $_;
128 wakaba 1.1 } elsif ($mode eq 'errors') {
129     tr/\x0D\x0A//d;
130     push @{$test->{errors}}, $_;
131 wakaba 1.30 } elsif ($mode eq 'shoulds') {
132     tr/\x0D\x0A//d;
133     push @{$test->{shoulds}}, $_;
134 wakaba 1.1 }
135     }
136     }
137     test ($test) if $test->{errors};
138     }
139    
140 wakaba 1.4 use Whatpm::HTML;
141     use Whatpm::NanoDOM;
142 wakaba 1.33 use Whatpm::Charset::UnicodeChecker;
143 wakaba 1.1
144     sub test ($) {
145     my $test = shift;
146    
147 wakaba 1.4 my $doc = Whatpm::NanoDOM::Document->new;
148 wakaba 1.1 my @errors;
149 wakaba 1.30 my @shoulds;
150 wakaba 1.1
151     $SIG{INT} = sub {
152 wakaba 1.3 print scalar serialize ($doc);
153 wakaba 1.1 exit;
154     };
155 wakaba 1.3
156 wakaba 1.5 my $onerror = sub {
157     my %opt = @_;
158 wakaba 1.30 if ($opt{level} eq 's') {
159     push @shoulds, join ':', $opt{line}, $opt{column}, $opt{type};
160     } else {
161     push @errors, join ':', $opt{line}, $opt{column}, $opt{type};
162     }
163 wakaba 1.5 };
164 wakaba 1.33
165     my $chk = sub {
166     return Whatpm::Charset::UnicodeChecker->new_handle ($_[0], 'html5');
167     }; # $chk
168    
169 wakaba 1.5 my $result;
170     unless (defined $test->{element}) {
171 wakaba 1.33 Whatpm::HTML->parse_char_string ($test->{data} => $doc, $onerror, $chk);
172 wakaba 1.5 $result = serialize ($doc);
173     } else {
174     my $el = $doc->create_element_ns
175     ('http://www.w3.org/1999/xhtml', [undef, $test->{element}]);
176 wakaba 1.33 Whatpm::HTML->set_inner_html ($el, $test->{data}, $onerror, $chk);
177 wakaba 1.5 $result = serialize ($el);
178     }
179    
180 wakaba 1.1 ok scalar @errors, scalar @{$test->{errors}},
181 wakaba 1.21 'Parse error: ' . Data::Dumper::qquote ($test->{data}) . '; ' .
182 wakaba 1.1 join (', ', @errors) . ';' . join (', ', @{$test->{errors}});
183 wakaba 1.30 ok scalar @shoulds, scalar @{$test->{shoulds} or []},
184     'SHOULD-level error: ' . Data::Dumper::qquote ($test->{data}) . '; ' .
185     join (', ', @shoulds) . ';' . join (', ', @{$test->{shoulds} or []});
186 wakaba 1.1
187 wakaba 1.21 ok $result, $test->{document},
188     'Document tree: ' . Data::Dumper::qquote ($test->{data});
189 wakaba 1.1 } # test
190    
191     sub serialize ($) {
192     my $node = shift;
193     my $r = '';
194    
195     my @node = map { [$_, ''] } @{$node->child_nodes};
196     while (@node) {
197     my $child = shift @node;
198     my $nt = $child->[0]->node_type;
199     if ($nt == $child->[0]->ELEMENT_NODE) {
200     $r .= '| ' . $child->[1] . '<' . $child->[0]->tag_name . ">\x0A"; ## ISSUE: case?
201    
202 wakaba 1.2 for my $attr (sort {$a->[0] cmp $b->[0]} map { [$_->name, $_->value] }
203 wakaba 1.1 @{$child->[0]->attributes}) {
204     $r .= '| ' . $child->[1] . ' ' . $attr->[0] . '="'; ## ISSUE: case?
205     $r .= $attr->[1] . '"' . "\x0A";
206     }
207    
208     unshift @node,
209     map { [$_, $child->[1] . ' '] } @{$child->[0]->child_nodes};
210     } elsif ($nt == $child->[0]->TEXT_NODE) {
211     $r .= '| ' . $child->[1] . '"' . $child->[0]->data . '"' . "\x0A";
212     } elsif ($nt == $child->[0]->COMMENT_NODE) {
213     $r .= '| ' . $child->[1] . '<!-- ' . $child->[0]->data . " -->\x0A";
214     } elsif ($nt == $child->[0]->DOCUMENT_TYPE_NODE) {
215 wakaba 1.24 $r .= '| ' . $child->[1] . '<!DOCTYPE ' . $child->[0]->name;
216     my $pubid = $child->[0]->public_id;
217     $r .= ' PUBLIC "' . $pubid . '"' if length $pubid;
218     my $sysid = $child->[0]->system_id;
219     $r .= ' SYSTEM' if not length $pubid and length $sysid;
220     $r .= ' "' . $sysid . '"' if length $sysid;
221     $r .= ">\x0A";
222 wakaba 1.1 } else {
223     $r .= '| ' . $child->[1] . $child->[0]->node_type . "\x0A"; # error
224     }
225     }
226    
227     return $r;
228     } # serialize
229    
230     ## License: Public Domain.
231 wakaba 1.33 ## $Date: 2008/09/14 09:05:55 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24