1BEGIN { chdir 't' if -d 't' } 2 3use Test::More; 4use strict; 5use lib '../lib'; 6 7plan skip_all => "File contains an alien character set" if ord "A" != 65; 8 9my $Class = 'Archive::Tar'; 10my $FClass = 'Archive::Tar::File'; 11my $File = 'src/long/bar.tar'; 12my @Expect = ( 13 qr|^c$|, 14 qr|^d$|, 15 qr|^directory/$|, 16 qr|^directory/really.*name/$|, 17 qr|^directory/.*/myfile$|, 18); 19 20use_ok( $Class ); 21 22### crazy ref to special case 'all' 23for my $index ( \0, 0 .. $#Expect ) { 24 25 my %opts = (); 26 my @expect = (); 27 28 my $dotest = sub { 29 my $desc = shift; 30 my $next = $Class->iter( $File, 0, \%opts ); 31 32 my $pp_opts = join " => ", %opts; 33 ok( $next, "Iterator created from $File ($pp_opts $desc)" ); 34 isa_ok( $next, "CODE", " Iterator $desc" ); 35 36 my @names; 37 while( my $f = $next->() ) { 38 ok( $f, " File object retrieved $desc" ); 39 isa_ok( $f, $FClass, " Object $desc" ); 40 41 push @names, $f->name; 42 } 43 44 is( scalar(@names), scalar(@expect), 45 " Found correct number of files $desc" ); 46 47 my $i = 0; 48 for my $name ( @names ) { 49 ok( 1, " Inspecting '$name' $desc" ); 50 like($name, $expect[$i]," Matches $Expect[$i] $desc" ); 51 $i++; 52 } 53 }; 54 55 ### do a full test vs individual filters 56 if( not ref $index ) { 57 my $regex = $Expect[$index]; 58 @expect = ($regex); 59 %opts = ( filter => $regex ); 60 $dotest->("filter $regex"); 61 %opts = ( filter_cb => sub { my ($entry) = @_; $entry->name() =~ /$regex/ } ); 62 $dotest->("filter_cb $regex"); 63 } else { 64 @expect = @Expect; 65 $dotest->("all"); 66 } 67} 68 69done_testing; 70