Blame t/File-Find-Rule.t

Packit 26bf30
#!perl
Packit 26bf30
#       $Id: /mirror/lab/perl/File-Find-Rule/t/File-Find-Rule.t 2100 2006-05-28T16:06:50.725367Z richardc  $
Packit 26bf30
Packit 26bf30
use strict;
Packit 26bf30
use warnings;
Packit 26bf30
Packit 26bf30
use Test::More tests => 42;
Packit 26bf30
Packit 26bf30
use lib './t/lib';
Packit 26bf30
Packit 26bf30
use File::Find::Object::TreeCreate;
Packit 26bf30
Packit 26bf30
use File::Path;
Packit 26bf30
Packit 26bf30
my $tree_creator = File::Find::Object::TreeCreate->new();
Packit 26bf30
Packit 26bf30
{
Packit 26bf30
    my $tree =
Packit 26bf30
    {
Packit 26bf30
        'name' => "FFRt-to/",
Packit 26bf30
        'subs' =>
Packit 26bf30
        [
Packit 26bf30
            {
Packit 26bf30
                'name' => "File-Find-Rule.t",
Packit 26bf30
                'contents' => $tree_creator->cat(
Packit 26bf30
                    "./t/sample-data/to-copy-from/File-Find-Rule.t"
Packit 26bf30
                ),
Packit 26bf30
            },
Packit 26bf30
            {
Packit 26bf30
                'name' => "findorule.t",
Packit 26bf30
                'contents' => $tree_creator->cat(
Packit 26bf30
                    "./t/sample-data/to-copy-from/findorule.t"
Packit 26bf30
                ),
Packit 26bf30
            },
Packit 26bf30
            {
Packit 26bf30
                'name' => "foobar",
Packit 26bf30
                'contents' => $tree_creator->cat(
Packit 26bf30
                    "./t/sample-data/to-copy-from/foobar"
Packit 26bf30
                ),
Packit 26bf30
Packit 26bf30
            },
Packit 26bf30
            {
Packit 26bf30
                'name' => "lib/",
Packit 26bf30
                'subs' =>
Packit 26bf30
                [
Packit 26bf30
                    {
Packit 26bf30
                        'name' => "File/",
Packit 26bf30
                        'subs' =>
Packit 26bf30
                        [
Packit 26bf30
                            {
Packit 26bf30
                                name => "Find/",
Packit 26bf30
                                subs =>
Packit 26bf30
                                [
Packit 26bf30
                                    {
Packit 26bf30
                                        name => "Object/",
Packit 26bf30
                                        subs =>
Packit 26bf30
                                        [
Packit 26bf30
                                            {
Packit 26bf30
                                                name => "Rule/",
Packit 26bf30
                                                subs =>
Packit 26bf30
                                                [
Packit 26bf30
                                                    {
Packit 26bf30
                                                        name => "Test/",
Packit 26bf30
                                                        subs =>
Packit 26bf30
                                                        [
Packit 26bf30
                                                        {
Packit 26bf30
                                                            name => "ATeam.pm",
Packit 26bf30
content => $tree_creator->cat(
Packit 26bf30
    "./t/sample-data/to-copy-from/lib/File/Find/Object/Rule/Test/ATeam.pm"
Packit 26bf30
Packit 26bf30
),
Packit 26bf30
}
Packit 26bf30
                                                        ],
Packit 26bf30
                                                    },
Packit 26bf30
                                                ],
Packit 26bf30
                                            }
Packit 26bf30
                                        ],
Packit 26bf30
                                    },
Packit 26bf30
                                ],
Packit 26bf30
                            },
Packit 26bf30
                        ],
Packit 26bf30
                    },
Packit 26bf30
                ],
Packit 26bf30
            },
Packit 26bf30
        ],
Packit 26bf30
    };
Packit 26bf30
Packit 26bf30
    $tree_creator->create_tree("./t/sample-data/", $tree);
Packit 26bf30
}
Packit 26bf30
Packit 26bf30
my $class;
Packit 26bf30
my $copy_fn = $tree_creator->get_path(
Packit 26bf30
    "./t/sample-data/FFRt-to/"
Packit 26bf30
);
Packit 26bf30
Packit 26bf30
my $lib_fn = $tree_creator->get_path(
Packit 26bf30
    "./t/sample-data/FFRt-to/lib/"
Packit 26bf30
);
Packit 26bf30
Packit 26bf30
my $FFR_t = $tree_creator->get_path(
Packit 26bf30
    "./t/sample-data/FFRt-to/File-Find-Rule.t"
Packit 26bf30
);
Packit 26bf30
my $findorule_t = $tree_creator->get_path(
Packit 26bf30
    "./t/sample-data/FFRt-to/findorule.t"
Packit 26bf30
);
Packit 26bf30
my $foobar_fn = $tree_creator->get_path(
Packit 26bf30
    "./t/sample-data/FFRt-to/foobar"
Packit 26bf30
);
Packit 26bf30
Packit 26bf30
my @tests = ($FFR_t, $findorule_t);
Packit 26bf30
Packit 26bf30
my @ateam_path =
Packit 26bf30
    map { $tree_creator->get_path("./t/sample-data/FFRt-to/$_") }
Packit 26bf30
    qw(
Packit 26bf30
        lib
Packit 26bf30
        lib/File
Packit 26bf30
        lib/File/Find
Packit 26bf30
        lib/File/Find/Object
Packit 26bf30
        lib/File/Find/Object/Rule
Packit 26bf30
        lib/File/Find/Object/Rule/Test
Packit 26bf30
        lib/File/Find/Object/Rule/Test/ATeam.pm
Packit 26bf30
    );
Packit 26bf30
Packit 26bf30
my $ATeam_pm_fn = $ateam_path[-1];
Packit 26bf30
Packit 26bf30
BEGIN {
Packit 26bf30
    $class = 'File::Find::Object::Rule';
Packit 26bf30
    # TEST
Packit 26bf30
    use_ok($class)
Packit 26bf30
}
Packit 26bf30
Packit 26bf30
Packit 26bf30
# on win32 systems the t/foobar file isn't 10 bytes it's 11, so the
Packit 26bf30
# previous tests on the magic number 10 failed.  rt.cpan.org #3838
Packit 26bf30
my $foobar_size = -s $foobar_fn;
Packit 26bf30
Packit 26bf30
my $f = $class->new;
Packit 26bf30
# TEST
Packit 26bf30
isa_ok($f, $class);
Packit 26bf30
Packit 26bf30
sub _run_find
Packit 26bf30
{
Packit 26bf30
    my $finder = shift;
Packit 26bf30
    return [ sort $finder->in($copy_fn) ];
Packit 26bf30
}
Packit 26bf30
Packit 26bf30
# name
Packit 26bf30
$f = $class->name( qr/\.t$/ );
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ @tests ],
Packit 26bf30
           "name( qr/\\.t\$/ )" );
Packit 26bf30
Packit 26bf30
{
Packit 26bf30
    # This test that starts returns the rule object.
Packit 26bf30
    # See: http://www.nntp.perl.org/group/perl.beginners/2012/04/msg120670.html
Packit 26bf30
    my $rule = $class->name( qr/\.t$/ )->start($copy_fn);
Packit 26bf30
Packit 26bf30
    my @results;
Packit 26bf30
    while (my $item = $rule->match()) {
Packit 26bf30
        push @results, $item;
Packit 26bf30
    }
Packit 26bf30
    # TEST
Packit 26bf30
    is_deeply(
Packit 26bf30
        [ @results ],
Packit 26bf30
        [ @tests ],
Packit 26bf30
        "->start() Test."
Packit 26bf30
    );
Packit 26bf30
}
Packit 26bf30
Packit 26bf30
$f = $class->name( 'foobar' );
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ $foobar_fn ],
Packit 26bf30
           "name( 'foobar' )" );
Packit 26bf30
Packit 26bf30
$f = $class->name( '*.t' );
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
          \@tests,
Packit 26bf30
          "name( '*.t' )" );
Packit 26bf30
Packit 26bf30
$f = $class->name( 'foobar', '*.t' );
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ @tests, $foobar_fn ],
Packit 26bf30
           "name( 'foobar', '*.t' )" );
Packit 26bf30
Packit 26bf30
$f = $class->name( [ 'foobar', '*.t' ] );
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ @tests, $foobar_fn ],
Packit 26bf30
           "name( [ 'foobar', '*.t' ] )" );
Packit 26bf30
Packit 26bf30
Packit 26bf30
Packit 26bf30
# exec
Packit 26bf30
$f = $class->exec(sub { length($_[0]) == 6 })->maxdepth(1);
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ $foobar_fn ],
Packit 26bf30
           "exec (short)" );
Packit 26bf30
Packit 26bf30
$f = $class->exec(sub { length($_[0]) > $foobar_size })->maxdepth(1);
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ $FFR_t ],
Packit 26bf30
           "exec (long)" );
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( maxdepth => 1, exec => sub { $_[2] eq $foobar_fn }, in => $copy_fn ) ],
Packit 26bf30
           [ $foobar_fn ],
Packit 26bf30
           "exec (check arg 2)" );
Packit 26bf30
Packit 26bf30
# name and exec, chained
Packit 26bf30
$f = $class
Packit 26bf30
  ->exec(sub { length > $foobar_size })
Packit 26bf30
  ->name( qr/\.t$/ );
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ $FFR_t ],
Packit 26bf30
           "exec(match) and name(match)" );
Packit 26bf30
Packit 26bf30
$f = $class
Packit 26bf30
  ->exec(sub { length > $foobar_size })
Packit 26bf30
  ->name( qr/foo/ )
Packit 26bf30
  ->maxdepth(1);
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ ],
Packit 26bf30
           "exec(match) and name(fail)" );
Packit 26bf30
Packit 26bf30
Packit 26bf30
# directory
Packit 26bf30
$f = $class
Packit 26bf30
  ->directory
Packit 26bf30
  ->maxdepth(1)
Packit 26bf30
  ->exec(sub { $_ !~ /(\.svn|CVS)/ }); # ignore .svn/CVS dirs
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ $copy_fn,$lib_fn,],
Packit 26bf30
           "directory autostub" );
Packit 26bf30
Packit 26bf30
Packit 26bf30
# any/or
Packit 26bf30
$f = $class->any( $class->exec( sub { length == 6 } ),
Packit 26bf30
                  $class->name( qr/\.t$/ )
Packit 26bf30
                        ->exec( sub { length > $foobar_size } )
Packit 26bf30
                )->maxdepth(1);
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ $FFR_t, $foobar_fn ],
Packit 26bf30
           "any" );
Packit 26bf30
Packit 26bf30
$f = $class->or( $class->exec( sub { length == 6 } ),
Packit 26bf30
                 $class->name( qr/\.t$/ )
Packit 26bf30
                       ->exec( sub { length > $foobar_size } )
Packit 26bf30
               )->maxdepth(1);
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ $FFR_t, $foobar_fn ],
Packit 26bf30
           "or" );
Packit 26bf30
Packit 26bf30
Packit 26bf30
# not/none
Packit 26bf30
$f = $class
Packit 26bf30
  ->file
Packit 26bf30
  ->not( $class->name( qr/^[^.]{1,8}(\.[^.]{0,3})?$/ ) )
Packit 26bf30
  ->maxdepth(1)
Packit 26bf30
  ->exec(sub { length == 6 || length > 11 });
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ $FFR_t ],
Packit 26bf30
           "not" );
Packit 26bf30
Packit 26bf30
# not as not_*
Packit 26bf30
$f = $class
Packit 26bf30
  ->file
Packit 26bf30
  ->not_name( qr/^[^.]{1,8}(\.[^.]{0,3})?$/ )
Packit 26bf30
  ->maxdepth(1)
Packit 26bf30
  ->exec(sub { length == 6 || length > 11 });
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ $FFR_t ],
Packit 26bf30
           "not_*" );
Packit 26bf30
Packit 26bf30
# prune/discard (.svn demo)
Packit 26bf30
# this test may be a little meaningless for a cpan release, but it
Packit 26bf30
# fires perfectly in my dev sandbox
Packit 26bf30
$f = $class->or( $class->directory
Packit 26bf30
                        ->name(qr/(\.svn|CVS)/)
Packit 26bf30
                        ->prune
Packit 26bf30
                        ->discard,
Packit 26bf30
                 $class->new->file );
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ @tests, $foobar_fn, $ATeam_pm_fn ],
Packit 26bf30
           "prune/discard .svn"
Packit 26bf30
         );
Packit 26bf30
Packit 26bf30
Packit 26bf30
# procedural form of the CVS demo
Packit 26bf30
$f = find(or => [ find( directory =>
Packit 26bf30
                        name      => qr/(\.svn|CVS)/,
Packit 26bf30
                        prune     =>
Packit 26bf30
                        discard   => ),
Packit 26bf30
                  find( file => ) ]);
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($f),
Packit 26bf30
           [ @tests, $foobar_fn, $ATeam_pm_fn ],
Packit 26bf30
           "procedural prune/discard .svn"
Packit 26bf30
         );
Packit 26bf30
Packit 26bf30
# size (stat test)
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( maxdepth => 1, file => size => $foobar_size, in => $copy_fn, ) ],
Packit 26bf30
           [ $foobar_fn ],
Packit 26bf30
           "size $foobar_size (stat)" );
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( maxdepth => 1, file => size => "<= $foobar_size",
Packit 26bf30
                   in => $copy_fn ) ],
Packit 26bf30
           [ $foobar_fn ],
Packit 26bf30
           "size <= $foobar_size (stat)" );
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( maxdepth => 1, file => size => "<".($foobar_size + 1),
Packit 26bf30
                   in => $copy_fn ) ],
Packit 26bf30
           [ $foobar_fn ],
Packit 26bf30
           "size <($foobar_size + 1) (stat)" );
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( maxdepth => 1, file => size => "<1K",
Packit 26bf30
                   exec => sub { length == 6 },
Packit 26bf30
                   in => $copy_fn ) ],
Packit 26bf30
           [ $foobar_fn ],
Packit 26bf30
           "size <1K (stat)" );
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( maxdepth => 1, file => size => ">3K", in => $copy_fn ) ],
Packit 26bf30
           [ $FFR_t ],
Packit 26bf30
           "size >3K (stat)" );
Packit 26bf30
Packit 26bf30
# these next two should never fail.  if they do then the testing fairy
Packit 26bf30
# went mad
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( file => size => ">3M", in => $copy_fn ) ],
Packit 26bf30
           [ ],
Packit 26bf30
           "size >3M (stat)" );
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( file => size => ">3G", in => $copy_fn ) ],
Packit 26bf30
           [ ],
Packit 26bf30
           "size >3G (stat)" );
Packit 26bf30
Packit 26bf30
Packit 26bf30
#min/maxdepth
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( maxdepth => 0, in => $copy_fn ) ],
Packit 26bf30
           [ $copy_fn ],
Packit 26bf30
           "maxdepth == 0" );
Packit 26bf30
Packit 26bf30
Packit 26bf30
Packit 26bf30
my $rule = find( or => [ find( name => qr/(\.svn|CVS)/,
Packit 26bf30
                               discard =>),
Packit 26bf30
                         find(),
Packit 26bf30
                        ],
Packit 26bf30
                 maxdepth => 1 );
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($rule),
Packit 26bf30
           [ $copy_fn, @tests, $foobar_fn, $lib_fn ],
Packit 26bf30
           "maxdepth == 1" );
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($rule),
Packit 26bf30
           [ $copy_fn, @tests, $foobar_fn, $lib_fn ],
Packit 26bf30
           "maxdepth == 1, trailing slash on the path" );
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($rule),
Packit 26bf30
           [ $copy_fn, @tests, $foobar_fn, $lib_fn ],
Packit 26bf30
           "maxdepth == 1, ./t" );
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( _run_find($rule),
Packit 26bf30
           [ $copy_fn, @tests, $foobar_fn, $lib_fn ],
Packit 26bf30
           "maxdepth == 1, ./././///./t" );
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ sort +find( or => [ find( name => qr/(\.svn|CVS)/,
Packit 26bf30
                                       prune =>
Packit 26bf30
                                       discard =>),
Packit 26bf30
                                 find( ),
Packit 26bf30
                               ],
Packit 26bf30
                         mindepth => 1,
Packit 26bf30
                         in => $copy_fn, ) ],
Packit 26bf30
           [ @tests, $foobar_fn, @ateam_path ],
Packit 26bf30
           "mindepth == 1" );
Packit 26bf30
Packit 26bf30
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ sort +find( or => [ find( name => qr/(\.svn|CVS)/,
Packit 26bf30
                                       discard =>),
Packit 26bf30
                                 find(),
Packit 26bf30
                               ],
Packit 26bf30
                         maxdepth => 1,
Packit 26bf30
                         mindepth => 1,
Packit 26bf30
                         in => $copy_fn, ) ],
Packit 26bf30
           [ @tests, $foobar_fn, $lib_fn ],
Packit 26bf30
           "maxdepth = 1 mindepth == 1" );
Packit 26bf30
Packit 26bf30
# extras
Packit 26bf30
my $ok = 0;
Packit 26bf30
find( extras => { preprocess => sub { my ($self, $list) = @_; $ok = 1; return $list; } }, in => $copy_fn );
Packit 26bf30
# TEST
Packit 26bf30
ok( $ok, "extras preprocess fired" );
Packit 26bf30
Packit 26bf30
#iterator
Packit 26bf30
$f = find( or => [ find( name => qr/(\.svn|CVS)/,
Packit 26bf30
                         prune =>
Packit 26bf30
                         discard =>),
Packit 26bf30
                   find(),
Packit 26bf30
                 ],
Packit 26bf30
           start => $copy_fn );
Packit 26bf30
Packit 26bf30
{
Packit 26bf30
my @found;
Packit 26bf30
while ($_ = $f->match) { push @found, $_ }
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ sort @found ], [ $copy_fn, @tests, $foobar_fn, @ateam_path ], "iterator" );
Packit 26bf30
}
Packit 26bf30
Packit 26bf30
# negating in the procedural interface
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( file => '!name' => qr/^[^.]{1,9}(\.[^.]{0,3})?$/,
Packit 26bf30
                   maxdepth => 1,
Packit 26bf30
                   in => $copy_fn ) ],
Packit 26bf30
           [ $FFR_t ],
Packit 26bf30
           "negating in the procedural interface" );
Packit 26bf30
Packit 26bf30
# grep
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( maxdepth => 1, file => grep => [ qr/bytes./, [ qr/.?/ ] ], in => $copy_fn ) ],
Packit 26bf30
           [ $foobar_fn ],
Packit 26bf30
           "grep" );
Packit 26bf30
Packit 26bf30
Packit 26bf30
Packit 26bf30
# relative
Packit 26bf30
# TEST
Packit 26bf30
is_deeply( [ find( 'relative', maxdepth => 1, name => 'foobar', in => $copy_fn ) ],
Packit 26bf30
           [ 'foobar' ],
Packit 26bf30
           'relative' );
Packit 26bf30
Packit 26bf30
Packit 26bf30
Packit 26bf30
# bootstrapping extensions via import
Packit 26bf30
Packit 26bf30
eval { $class->import(':Test::Elusive') };
Packit 26bf30
# TEST
Packit 26bf30
like( $@, qr/^couldn't bootstrap File::Find::Object::Rule::Test::Elusive/,
Packit 26bf30
      "couldn't find the Elusive extension" );
Packit 26bf30
Packit 26bf30
eval { $class->import(':Test::ATeam') };
Packit 26bf30
# TEST
Packit 26bf30
is ($@, "",  "if you can find them, maybe you can hire the A-Team" );
Packit 26bf30
# TEST
Packit 26bf30
can_ok( $class, 'ba' );
Packit 26bf30
Packit 26bf30
rmtree($tree_creator->get_path("./t/sample-data/FFRt-to"));