/[suikacvs]/markup/html/whatpm/t/XML-Parser.t
Suika

Contents of /markup/html/whatpm/t/XML-Parser.t

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.10 - (hide annotations) (download) (as text)
Thu Oct 16 03:39:57 2008 UTC (16 years, 9 months ago) by wakaba
Branch: MAIN
Changes since 1.9: +3 -1 lines
File MIME type: application/x-troff
++ whatpm/t/ChangeLog	16 Oct 2008 03:39:39 -0000
2008-10-16  Wakaba  <wakaba@suika.fam.cx>

	* XML-Parser.t: "xml/pis-2.dat" and "xml/comments-2.dat" are added.

++ whatpm/t/xml/ChangeLog	16 Oct 2008 03:39:53 -0000
2008-10-16  Wakaba  <wakaba@suika.fam.cx>

	* doctypes-2.dat: New test added.

	* comments-2.dat, pis-2.dat: New test data files.

++ whatpm/Whatpm/HTML/ChangeLog	16 Oct 2008 03:36:51 -0000
2008-10-16  Wakaba  <wakaba@suika.fam.cx>

	* Tokenizer.pm.src: New token type END_OF_DOCTYPE_TOKEN added.
	New states DOCTYPE_TAG_STATE and
	BOGUS_DOCTYPE_INTERNAL_SUBSET_AFTER_STATE are added.  (Bogus
	string after the internal subset, which was handled by the state
	BOGUS_DOCTYPE_STATE, are now handled by the new state.)  Support
	for comments, bogus comments, and processing instructions in the
	internal subset.  If there is the internal subset, then emit the
	doctype token before the internal subset (with its
	$token->{has_internal_subset} flag set) and an
	END_OF_DOCTYPE_TOKEN after the internal subset.

++ whatpm/Whatpm/XML/ChangeLog	16 Oct 2008 03:39:19 -0000
2008-10-16  Wakaba  <wakaba@suika.fam.cx>

	* Parser.pm.src: Insertion mode IN_SUBSET_IM added.  In the
	"initial" insertion mode, if the DOCTYPE token's "has internal
	subset" flag is set, then switch to the "in subset" insertion
	mode.

1 wakaba 1.1 #!/usr/bin/perl
2     use strict;
3    
4     my $DEBUG = $ENV{DEBUG};
5    
6     use lib qw[/home/wakaba/work/manakai2/lib];
7     my $test_dir_name = 't/xml/';
8    
9     use Test;
10     BEGIN { plan tests => 4935 }
11    
12     use Data::Dumper;
13     $Data::Dumper::Useqq = 1;
14     sub Data::Dumper::qquote {
15     my $s = shift;
16     $s =~ s/([^\x20\x21-\x26\x28-\x5B\x5D-\x7E])/sprintf '\x{%02X}', ord $1/ge;
17     return q<qq'> . $s . q<'>;
18     } # Data::Dumper::qquote
19    
20     if ($DEBUG) {
21     my $not_found = {%{$Whatpm::HTML::Debug::cp or {}}};
22     $Whatpm::HTML::Debug::cp_pass = sub {
23     my $id = shift;
24     delete $not_found->{$id};
25     };
26    
27     END {
28     for my $id (sort {$a <=> $b || $a cmp $b} keys %$not_found) {
29     print "# checkpoint $id is not reached\n";
30     }
31     }
32     }
33    
34     use Whatpm::XML::Parser;
35     use Whatpm::NanoDOM;
36     use Whatpm::Charset::UnicodeChecker;
37     use Whatpm::HTML::Dumper qw/dumptree/;
38    
39     sub test ($) {
40     my $test = shift;
41    
42     if ($test->{'document-fragment'}) {
43     if (@{$test->{'document-fragment'}->[1]}) {
44     ## NOTE: Old format.
45     $test->{element} = $test->{'document-fragment'}->[1]->[0];
46     $test->{document} ||= $test->{'document-fragment'};
47     } else {
48     ## NOTE: New format.
49     $test->{element} = $test->{'document-fragment'}->[0];
50     }
51     }
52    
53     my $doc = Whatpm::NanoDOM::Document->new;
54     my @errors;
55    
56     $SIG{INT} = sub {
57     print scalar dumptree ($doc);
58     exit;
59     };
60    
61     my $onerror = sub {
62     my %opt = @_;
63     push @errors, join ';',
64     $opt{token}->{line} || $opt{line},
65     $opt{token}->{column} || $opt{column},
66     $opt{type},
67     defined $opt{text} ? $opt{text} : '',
68     defined $opt{value} ? $opt{value} : '',
69     $opt{level};
70     };
71    
72     my $chk = sub {
73     return $_[0];
74     #return Whatpm::Charset::UnicodeChecker->new_handle ($_[0], 'html5');
75     }; # $chk
76    
77     my $result;
78     unless (defined $test->{element}) {
79     Whatpm::XML::Parser->parse_char_string
80     ($test->{data}->[0] => $doc, $onerror, $chk);
81     $result = dumptree ($doc);
82     } else {
83     ## TODO: ...
84     my $el = $doc->create_element_ns
85     ('http://www.w3.org/1999/xhtml', [undef, $test->{element}]);
86     Whatpm::HTML->set_inner_html ($el, $test->{data}->[0], $onerror, $chk);
87     $result = dumptree ($el);
88     }
89    
90     warn "No #errors section ($test->{data}->[0])" unless $test->{errors};
91 wakaba 1.5
92     @errors = sort {$a cmp $b} @errors;
93     @{$test->{errors}->[0]} = sort {$a cmp $b} @{$test->{errors}->[0] ||= []};
94 wakaba 1.1
95     ok join ("\n", @errors), join ("\n", @{$test->{errors}->[0] or []}),
96 wakaba 1.7 'Parse error: ' . Data::Dumper::qquote ($test->{data}->[0]);
97    
98     if ($test->{'xml-version'}) {
99     ok $doc->xml_version, $test->{'xml-version'}->[0],
100     'XML version: ' . Data::Dumper::qquote ($test->{data}->[0]);
101     }
102    
103     if ($test->{'xml-encoding'}) {
104     if ($test->{'xml-encoding'}->[1]->[0] eq 'null') {
105     ok $doc->xml_encoding, undef,
106     'XML encoding: ' . Data::Dumper::qquote ($test->{data}->[0]);
107     } else {
108     ok $doc->xml_encoding, $test->{'xml-encoding'}->[0],
109     'XML encoding: ' . Data::Dumper::qquote ($test->{data}->[0]);
110     }
111     }
112    
113     if ($test->{'xml-standalone'}) {
114     ok $doc->xml_standalone ? 1 : 0,
115     $test->{'xml-standalone'}->[1]->[0] eq 'true' ? 1 : 0,
116     'XML standalone: ' . Data::Dumper::qquote ($test->{data}->[0]);
117     }
118 wakaba 1.1
119     $test->{document}->[0] .= "\x0A" if length $test->{document}->[0];
120     ok $result, $test->{document}->[0],
121     'Document tree: ' . Data::Dumper::qquote ($test->{data}->[0]);
122     } # test
123    
124     my @FILES = grep {$_} split /\s+/, qq[
125 wakaba 1.4 ${test_dir_name}elements-1.dat
126 wakaba 1.5 ${test_dir_name}attrs-1.dat
127     ${test_dir_name}texts-1.dat
128 wakaba 1.2 ${test_dir_name}cdata-1.dat
129 wakaba 1.6 ${test_dir_name}charref-1.dat
130 wakaba 1.10 ${test_dir_name}comments-2.dat
131 wakaba 1.7 ${test_dir_name}pis-1.dat
132 wakaba 1.10 ${test_dir_name}pis-2.dat
133 wakaba 1.7 ${test_dir_name}xmldecls-1.dat
134 wakaba 1.2 ${test_dir_name}tree-1.dat
135 wakaba 1.8 ${test_dir_name}ns-elements-1.dat
136 wakaba 1.3 ${test_dir_name}ns-attrs-1.dat
137 wakaba 1.4 ${test_dir_name}doctypes-1.dat
138 wakaba 1.9 ${test_dir_name}doctypes-2.dat
139 wakaba 1.2 ];
140 wakaba 1.1
141     require 't/testfiles.pl';
142     execute_test ($_, {
143     errors => {is_list => 1},
144     document => {is_prefixed => 1},
145     'document-fragment' => {is_prefixed => 1},
146     }, \&test) for @FILES;
147    
148     ## License: Public Domain.
149 wakaba 1.10 ## $Date: 2008/10/15 12:49:49 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24