summaryrefslogtreecommitdiff
path: root/t/parament.t
blob: 0a042773a8033acd72713c60fbd13539e836dcbb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
BEGIN {print "1..12\n";}
END {print "not ok 1\n" unless $loaded;}
use XML::Parser;
$loaded = 1;
print "ok 1\n";

my $internal_subset =<<'End_of_internal;';
[
  <!ENTITY % foo "IGNORE">
  <!ENTITY % bar "INCLUDE">
  <!ENTITY more SYSTEM "t/ext2.ent">
]
End_of_internal;

my $doc =<<"End_of_doc;";
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo SYSTEM "t/foo.dtd"
$internal_subset>
<foo>Happy, happy
<bar>&joy;, &joy;</bar>
<ext/>
&more;
</foo>
End_of_doc;

my $gotinclude = 0;
my $gotignore = 0;
my $doctype_called = 0;
my $internal_exists = 0;
my $gotmore = 0;

my $bartxt = '';

sub start {
  my ($xp, $el, %atts) = @_;

  if ($el eq 'foo') {
    print "not " if defined($atts{top});
    print "ok 2\n";
    print "not " unless defined($atts{zz});
    print "ok 3\n";
  }
  elsif ($el eq 'bar') {
    print "not " unless (defined $atts{xyz} and $atts{xyz} eq 'b');
    print "ok 4\n";
  }
  elsif ($el eq 'ext') {
    print "not " unless (defined $atts{type} and $atts{type} eq 'flag');
    print "ok 5\n";
  }
  elsif ($el eq 'more') {
    $gotmore = 1;
  }
}

sub char {
  my ($xp, $text) = @_;

  $bartxt .= $text if $xp->current_element eq 'bar';
}

sub attl {
  my ($xp, $el, $att, $type, $dflt, $fixed) = @_;

  $gotinclude = 1 if ($el eq 'bar' and $att eq 'xyz' and $dflt eq "'b'");
  $gotignore = 1 if ($el eq 'foo' and $att eq 'top' and $dflt eq '"hello"');
}

sub dtd {
  my ($xp, $name, $sysid, $pubid, $internal) = @_;

  $doctype_called = 1;
  $internal_exists = $internal;
}

$p = new XML::Parser(ParseParamEnt => 1,
		     ErrorContext  => 2,
		     Handlers => {Start   => \&start,
				  Char    => \&char,
				  Attlist => \&attl,
				  Doctype => \&dtd
				 }
		    );

$p->parse($doc);

print "not " unless $gotmore;
print "ok 6\n";

print "not " unless $bartxt eq ($] < 5.006)
		? "\xe5\x83\x96, \xe5\x83\x96"
		: chr(0x50d6). ", " . chr(0x50d6);
print "ok 7\n";

print "not " unless $gotinclude;
print "ok 8\n";

print "not " if $gotignore;
print "ok 9\n";

print "not " unless $doctype_called;
print "ok 10\n";

print "not " unless $internal_exists;
print "ok 11\n";

$doc =~ s/[\s\n]+\[[^]]*\][\s\n]+//m;

$p->setHandlers(Start => sub {
		          my ($xp,$el,%atts) = @_;
			  if ($el eq 'foo') {
			    print "not " unless defined($atts{zz});
			    print "ok 12\n";
			  }
			});

$p->parse($doc);