XML-LibXML
view release on metacpan or search on metacpan
$parser->set_handler($sax);
$parser->parse_uri("example/ns.xml");
# TEST
$SAXNSTester_start_element_stacker->test(
[
qw(true true true)
],
'Three successful SAXNSTester elements.',
);
# TEST
$SAXNSTester_start_prefix_mapping_stacker->test(
[
qw(true true true)
],
'Three successful SAXNSTester start_prefix_mapping.',
);
# TEST
$SAXNSTester_end_prefix_mapping_stacker->test(
[
qw(true true true)
],
'Three successful SAXNSTester end_prefix_mapping.',
);
}
{
local $XML::SAX::ParserPackage = 'XML::LibXML::SAX';
my @stack;
my $sax = SAXLocatorTester->new( sub {
my ($self, $method, @args) = @_;
push( @stack, $method => [
$self->{locator}->{LineNumber},
$self->{locator}->{ColumnNumber}
] );
} );
# TEST
ok($sax, 'Created SAX handler with document locator');
my $parser = XML::SAX::ParserFactory->parser(Handler => $sax);
$parser->parse_string(<<EOT);
<?xml version="1.0" encoding="UTF-8"?>
<root>
1
<!-- comment -->
<![CDATA[ a < b ]]>
</root>
EOT
my $expecting = [
start_document => [ 2, 1 ],
start_element => [ 2, 6 ],
characters => [ 4, 1 ],
comment => [ 4, 17 ],
characters => [ 5, 1 ],
start_cdata => [ 5, 20 ],
characters => [ 5, 20 ],
end_cdata => [ 5, 20 ],
characters => [ 6, 1 ],
end_element => [ 6, 8 ],
end_document => [ 6, 8 ],
];
# TEST
is_deeply( \@stack, $expecting, "Check locator positions" );
}
########### Namespace test ( empty namespaces ) ########
{
my $h = "SAXNS2Tester";
my $xml = "<a xmlns='xml://A'><b/></a>";
my @tests = (
sub {
XML::LibXML::SAX ->new( Handler => $h )->parse_string( $xml );
# TEST
$SAXNS2Tester_start_element_stacker->test([qw(true)], 'XML::LibXML::SAX');
},
sub {
XML::LibXML::SAX::Parser->new( Handler => $h )->parse_string( $xml );
# TEST
$SAXNS2Tester_start_element_stacker->test([qw(true)], 'XML::LibXML::SAX::Parser');
},
);
$_->() for @tests;
}
########### Error Handling ###########
{
my $xml = '<foo><bar/><a>Text</b></foo>';
my $handler = SAXErrorTester->new;
foreach my $pkg (qw(XML::LibXML::SAX::Parser XML::LibXML::SAX)) {
undef $@;
eval {
$pkg->new(Handler => $handler)->parse_string($xml);
};
# TEST*2
ok($@, ' TODO : Add test name'); # We got an error
}
$handler = SAXErrorCallbackTester->new;
eval { XML::LibXML::SAX->new(Handler => $handler )->parse_string($xml) };
# TEST
ok($@, ' TODO : Add test name'); # We got an error
# TEST
ok( $handler->{fatal_called}, ' TODO : Add test name' );
}
########### XML::LibXML::SAX::parse_chunk test ###########
sub start_element {
my ($self, $node) = @_;
$SAXNSTester_start_element_stacker->cb()->($node);
return;
}
sub end_element {
my ($self, $node) = @_;
# warn("end_element: $node->{Name}\n");
}
sub start_prefix_mapping {
my ($self, $node) = @_;
$SAXNSTester_start_prefix_mapping_stacker->cb()->($node);
return;
}
sub end_prefix_mapping {
my ($self, $node) = @_;
$SAXNSTester_end_prefix_mapping_stacker->cb()->($node);
return;
}
1;
package SAXNS2Tester;
use Test::More;
#sub new {
# my $class = shift;
# return bless {}, $class;
#}
sub start_element {
my $self = shift;
my ( $elt ) = @_;
$SAXNS2Tester_start_element_stacker->cb()->($elt);
return;
}
package SAXLocatorTester;
use Test::More;
sub new {
my ($class, $cb) = @_;
my $self = bless {}, $class;
for my $method ( qw(
start_document end_document
start_element end_element
start_cdata end_cdata
start_dtd end_dtd
characters
comment
) ) {
no strict 'refs';
*$method = sub { $cb->( $_[0], $method, @_[1..$#_]) };
}
return $self;
}
sub set_document_locator {
my ($self, $locator) = @_;
$self->{locator} = $locator;
}
1;
package SAXErrorTester;
use Test::More;
sub new {
bless {}, shift;
}
sub end_document {
print "End doc: @_\n";
return 1; # Shouldn't be reached
}
package SAXErrorCallbackTester;
use Test::More;
sub fatal_error {
$_[0]->{fatal_called} = 1;
}
sub start_element {
# test if we can do other stuff
XML::LibXML->new->parse_string("<foo/>");
return;
}
sub new {
bless {}, shift;
}
sub end_document {
print "End doc: @_\n";
return 1; # Shouldn't be reached
}
1;
( run in 0.525 second using v1.01-cache-2.11-cpan-39bf76dae61 )