use strict;
use Test::More tests => 38;
use_ok qw(XML::Parser::Lite);
my $parser;
ok $parser = XML::Parser::Lite->new(), 'Create parser';
is $parser, $parser->new();
isa_ok $parser, 'XML::Parser::Lite';
my @start_from = ();
my @text_from = ();
my @end_from = ();
my @final_from = ();
sub _reset {
@final_from = ();
@text_from = ();
@start_from = ();
@end_from = ();
}
my %handler_of = (
Final => sub { push @final_from, 1; },
Char => sub { push @text_from, $_[1]; },
Start => sub { push @start_from, $_[1]; },
End => sub { push @end_from, $_[1]; },
);
$parser->setHandlers( Final => undef, );
$parser->setHandlers( %handler_of );
test_parse($parser);
ok $parser = XML::Parser::Lite->new( Handlers => { %handler_of }), 'Create parser';
test_parse($parser);
$parser->setHandlers( Char => undef );
eval { $parser->parse('barbar') };
like $@ , qr{ multiple \s roots, \s wrong \s element}x, 'detect multiple roots';
ok $parser->parse('
'
), 'parse xml with whitespaces/newlines before XML';
eval { $parser->parse('Foobarbarbar') };
like $@ , qr{ junk \s 'Foobar' \s before \s XML \s element}x, 'detect junk before XML';
eval { $parser->parse('barFoobarbar') };
like $@ , qr{ junk \s 'Foobar' \s after \s XML \s element}x, 'detect junk after XML';
SKIP: {
skip 'need File::Basename for resolveing filename', 1
if ( ! eval "require File::Basename");
my $dir = File::Basename::dirname( __FILE__ );
$parser = XML::Parser::Lite->new();
open my $fh, '<', "$dir/adam.xml";
my $xml = join ("\n", <$fh>);
close $fh;
$parser->parse($xml);
pass 'parse XML with doctype and processing instructions';
};
sub test_parse {
_reset();
my $parser = shift;
$parser->parse('bar');
is $text_from[0], 'bar', 'char callback';
is $start_from[0], 'foo', 'start callback';
is $final_from[0], 1, 'final callback';
_reset();
$parser->parse('barbar');
is $text_from[1], 'bar', 'char callback';
is $start_from[0], 'baz', 'start callback';
is $start_from[1], 'foo', 'start callback';
is $start_from[2], 'foo', 'start callback';
is $end_from[2], 'baz', 'start callback';
is $end_from[1], 'foo', 'start callback';
is $end_from[0], 'foo', 'start callback';
is $final_from[0], 1, 'final callback';
eval { $parser->parse('baz'); };
like $@, qr{ not \s properly \s closed \s }x, 'detect unclosed tag';
eval { $parser->parse(''); };
like $@, qr{ no \s element \s found \s }x, 'detect no element';
eval { $parser->parse('baz'); };
like $@, qr{ mismatched \s tag\s }x, 'detect mismatched tag';
}