240 lines
4.9 KiB
Perl
240 lines
4.9 KiB
Perl
# Before `make install' is performed this script should be runnable with
|
|
# `make test'. After `make install' it should work as `perl test.pl'
|
|
|
|
######################### We start with some black magic to print on failure.
|
|
|
|
# Change 1..1 below to 1..last_test_to_print .
|
|
# (It may become useful if the test is moved to ./t subdirectory.)
|
|
|
|
BEGIN { print "1..27\n"; }
|
|
END { print "not ok 1\n" unless $loaded; }
|
|
use XML::Parser;
|
|
use FileHandle; # Make 5.10.0 happy.
|
|
$loaded = 1;
|
|
print "ok 1\n";
|
|
|
|
######################### End of black magic.
|
|
|
|
# Insert your test code below (better if it prints "ok 13"
|
|
# (correspondingly "not ok 13") depending on the success of chunk 13
|
|
# of the test code):
|
|
|
|
# Test 2
|
|
|
|
my $parser = new XML::Parser( ProtocolEncoding => 'ISO-8859-1' );
|
|
if ($parser) {
|
|
print "ok 2\n";
|
|
}
|
|
else {
|
|
print "not ok 2\n";
|
|
exit;
|
|
}
|
|
|
|
my @ndxstack;
|
|
my $indexok = 1;
|
|
|
|
# Need this external entity
|
|
|
|
open( ZOE, '>zoe.ent' );
|
|
print ZOE "'cute'";
|
|
close(ZOE);
|
|
|
|
# XML string for tests
|
|
|
|
my $xmlstring = <<"End_of_XML;";
|
|
<!DOCTYPE foo
|
|
[
|
|
<!NOTATION bar PUBLIC "qrs">
|
|
<!ENTITY zinger PUBLIC "xyz" "abc" NDATA bar>
|
|
<!ENTITY fran SYSTEM "fran-def">
|
|
<!ENTITY zoe SYSTEM "zoe.ent">
|
|
]>
|
|
<foo>
|
|
First line in foo
|
|
<boom>Fran is &fran; and Zoe is &zoe;</boom>
|
|
<bar id="jack" stomp="jill">
|
|
<?line-noise *&*&^&<< ?>
|
|
1st line in bar
|
|
<blah> 2nd line in bar </blah>
|
|
3rd line in bar <!-- Isn't this a doozy -->
|
|
</bar>
|
|
<zap ref="zing" />
|
|
This, '\240', would be a bad character in UTF-8.
|
|
</foo>
|
|
End_of_XML;
|
|
|
|
# Handlers
|
|
my @tests;
|
|
my $pos = '';
|
|
|
|
sub ch {
|
|
my ( $p, $str ) = @_;
|
|
$tests[4]++;
|
|
$tests[5]++ if ( $str =~ /2nd line/ and $p->in_element('blah') );
|
|
if ( $p->in_element('boom') ) {
|
|
$tests[17]++ if $str =~ /pretty/;
|
|
$tests[18]++ if $str =~ /cute/;
|
|
}
|
|
}
|
|
|
|
sub st {
|
|
my ( $p, $el, %atts ) = @_;
|
|
|
|
$ndxstack[ $p->depth ] = $p->element_index;
|
|
$tests[6]++ if ( $el eq 'bar' and $atts{stomp} eq 'jill' );
|
|
if ( $el eq 'zap' and $atts{'ref'} eq 'zing' ) {
|
|
$tests[7]++;
|
|
$p->default_current;
|
|
}
|
|
elsif ( $el eq 'bar' ) {
|
|
$tests[22]++ if $p->recognized_string eq '<bar id="jack" stomp="jill">';
|
|
}
|
|
}
|
|
|
|
sub eh {
|
|
my ( $p, $el ) = @_;
|
|
$indexok = 0 unless $p->element_index == $ndxstack[ $p->depth ];
|
|
if ( $el eq 'zap' ) {
|
|
$tests[8]++;
|
|
my @old = $p->setHandlers( 'Char', \&newch );
|
|
$tests[19]++ if $p->current_line == 17;
|
|
$tests[20]++ if $p->current_column == 20;
|
|
$tests[23]++ if ( $old[0] eq 'Char' and $old[1] == \&ch );
|
|
}
|
|
if ( $el eq 'boom' ) {
|
|
$p->setHandlers( 'Default', \&dh );
|
|
}
|
|
}
|
|
|
|
sub dh {
|
|
my ( $p, $str ) = @_;
|
|
if ( $str =~ /doozy/ ) {
|
|
$tests[9]++;
|
|
$pos = $p->position_in_context(1);
|
|
}
|
|
$tests[10]++ if $str =~ /^<zap/;
|
|
}
|
|
|
|
sub pi {
|
|
my ( $p, $tar, $data ) = @_;
|
|
|
|
$tests[11]++ if ( $tar eq 'line-noise' and $data =~ /&\^&<</ );
|
|
}
|
|
|
|
sub note {
|
|
my ( $p, $name, $base, $sysid, $pubid ) = @_;
|
|
|
|
$tests[12]++ if ( $name eq 'bar' and $pubid eq 'qrs' );
|
|
}
|
|
|
|
sub unp {
|
|
my ( $p, $name, $base, $sysid, $pubid, $notation ) = @_;
|
|
|
|
$tests[13]++ if ( $name eq 'zinger'
|
|
and $pubid eq 'xyz'
|
|
and $sysid eq 'abc'
|
|
and $notation eq 'bar' );
|
|
}
|
|
|
|
sub newch {
|
|
my ( $p, $str ) = @_;
|
|
|
|
if ( $] < 5.007001 ) {
|
|
$tests[14]++ if $str =~ /'\302\240'/;
|
|
}
|
|
else {
|
|
$tests[14]++ if $str =~ /'\xa0'/;
|
|
}
|
|
}
|
|
|
|
sub extent {
|
|
my ( $p, $base, $sys, $pub ) = @_;
|
|
|
|
if ( $sys eq 'fran-def' ) {
|
|
$tests[15]++;
|
|
return 'pretty';
|
|
}
|
|
elsif ( $sys eq 'zoe.ent' ) {
|
|
$tests[16]++;
|
|
|
|
open( FOO, $sys ) or die "Couldn't open $sys";
|
|
return *FOO;
|
|
}
|
|
}
|
|
|
|
eval {
|
|
$parser->setHandlers(
|
|
'Char' => \&ch,
|
|
'Start' => \&st,
|
|
'End' => \&eh,
|
|
'Proc' => \&pi,
|
|
'Notation' => \¬e,
|
|
'Unparsed' => \&unp,
|
|
'ExternEnt' => \&extent,
|
|
'ExternEntFin' => sub { close(FOO); }
|
|
);
|
|
};
|
|
|
|
if ($@) {
|
|
print "not ok 3\n";
|
|
exit;
|
|
}
|
|
|
|
print "ok 3\n";
|
|
|
|
# Test 4..20
|
|
eval { $parser->parsestring($xmlstring); };
|
|
|
|
if ($@) {
|
|
print "Parse error:\n$@";
|
|
}
|
|
else {
|
|
$tests[21]++;
|
|
}
|
|
|
|
unlink('zoe.ent') if ( -f 'zoe.ent' );
|
|
|
|
for ( 4 .. 23 ) {
|
|
print "not " unless $tests[$_];
|
|
print "ok $_\n";
|
|
}
|
|
|
|
$cmpstr = << 'End_of_Cmp;';
|
|
<blah> 2nd line in bar </blah>
|
|
3rd line in bar <!-- Isn't this a doozy -->
|
|
===================^
|
|
</bar>
|
|
End_of_Cmp;
|
|
|
|
if ( $cmpstr ne $pos ) {
|
|
print "not ";
|
|
}
|
|
print "ok 24\n";
|
|
|
|
print "not " unless $indexok;
|
|
print "ok 25\n";
|
|
|
|
# Test that memory leak through autovivifying symbol table entries is fixed.
|
|
|
|
my $count = 0;
|
|
$parser = new XML::Parser(
|
|
Handlers => {
|
|
Start => sub { $count++ }
|
|
}
|
|
);
|
|
|
|
$xmlstring = '<a><b>Sea</b></a>';
|
|
|
|
eval { $parser->parsestring($xmlstring); };
|
|
|
|
if ( $count != 2 ) {
|
|
print "not ";
|
|
}
|
|
print "ok 26\n";
|
|
|
|
if ( defined( *{$xmlstring} ) ) {
|
|
print "not ";
|
|
}
|
|
print "ok 27\n";
|
|
|