Badger

 view release on metacpan or  search on metacpan

t/filesystem/visitor.t  view on Meta::CPAN

    files       => sub { my $size = shift->size; $size >= 100 && $size < 420 },
    in_dirs     => 1,
    not_in_dirs => '.svn',
)->collect;

print STDERR "medium files: \n", join("\n  ", @files), "\n" if $DEBUG;

is( scalar @files, 3, 'got 3 medium files' );
is( join(' ', sort map { $_->name } @files), 
    'badger goodbye.txt medium',
    'got all small files' );

# large files
@files = $vdir->visit( 
    dirs        => 0, 
    files       => sub { shift->size > 420 },
    in_dirs     => 1,
    not_in_dirs => ['.svn', 'tmp'],
)->collect;

print STDERR "large files: \n", join("\n  ", @files), "\n" if $DEBUG;

is( scalar @files, 3, 'got 3 large files' );
is( join(' ', sort map { $_->name } @files), 
    'goodbye.html hello.html large',
    'got all large files' );

# directories containing a README file
@files = $vdir->visit( 
    dirs        => sub { shift->file('README')->exists },
    files       => 0,
    in_dirs     => 1,
    not_in_dirs => '.svn',
)->collect;

print STDERR "dirs with README files: \n", join("\n  ", @files), "\n" if $DEBUG;

is( scalar @files, 1, 'got 1 dir with README' );
is( join(' ', sort map { $_->name } @files), 
    'tmp',
    'got all dirs with README files in' );



#-----------------------------------------------------------------------
# all-in-one test with default arguments
#-----------------------------------------------------------------------

@files = grep { $_ !~ /svn/ } $vdir->collect;

print STDERR "default files: \n", join("\n  ", @files), "\n" if $DEBUG;

is( scalar @files, 6, 'got  default files' );
is( join(' ', sort map { $_->name } @files), 
    'large medium one small tmp two',
    'got all default files' );



#-----------------------------------------------------------------------
# visitor callbacks
#-----------------------------------------------------------------------

my $n = 0;
@files = $vdir->visit(
    accept_file => sub { $n++ }
);
is( $n, 3, 'visited three files via a callback' );



#-----------------------------------------------------------------------
# subclass
#-----------------------------------------------------------------------

package My::Test::Visitor;
use base 'Badger::Filesystem::Visitor';

our $FILES       = qr/^good/;
our $DIRS        = 0;
our $IN_DIRS     = 1;
our $NOT_IN_DIRS = ['.svn', 'tmp'];

package main;

@files = $vdir->collect( My::Test::Visitor->new );
print STDERR "subclass files: \n", join("\n  ", @files), "\n" if $DEBUG;
is( join(' ', sort map { $_->name } @files), 
    'goodbye.bak goodbye.html goodbye.txt',
    'got all subclass files' );



( run in 0.914 second using v1.01-cache-2.11-cpan-140bd7fdf52 )