/[suikacvs]/markup/html/whatpm/t/ContentChecker.t
Suika

Contents of /markup/html/whatpm/t/ContentChecker.t

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.23 - (hide annotations) (download) (as text)
Fri Nov 23 05:39:43 2007 UTC (17 years, 7 months ago) by wakaba
Branch: MAIN
Changes since 1.22: +4 -3 lines
File MIME type: application/x-troff
++ ChangeLog	23 Nov 2007 05:35:10 -0000
2007-11-23  Wakaba  <wakaba@suika.fam.cx>

	* readme.en.html: Whatpm::ContentChecker now depends
	on Message::Charset::Info.

++ whatpm/t/ChangeLog	23 Nov 2007 05:38:36 -0000
2007-11-23  Wakaba  <wakaba@suika.fam.cx>

	* ContentChecker.t: Unset |input_encoding| attribute.

	* content-model-1.dat, content-model-2.dat: New tests
	for |charset| attribute value are added.

++ whatpm/Whatpm/ChangeLog	23 Nov 2007 05:37:17 -0000
2007-11-23  Wakaba  <wakaba@suika.fam.cx>

	* NanoDOM.pm (input_encoding, manakai_charset, manakai_has_bom): New
	attributes.

	* ContentChecker.pm (check_document): Warn if charset requirements
	cannot be tested.

++ whatpm/Whatpm/ContentChecker/ChangeLog	23 Nov 2007 05:37:42 -0000
2007-11-23  Wakaba  <wakaba@suika.fam.cx>

	* HTML.pm (meta): |charset| value tests implemented.

1 wakaba 1.1 #!/usr/bin/perl
2     use strict;
3    
4     use Test;
5 wakaba 1.23 BEGIN { plan tests => 1448 }
6 wakaba 1.1
7 wakaba 1.5 my @FILES = qw[
8     t/content-model-1.dat
9     t/content-model-2.dat
10     t/content-model-3.dat
11 wakaba 1.13 t/content-model-4.dat
12 wakaba 1.15 t/table-1.dat
13 wakaba 1.19 t/content-model-atom-1.dat
14     t/content-model-atom-2.dat
15 wakaba 1.5 ];
16 wakaba 1.1
17     require Whatpm::ContentChecker;
18    
19     ## ISSUE: Currently we require manakai XML parser to test arbitrary XML tree.
20 wakaba 1.23 use lib qw[/home/wakaba/work/manakai2/lib];
21 wakaba 1.12 require Message::DOM::DOMImplementation;
22     require Message::DOM::XMLParserTemp;
23 wakaba 1.4 require Whatpm::HTML;
24     require Whatpm::NanoDOM;
25 wakaba 1.1
26 wakaba 1.20 my $dom = Message::DOM::DOMImplementation->new;
27 wakaba 1.1
28     for my $file_name (@FILES) {
29     open my $file, '<', $file_name or die "$0: $file_name: $!";
30 wakaba 1.19 print "# $file_name\n";
31 wakaba 1.1
32     my $test;
33     my $mode = 'data';
34     while (<$file>) {
35     s/\x0D\x0A/\x0A/;
36     if (/^#data$/) {
37     undef $test;
38     $test->{data} = '';
39     $mode = 'data';
40 wakaba 1.4 $test->{parse_as} = 'xml';
41     } elsif (/^#data html$/) {
42     undef $test;
43     $test->{data} = '';
44     $mode = 'data';
45     $test->{parse_as} = 'html';
46 wakaba 1.1 } elsif (/^#errors$/) {
47     $test->{errors} = [];
48     $mode = 'errors';
49     $test->{data} =~ s/\x0D?\x0A\z//;
50     } elsif (defined $test->{errors} and /^$/) {
51     test ($test);
52     undef $test;
53     } else {
54     if ($mode eq 'data') {
55     $test->{$mode} .= $_;
56     } elsif ($mode eq 'errors') {
57     tr/\x0D\x0A//d;
58     push @{$test->{errors}}, $_;
59     }
60     }
61     }
62     } # @FILES
63    
64     sub test ($) {
65     my $test = shift;
66    
67 wakaba 1.4 my $doc;
68     if ($test->{parse_as} eq 'xml') {
69 wakaba 1.12 open my $fh, '<', \($test->{data});
70     $doc = Message::DOM::XMLParserTemp->parse_byte_stream
71     ($fh => $dom, sub { }, charset => 'utf-8');
72 wakaba 1.23 $doc->input_encoding (undef);
73 wakaba 1.4 ## NOTE: There should be no well-formedness error; if there is,
74     ## then it is an error of the test case itself.
75     } else {
76     $doc = Whatpm::NanoDOM::Document->new;
77     Whatpm::HTML->parse_string ($test->{data} => $doc);
78     }
79 wakaba 1.1
80     my @error;
81 wakaba 1.10 Whatpm::ContentChecker->check_element
82 wakaba 1.1 ($doc->document_element, sub {
83     my %opt = @_;
84 wakaba 1.14 push @error, get_node_path ($opt{node}) . ';' . $opt{type} .
85     (defined $opt{level} ? ';'.$opt{level} : '');
86 wakaba 1.1 });
87    
88     ok join ("\n", sort {$a cmp $b} @error),
89     join ("\n", sort {$a cmp $b} @{$test->{errors}}), $test->{data};
90     } # test
91    
92     sub get_node_path ($) {
93     my $node = shift;
94     my @r;
95     while (defined $node) {
96     my $rs;
97     if ($node->node_type == 1) {
98     $rs = $node->manakai_local_name;
99 wakaba 1.4 $node = $node->parent_node;
100 wakaba 1.3 } elsif ($node->node_type == 2) {
101     $rs = '@' . $node->manakai_local_name;
102 wakaba 1.4 $node = $node->owner_element;
103 wakaba 1.1 } elsif ($node->node_type == 3) {
104     $rs = '"' . $node->data . '"';
105 wakaba 1.4 $node = $node->parent_node;
106 wakaba 1.1 } elsif ($node->node_type == 9) {
107     $rs = '';
108 wakaba 1.4 $node = $node->parent_node;
109 wakaba 1.1 } else {
110     $rs = '#' . $node->node_type;
111 wakaba 1.4 $node = $node->parent_node;
112 wakaba 1.1 }
113     unshift @r, $rs;
114     }
115     return join '/', @r;
116     } # get_node_path
117    
118     ## License: Public Domain.
119 wakaba 1.23 ## $Date: 2007/11/11 02:25:51 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24