use Test;
BEGIN { plan tests=>36}
END {ok(0) unless $loaded;}
use XML::LibXML;
$loaded = 1;
ok($loaded);
# to test if findnodes works.
# i added findnodes to the node class, so a query can be started
# everywhere.
my $file = "example/dromeds.xml";
$itervar = undef;
# init the file parser
my $parser = XML::LibXML->new();
$dom = $parser->parse_file( $file );
if ( defined $dom ) {
# get the root document
$elem = $dom->getDocumentElement();
# first very simple path starting at root
my @list = $elem->findnodes( "species" );
ok( scalar(@list), 3 );
# a simple query starting somewhere ...
my $node = $list[0];
my @slist = $node->findnodes( "humps" );
ok( scalar(@slist), 1 );
# find a single node
@list = $elem->findnodes( "species[\@name='Llama']" );
ok( scalar( @list ), 1 );
# find with not conditions
@list = $elem->findnodes( "species[\@name!='Llama']/disposition" );
ok( scalar(@list), 2 );
@list = $elem->findnodes( 'species/@name' );
ok( scalar @list && $list[0]->toString() eq ' name="Camel"' );
my $x = XML::LibXML::Text->new( 1234 );
if( defined $x ) {
ok( $x->getData(), "1234" );
}
my $telem = $dom->createElement('test');
$telem->appendWellBalancedChunk('c');
$telem->iterator->iterate( sub { shift; $itervar.=$_[0]->getName(); } );
ok( $itervar, 'testbtext' );
finddoc($dom);
ok(1);
}
ok( $dom );
# test to make sure that multiple array findnodes() returns
# don't segfault perl; it'll happen after the second one if it does
for (0..3) {
my $doc = XML::LibXML->new->parse_string(
'
');
my @nds = $doc->findnodes("processing-instruction('xsl-stylesheet')");
}
$doc = $parser->parse_string(<<'EOT');
EOT
my $root = $doc->getDocumentElement;
my @a = $root->findnodes('//a:foo');
ok(@a, 1);
@b = $root->findnodes('//b:bar');
ok(@b, 1);
@none = $root->findnodes('//b:foo');
@none = (@none, $root->findnodes('//foo'));
ok(@none, 0);
my @doc = $root->findnodes('document("example/test.xml")');
ok(@doc);
# warn($doc[0]->toString);
# this query should result an empty array!
my @nodes = $root->findnodes( "/humpty/dumpty" );
ok( scalar(@nodes), 0 );
my $docstring = q{
};
$doc = $parser->parse_string( $docstring );
$root = $doc->documentElement;
my @ns = $root->findnodes('namespace::*');
ok(scalar(@ns), 2 );
print "#bad xpaths\n";
my @badxpath = (
'abc:::def',
'foo///bar',
'...',
'/-',
);
foreach my $xp ( @badxpath ) {
eval { $res = $root->findnodes( $xp ); };
ok($@);
eval { $res = $root->find( $xp ); };
ok($@);
eval { $res = $root->findvalue( $xp ); };
ok($@);
eval { $res = $root->findnodes( encodeToUTF8( "iso-8859-1", $xp ) ); };
ok($@);
eval { $res = $root->find( encodeToUTF8( "iso-8859-1", $xp ) );};
ok($@);
}
sub finddoc {
my $doc = shift;
return unless defined $doc;
my $rn = $doc->documentElement;
$rn->findnodes("/");
}