The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests=>71;
use File::Spec;
use strict;

use lib 't';
use BackendModule;

BEGIN { use_ok(MODULE) };

do {
  #No options, explicit method calls
  my $list = MODULE->new( File::Spec->join('t','data','n'));
  isa_ok($list, MODULE);

  my %save;
  my $prefix = quotemeta(File::Spec->join('t','data','n'));

  for my $i (1 .. 4) {
    ok( $list->next, "got $i" );
    $save{ $list->get } = $i;
    like($list->get, qr/$prefix/, "File $i matched prefix");
  }
  ok(not(defined($list->next)), "no more files");
  for my $i (1..3) {
    ok( $save{ File::Spec->join('t','data','n',$i) }, "found $i" );
  }
  ok( $save{ File::Spec->join('t','data','n','n2', 4) }, "found 4" );
};

do {
  #default options, explicit method calls
  my $list = MODULE->new( File::Spec->join('t','data','n'));
  $list->show_directories(0);
  $list->show_dotfiles(0);

  my %save;
  my $prefix = quotemeta(File::Spec->join('t','data','n'));

  for my $i (1 .. 4) {
    ok( $list->next, "got $i" );
    $save{ $list->get } = $i;
    like($list->get, qr/$prefix/, "File $i matched prefix");
  }
  ok(not(defined($list->next)), "no more files");
  for my $i (1..3) {
    ok( $save{ File::Spec->join('t','data','n',$i) }, "found $i" );
  }
  ok( $save{ File::Spec->join('t','data','n','n2', 4) }, "found 4" );
};

do {
  #No options, overloaded operator
  my $list = MODULE->new( File::Spec->join('t','data','n'));

  my %save;
  my $file;
  my $i1=0;
  while ($file = <$list>) {
    $save{ $file } = ++$i1;
  }
  is( keys(%save), 4, "Got 4 files from iterator" );
  for my $i (1..3) {
    ok( $save{ File::Spec->join('t','data','n',$i) }, "found $i" );
  }
};

do {
  #show_dotfiles
  my $list = MODULE->new( File::Spec->join('t','data','n'));
  $list->show_dotfiles(1);

  my %save;
  for my $i (1 .. 5) {
    ok( $list->next, "got $i" );
    $save{ $list->get } = $i;
    like($list->get, qr:t/data/n:);
  }
  ok(not(defined($list->next)), "no more files");
  for my $i (1..3, '.dot') {
    ok( $save{ File::Spec->join('t','data','n',$i) }, "found $i" );
  }

};

do {
  #not recursive
  my $list = MODULE->new( File::Spec->join('t','data'));
  $list->recursive(0);
  $list->show_directories(1);

  ok ( $list->next, "got the dir" );
  ok(not(defined($list->next)), "no more files without recursive");
};

do {
  #show_directories, no prune
  my $list = MODULE->new( File::Spec->join('t','data'));
  $list->show_directories(1);

  my $n_dirs;
  my %save;
  my $prefix = quotemeta(File::Spec->join('t','data','n'));

  for my $i (1 .. 6) {
    ok( $list->next, "got $i" );
    $save{ $list->get } = $i;
    like($list->get, qr/$prefix/, "File $i matched prefix");
    ++ $n_dirs if $list->is_directory;
  }
  is ($n_dirs, 2, 'found 2 dirs');
  ok(not(defined($list->next)), "no more files");
  for my $i (1..3) {
    ok( $save{ File::Spec->join('t','data','n',$i) }, "found $i" );
  }
    ok( $save{ File::Spec->join('t','data','n') }, "found n" );
};

do {
  #show_directories + prune_directory
  my $list = MODULE->new( File::Spec->join('t','data', 'n'));
  $list->show_directories(1);

  my $count=0;
  while ( $list->next ) {
	  next unless $list->is_directory;
	  ok( $list->is_directory , "Is directory");
	  is (
	    $list->prune_directory, 
	    File::Spec->join('t','data', 'n', 'n2'),
	    'pruned right dir'
	   );
	  ++ $count;
  }
  is ($count, 1, 'found 1 file');
};

do {
  #show_directories + prune
  my $list = MODULE->new( File::Spec->join('t','data', 'n'));

  my $count=0;
  while ( $list->next ) {
    if ( $list->get eq File::Spec->join('t','data', 'n', 'n2', 4)) {
      $list->prune;
      next;
    }
    ++ $count;
  }
  is ($count, 3, 'found 3 files after pruning');
};