# $Id: 1_basics.t,v 1.1.1.1 2002/12/18 09:21:18 grantm Exp $ # vim: syntax=perl use strict; use Test::More; use File::Spec; my $have_xpath = 0; if(eval { require XML::XPath; }) { $have_xpath++; } if(eval { require XML::LibXML; }) { $have_xpath++; } unless($have_xpath) { plan skip_all => 'no XPath module available'; } plan tests => 8; # Confirm the module compiles use File::Find::Rule::XPath; ok(1, "module compiled ok"); ############################################################################## # Simple XPath expression to find all documents with a element # (there should be only one). # my $root = 't'; my $files; $files = norm(File::Find::Rule->file->xpath( '//quote' )->in($root)); is($files, 't/testdata/quote.xml', "matched //quote"); ############################################################################## # Find all well-formed XML documents. # $files = norm(File::Find::Rule->file->xpath( '/' )->in($root)); is($files, 't/testdata/hello.xml t/testdata/quote.xml', "matched /"); ############################################################################## # Same again, but using default value for path expression. # $files = norm(File::Find::Rule->file->xpath()->in($root)); is($files, 't/testdata/hello.xml t/testdata/quote.xml', "matched default pattern"); ############################################################################## # Look for a particular string of text (anywhere). # $files = norm(File::Find::Rule->file ->xpath( '//*[contains(., "Hello World!")]' )->in($root)); is($files, 't/testdata/hello.xml t/testdata/quote.xml', qq(matched //*[contains(., "Hello World!")])); ############################################################################## # Look for a particular string of text in a particular tag. # $files = norm(File::Find::Rule->file ->xpath( '//greeting[contains(., "Hello World!")]' )->in($root)); is($files, 't/testdata/hello.xml', qq(matched //greeting[contains(., "Hello World!")])); ############################################################################## # Try the same match again but start search with absolute pathname # my $absroot = File::Spec->rel2abs($root); $files = norm(File::Find::Rule->file ->xpath( '//greeting[contains(., "Hello World!")]' ) ->in($absroot)); like($files, qr{^.*t/testdata/hello\.xml$}, qq(same search from absolute root matched)); ############################################################################## # Now try the search using the procedural interface # $files = norm( find( file => xpath => '//greeting[contains(., "Hello World!")]', in => $root ) ); is($files, 't/testdata/hello.xml', qq(same search matched using procedural interface)); exit; ############################################################################## # Take a list of pathnames, sort them, convert the path separators to '/' # and return as a space delimited string. # sub norm { return join ' ', map { join '/', split /[^\w\.]+/ } sort @_; }