# $Id: 02parse.t,v 1.12 2002/09/02 11:08:03 phish Exp $
##
# this test checks the parsing capabilities of XML::LibXML
# it relies on the success of t/01basic.t
use Test;
use IO::File;
BEGIN { plan tests => 42 };
use XML::LibXML;
use XML::LibXML::Common qw(:libxml);
##
# test values
my $goodWFString = "";
my $badWFString1 = "&";
my $badWFString2 = "";
my $badWFString3 = '';
my $goodWBString = "foofoo";
my $badWBString1 = "bar";
my $badWBString2 = "foo";
my $goodfile = "example/dromeds.xml";
my $badfile1 = "example/bad.xml";
my $badfile2 = "does_not_exist.xml";
my $parser = XML::LibXML->new();
print "# 1. Well Formed String Parsing\n";
{
my $doc = $parser->parse_string($goodWFString);
ok(defined $doc);
my $str = $doc->toString();
$str =~ s/\<\?xml[^\?]*\?\>//;
$str =~ s/\n//g;
ok($str, $goodWFString );
}
eval { my $fail = $parser->parse_string($badWFString1); };
ok($@);
eval { my $fail = $parser->parse_string($badWFString2); };
ok($@);
eval { my $fail = $parser->parse_string($badWFString3); };
ok($@);
eval { my $fail = $parser->parse_string(""); };
ok($@);
eval { my $fail = $parser->parse_string(undef); };
ok($@);
print "# 2. Well Ballanced String Parsing\n";
{
my $fragment;
eval { $fragment = $parser->parse_xml_chunk( $goodWBString ); };
ok( $fragment );
ok( $fragment->toString(), $goodWBString );
}
eval { my $fail = $parser->parse_xml_chunk($badWBString1); };
ok($@);
eval { my $fail = $parser->parse_xml_chunk($badWBString2); };
ok($@);
eval { my $fail = $parser->parse_xml_chunk(""); };
ok($@);
eval { my $fail = $parser->parse_xml_chunk(undef); };
ok($@);
print "# 3. Parse A File\n";
{
my $doc = $parser->parse_file($goodfile);
ok($doc);
}
eval {my $fail = $parser->parse_file($badfile1);};
ok($@);
eval { $parser->parse_file($badfile2); };
ok($@);
{
my $str = " ";
my $tstr= "";
$parser->keep_blanks(0);
my $docA = $parser->parse_string($str);
my $docB = $parser->parse_file("example/test3.xml");
$XML::LibXML::skipXMLDeclaration = 1;
ok( $docA->toString, $tstr );
ok( $docB->toString, $tstr );
$XML::LibXML::skipXMLDeclaration = 0;
}
print "# 4. Parse A Handle\n";
my $fh = IO::File->new($goodfile);
ok($fh);
my $doc = $parser->parse_fh($fh);
ok($doc);
$fh = IO::File->new($badfile1);
ok($fh);
eval { my $doc = $parser->parse_fh($fh); };
ok($@);
$fh = IO::File->new($badfile2);
eval { my $doc = $parser->parse_fh($fh); };
ok($@);
{
$parser->expand_entities(1);
my $doc = $parser->parse_file( "example/dtd.xml" );
my @cn = $doc->documentElement->childNodes;
ok( scalar @cn, 1 );
$doc = $parser->parse_file( "example/complex/complex2.xml" );
@cn = $doc->documentElement->childNodes;
ok( scalar @cn, 1 );
$parser->expand_entities(0);
}
print "# 5. x-include processing\n";
my $goodXInclude = q{
};
my $badXInclude = q{
};
{
$parser->base_uri( "example/" );
$parser->keep_blanks(0);
my $doc = $parser->parse_string( $goodXInclude );
ok($doc);
my $i;
eval { $i = $parser->processXIncludes($doc); };
ok( $i );
$doc = $parser->parse_string( $badXInclude );
$i= undef;
eval { $i = $parser->processXIncludes($doc); };
ok($@);
# auto expand
$parser->expand_xinclude(1);
$doc = $parser->parse_string( $goodXInclude );
ok($doc);
$doc = undef;
eval { $doc = $parser->parse_string( $badXInclude ); };
ok($@);
ok(!$doc);
# some bad stuff
eval{ $parser->processXIncludes(undef); };
ok($@);
eval{ $parser->processXIncludes("blahblah"); };
ok($@);
}
print "# 6. push parser\n";
{
my @good_strings = ("", "bar", "" );
my @bad_strings = ("", "bar");
my $parser = XML::LibXML->new;
{
$parser->push( @good_strings );
my $doc = $parser->finish_push;
ok($doc);
}
{
foreach ( @bad_strings ) {
$parser->push( $_);
}
eval { my $doc = $parser->finish_push; };
ok( $@ );
}
{
$parser->init_push;
foreach ( @bad_strings ) {
$parser->push( $_);
}
my $doc;
eval { $doc = $parser->finish_push(1); };
ok( $doc );
}
}
print "# 7. SAX parser\n";
{
use XML::LibXML::SAX;
use XML::LibXML::SAX::Builder;
my $handler = XML::LibXML::SAX::Builder->new();
my $generator = XML::LibXML::SAX->new( Handler=>$handler );
my $string1 = q{foo};
$doc = $generator->parse_string( $string1 );
ok( $doc );
my $string = q{foo};
$doc = $generator->parse_string( $string );
ok( $doc );
my $string2 = q{bar};
$doc = $generator->parse_string( $string2 );
ok($doc);
my $root = $doc->documentElement;
my @attrs = $root->attributes;
ok( scalar @attrs );
if ( scalar @attrs ) {
ok( $attrs[0]->nodeType, XML_NAMESPACE_DECL );
}
else {
ok(0);
}
$doc = $generator->parse_uri( "example/test.xml" );
ok($doc);
}