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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by wakaba, Mon Apr 30 14:12:02 2007 UTC revision 1.36 by wakaba, Sat Oct 4 11:32:16 2008 UTC
# Line 1  Line 1 
1  #!/usr/bin/perl  #!/usr/bin/perl
2  use strict;  use strict;
3    
4    my $DEBUG = $ENV{DEBUG};
5    
6    use lib qw[/home/wakaba/work/manakai2/lib];
7    
8  my $dir_name;  my $dir_name;
9    my $test_dir_name;
10  BEGIN {  BEGIN {
11    my $test_dir_name = 't/';    $test_dir_name = 't/';
12    $dir_name = 't/tree-construction/';    $dir_name = 't/tree-construction/';
13    my $skip = "You don't have make command";    my $skip = "You don't have make command";
14    eval q{    eval q{
# Line 19  BEGIN { Line 24  BEGIN {
24  }  }
25    
26  use Test;  use Test;
27  BEGIN { plan tests => 67 }  BEGIN { plan tests => 3105 }
28    
29  use Data::Dumper;  use Data::Dumper;
30  $Data::Dumper::Useqq = 1;  $Data::Dumper::Useqq = 1;
# Line 29  sub Data::Dumper::qquote { Line 34  sub Data::Dumper::qquote {
34    return q<qq'> . $s . q<'>;    return q<qq'> . $s . q<'>;
35  } # Data::Dumper::qquote  } # Data::Dumper::qquote
36    
37  for my $file_name (qw[  
38                        tests1.dat  if ($DEBUG) {
39                        tests2.dat    my $not_found = {%{$Whatpm::HTML::Debug::cp or {}}};
40                        tests3.dat    $Whatpm::HTML::Debug::cp_pass = sub {
41                        tests4.dat      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    for my $file_name (grep {$_} split /\s+/, qq[
53                          ${test_dir_name}tokenizer-test-2.dat
54                          ${test_dir_name}tokenizer-test-3.dat
55                          ${dir_name}tests1.dat
56                          ${dir_name}tests2.dat
57                          ${dir_name}tests3.dat
58                          ${dir_name}tests4.dat
59                          ${dir_name}tests5.dat
60                          ${dir_name}tests6.dat
61                          ${dir_name}tests7.dat
62                          ${test_dir_name}tree-test-1.dat
63                          ${test_dir_name}tree-test-2.dat
64                          ${test_dir_name}tree-test-3.dat
65                          ${test_dir_name}tree-test-void.dat
66                          ${test_dir_name}tree-test-flow.dat
67                          ${test_dir_name}tree-test-phrasing.dat
68                          ${test_dir_name}tree-test-foreign.dat
69                       ]) {                       ]) {
70    open my $file, '<', $dir_name.$file_name    open my $file, '<', $file_name
71      or die "$0: $dir_name$file_name: $!";      or die "$0: $file_name: $!";
72      print "# $file_name\n";
73    
74    my $test;    my $test;
75    my $mode = 'data';    my $mode = 'data';
76      my $escaped;
77    while (<$file>) {    while (<$file>) {
78      s/\x0D\x0A/\x0A/;      s/\x0D\x0A/\x0A/;
79      if (/^#data$/) {      if (/^#data$/) {
80        undef $test;        undef $test;
81        $test->{data} = '';        $test->{data} = '';
82        $mode = 'data';        $mode = 'data';
83          undef $escaped;
84        } elsif (/^#data escaped$/) {
85          undef $test;
86          $test->{data} = '';
87          $mode = 'data';
88          $escaped = 1;
89      } elsif (/^#errors$/) {      } elsif (/^#errors$/) {
90        $test->{errors} = [];        $test->{errors} = [];
91        $mode = 'errors';        $mode = 'errors';
92        $test->{data} =~ s/\x0D?\x0A\z//;              $test->{data} =~ s/\x0D?\x0A\z//;      
93          $test->{data} =~ s/\\u([0-9A-Fa-f]{4})/chr hex $1/ge if $escaped;
94          $test->{data} =~ s/\\U([0-9A-Fa-f]{8})/chr hex $1/ge if $escaped;
95          undef $escaped;
96        } elsif (/^#shoulds$/) {
97          $test->{shoulds} = [];
98          $mode = 'shoulds';
99      } elsif (/^#document$/) {      } elsif (/^#document$/) {
100        $test->{document} = '';        $test->{document} = '';
101        $mode = 'document';        $mode = 'document';
102      } elsif (/^$/) {        undef $escaped;
103        test ($test) if $test->{errors};      } elsif (/^#document escaped$/) {
104          $test->{document} = '';
105          $mode = 'document';
106          $escaped = 1;
107        } elsif (/^#document-fragment$/) {
108          $test->{element} = '';
109          $mode = 'element';
110          undef $escaped;
111        } elsif (/^#document-fragment (\S+)$/) {
112          $test->{document} = '';
113          $mode = 'document';
114          $test->{element} = $1;
115          undef $escaped;
116        } elsif (/^#document-fragment (\S+) escaped$/) {
117          $test->{document} = '';
118          $mode = 'document';
119          $test->{element} = $1;
120          $escaped = 1;
121        } elsif (defined $test->{document} and /^$/) {
122          $test->{document} =~ s/\\u([0-9A-Fa-f]{4})/chr hex $1/ge if $escaped;
123          $test->{document} =~ s/\\U([0-9A-Fa-f]{8})/chr hex $1/ge if $escaped;
124          test ($test);
125        undef $test;        undef $test;
126      } else {      } else {
127        if ($mode eq 'data' or $mode eq 'document') {        if ($mode eq 'data' or $mode eq 'document') {
128          $test->{$mode} .= $_;          $test->{$mode} .= $_;
129          } elsif ($mode eq 'element') {
130            tr/\x0D\x0A//d;
131            $test->{$mode} .= $_;
132        } elsif ($mode eq 'errors') {        } elsif ($mode eq 'errors') {
133          tr/\x0D\x0A//d;          tr/\x0D\x0A//d;
134          push @{$test->{errors}}, $_;          push @{$test->{errors}}, $_;
135          } elsif ($mode eq 'shoulds') {
136            tr/\x0D\x0A//d;
137            push @{$test->{shoulds}}, $_;
138        }        }
139      }      }
140    }    }
141    test ($test) if $test->{errors};    test ($test) if $test->{errors};
142  }  }
143    
144  use What::HTML;  use Whatpm::HTML;
145    use Whatpm::NanoDOM;
146    use Whatpm::Charset::UnicodeChecker;
147    
148  sub test ($) {  sub test ($) {
149    my $test = shift;    my $test = shift;
150    
151    my $s = $test->{data};    my $doc = Whatpm::NanoDOM::Document->new;
   
   my $p = What::HTML->new;  
   my $i = 0;  
   $p->{set_next_input_character} = sub {  
     my $self = shift;  
     $self->{next_input_character} = -1 and return if $i >= length $s;  
     $self->{next_input_character} = ord substr $s, $i++, 1;  
       
     if ($self->{next_input_character} == 0x000D) { # CR  
       if ($i >= length $s) {  
         #  
       } else {  
         my $next_char = ord substr $s, $i++, 1;  
         if ($next_char == 0x000A) { # LF  
           #  
         } else {  
           push @{$self->{char}}, $next_char;  
         }  
       }  
       $self->{next_input_character} = 0x000A; # LF # MUST  
     } elsif ($self->{next_input_character} > 0x10FFFF) {  
       $self->{next_input_character} = 0xFFFD; # REPLACEMENT CHARACTER # MUST  
     } elsif ($self->{next_input_character} == 0x0000) { # NULL  
       $self->{next_input_character} = 0xFFFD; # REPLACEMENT CHARACTER # MUST  
     }  
   };  
     
152    my @errors;    my @errors;
153    $p->{parse_error} = sub {    my @shoulds;
     my $msg = shift;  
     push @errors, $msg;  
   };  
154        
155    $SIG{INT} = sub {    $SIG{INT} = sub {
156      print scalar serialize ($p->{document});      print scalar serialize ($doc);
157      exit;      exit;
158    };    };
     
   $p->_initialize_tokenizer;  
   $p->_initialize_tree_constructor;  
   $p->_construct_tree;  
   $p->_terminate_tree_constructor;  
159    
160      my $onerror = sub {
161        my %opt = @_;
162        if ($opt{level} eq 's') {
163          push @shoulds, join ':', $opt{line}, $opt{column}, $opt{type};
164        } else {
165          push @errors, join ':', $opt{line}, $opt{column}, $opt{type};
166        }
167      };
168    
169      my $chk = sub {
170        return Whatpm::Charset::UnicodeChecker->new_handle ($_[0], 'html5');
171      }; # $chk
172    
173      my $result;
174      unless (defined $test->{element}) {
175        Whatpm::HTML->parse_char_string ($test->{data} => $doc, $onerror, $chk);
176        $result = serialize ($doc);
177      } else {
178        my $el = $doc->create_element_ns
179          ('http://www.w3.org/1999/xhtml', [undef, $test->{element}]);
180        Whatpm::HTML->set_inner_html ($el, $test->{data}, $onerror, $chk);
181        $result = serialize ($el);
182      }
183        
184    ok scalar @errors, scalar @{$test->{errors}},    ok scalar @errors, scalar @{$test->{errors}},
185      'Parse error: ' . $test->{data} . '; ' .      'Parse error: ' . Data::Dumper::qquote ($test->{data}) . '; ' .
186      join (', ', @errors) . ';' . join (', ', @{$test->{errors}});      join (', ', @errors) . ';' . join (', ', @{$test->{errors}});
187      ok scalar @shoulds, scalar @{$test->{shoulds} or []},
188        'SHOULD-level error: ' . Data::Dumper::qquote ($test->{data}) . '; ' .
189        join (', ', @shoulds) . ';' . join (', ', @{$test->{shoulds} or []});
190    
191    my $doc = $p->{document};    ok $result, $test->{document},
192    my $doc_s = serialize ($doc);        'Document tree: ' . Data::Dumper::qquote ($test->{data});
   ok $doc_s, $test->{document}, 'Document tree: ' . $test->{data};  
193  } # test  } # test
194    
195  sub serialize ($) {  sub serialize ($) {
# Line 137  sub serialize ($) { Line 203  sub serialize ($) {
203      if ($nt == $child->[0]->ELEMENT_NODE) {      if ($nt == $child->[0]->ELEMENT_NODE) {
204        $r .= '| ' . $child->[1] . '<' . $child->[0]->tag_name . ">\x0A"; ## ISSUE: case?        $r .= '| ' . $child->[1] . '<' . $child->[0]->tag_name . ">\x0A"; ## ISSUE: case?
205    
206        for my $attr (sort {$a->[1] cmp $b->[1]} map { [$_->name, $_->value] }        for my $attr (sort {$a->[0] cmp $b->[0]} map { [$_->name, $_->value] }
207                      @{$child->[0]->attributes}) {                      @{$child->[0]->attributes}) {
208          $r .= '| ' . $child->[1] . '  ' . $attr->[0] . '="'; ## ISSUE: case?          $r .= '| ' . $child->[1] . '  ' . $attr->[0] . '="'; ## ISSUE: case?
209          $r .= $attr->[1] . '"' . "\x0A";          $r .= $attr->[1] . '"' . "\x0A";
# Line 150  sub serialize ($) { Line 216  sub serialize ($) {
216      } elsif ($nt == $child->[0]->COMMENT_NODE) {      } elsif ($nt == $child->[0]->COMMENT_NODE) {
217        $r .= '| ' . $child->[1] . '<!-- ' . $child->[0]->data . " -->\x0A";        $r .= '| ' . $child->[1] . '<!-- ' . $child->[0]->data . " -->\x0A";
218      } elsif ($nt == $child->[0]->DOCUMENT_TYPE_NODE) {      } elsif ($nt == $child->[0]->DOCUMENT_TYPE_NODE) {
219        $r .= '| ' . $child->[1] . '<!DOCTYPE ' . $child->[0]->name . ">\x0A";        $r .= '| ' . $child->[1] . '<!DOCTYPE ' . $child->[0]->name;
220          my $pubid = $child->[0]->public_id;
221          $r .= ' PUBLIC "' . $pubid . '"' if length $pubid;
222          my $sysid = $child->[0]->system_id;
223          $r .= ' SYSTEM' if not length $pubid and length $sysid;
224          $r .= ' "' . $sysid . '"' if length $sysid;
225          $r .= ">\x0A";
226      } else {      } else {
227        $r .= '| ' . $child->[1] . $child->[0]->node_type . "\x0A"; # error        $r .= '| ' . $child->[1] . $child->[0]->node_type . "\x0A"; # error
228      }      }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.36

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24