Update of /cvsroot/perl-xml/XML-LibXML-XPathContext/t
In directory sc8-pr-cvs1:/tmp/cvs-serv21709/t
Added Files:
02-functions.t
Log Message:
added extension functions support
--- NEW FILE: 02-functions.t ---
# -*- cperl -*-
use Test;
BEGIN { plan tests => 11 };
use XML::LibXML;
use XML::LibXML::XPathContext;
my $doc = XML::LibXML->new->parse_string(<<'XML');
<foo><bar a="b">Bla</bar><bar/></foo>
XML
ok($doc);
my $xc = XML::LibXML::XPathContext->new($doc);
$xc->registerNs('foo','urn:foo');
$xc->registerFunctionNS('copy','urn:foo',
sub { @_==1 ? $_[0] : die "too many parameters"}
);
# copy string, real, integer, nodelist
ok($xc->findvalue('foo:copy("bar")') eq 'bar');
ok($xc->findvalue('foo:copy(3.14)') == 3.14);
ok($xc->findvalue('foo:copy(7)') == 7);
ok($xc->find('foo:copy(//*)')->size() == 3);
my ($foo)=$xc->findnodes('(//*)[2]');
ok($xc->findnodes('foo:copy(//*)[2]')->pop->isSameNode($foo));
# too many arguments
eval { $xc->findvalue('foo:copy(1,xyz)') };
ok ($@);
# without a namespace
$xc->registerFunction('dummy', sub { 'DUMMY' });
ok($xc->findvalue('dummy()') eq 'DUMMY');
# a mix of different arguments types
$xc->registerFunction('join',
sub { join shift,
map { (ref($_)&&$_->isa('XML::LibXML::Node')) ? $_->nodeName : $_ }
map { (ref($_)&&$_->isa('XML::LibXML::NodeList')) ? @$_ : $_ }
@_
});
ok($xc->findvalue('join("","a","b","c")') eq 'abc');
ok($xc->findvalue('join("-","a",/foo,//*)') eq 'a-foo-foo-bar-bar');
ok($xc->findvalue('join("-",foo:copy(//*))') eq 'foo-bar-bar');
|