#!/bin/perl -w use strict; use XML::Twig; $|=1; my $t= XML::Twig->new; $t->parse( ' elt 1 elt 2 elt 3 2 3 <:elt id=":elt">yep, that is a valid name '); my @data= grep { !/^##/ && m{\S} } ; my @exp; my %result; foreach( @data) { chomp; my ($exp, $id_list) = split /\s*=>\s*/ ; $id_list=~ s{\s+$}{}; $result{$exp}= $id_list; push @exp, $exp; } my $nb_tests= keys %result; print "1..$nb_tests\n"; my $i=1; foreach my $exp ( @exp) { my $expected_result= $result{$exp}; my @result= $t->get_xpath( $exp); my $result; if( @result) { $result= join ' ', map { $_->id || $_->gi } @result; } else { $result= 'none'; } if( $result eq $expected_result) { print "ok $i\n"; } else { print "not ok $i\n"; print STDERR "$exp: expected '$expected_result' - real '$result'\n"; } $i++; } exit 0; __DATA__ /elt => none /elt[@foo="bar"] => none /*[@foo="bar"] => none //*[@foo="bar"] => none /* => doc /*[@id="doc"] => doc //*[@id="doc"] => doc //elt => elt-1 elt-2 elt-3 //*/elt => elt-1 elt-2 elt-3 /doc/elt => elt-1 elt-2 /*/elt => elt-1 elt-2 /doc/elt[ last()] => elt-2 /doc/*[ last()] => :elt //elt[@id='elt-1'] => elt-1 //*[@id='elt-1'] => elt-1 //[@id='elt-1'] => elt-1 //elt[@id='elt-1' or @id='elt-2'] => elt-1 elt-2 //elt[@id='elt-1' and @id='elt-2'] => none //elt[@id='elt-1' and @id!='elt-2'] => elt-1 //elt[@id=~ /elt/] => elt-1 elt-2 elt-3 //[@id='elt-1' or @id='elt-2'] => elt-1 elt-2 //[@id='elt-1' and @id='elt-2'] => none //[@id='elt-1' and @id!='elt-2'] => elt-1 //[@id=~ /elt/] => elt-1 elt-2 elt2-1 elt-3 elt2-2 elt2-3 elt2-4 :elt //*[@id='elt-1' or @id='elt-2'] => elt-1 elt-2 //*[@id='elt-1' and @id='elt-2'] => none //*[@id='elt-1' and @id!='elt-2'] => elt-1 //*[@id=~ /elt/] => elt-1 elt-2 elt2-1 elt-3 elt2-2 elt2-3 elt2-4 :elt //elt2[@att_int > 2] => elt2-4 /doc/elt2[ last()]/* => elt2-3 elt2-4 //*[@id=~/elt2/] => elt2-1 elt2-2 elt2-3 elt2-4 /doc/*[@id=~/elt2/] => elt2-1 elt2-2 /doc//*[@id=~/elt2/] => elt2-1 elt2-2 elt2-3 elt2-4 //*[@id=~/elt2-[34]/] => elt2-3 elt2-4 //*[@id!~/^elt/] => doc :elt //[@id=~/elt2-[34]/] => elt2-3 elt2-4 //[@id!~/elt2-[34]/] => doc elt-1 elt-2 elt2-1 elt-3 elt2-2 :elt //elt2[@id=~/elt2-[34]/] => elt2-3 elt2-4 //*[@id!~/elt2-[34]/] => doc elt-1 elt-2 elt2-1 elt-3 elt2-2 :elt //:elt => :elt //elt[string()="elt 1"] => elt-1 //elt[string()=~/elt 1/] => elt-1 //elt[string()=~/^elt 1/] => elt-1 //*[string()="elt 1"] => elt-1 #PCDATA //*[string()=~/elt 1/] => doc elt-1 #PCDATA //*[string()=~/^elt 1/] => doc elt-1 #PCDATA //[string()="elt 1"] => elt-1 #PCDATA //[string()=~/elt 1/] => doc elt-1 #PCDATA //[string()=~/^elt 1/] => doc elt-1 #PCDATA //[string()="elt 2"] => elt-2 #PCDATA //[string()=~/elt 2/] => doc elt-2 #PCDATA //[string()=~/^elt 2/] => elt-2 #PCDATA