The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use warnings;
use Test::More;
use Data::Dumper;
use IO::Scalar;
use Test::Exception;

BEGIN {
  eval "use 5.010";
  plan skip_all => "perl 5.10 required for testing" if $@;

  use_ok( "Bio::Gonzales::Matrix::IO", 'miterate', 'mslurp', 'mspew', 'dict_slurp' );
}

my $data = <<EOD;
a\tb\tc
#d\te\tf

nix
EOD

{
  my $sh = new IO::Scalar \$data;

  my $mit = miterate($sh);
  is_deeply( $mit->(), [ 'a', 'b', 'c' ], 'first line' );
  is( $mit->()->[0], 'nix', 'second line' );
  is( $mit->(),      undef, 'last line' );

  $sh->close;
}
{
  my $sh = new IO::Scalar \$data;

  my $mit = miterate( $sh, { skip => 1 } );
  is_deeply( $mit->(), ['nix'], 'first line' );
  is( $mit->(), undef, 'second line' );

  $sh->close;
}

{
  my $data = <<EOF;
1\t2\t3\t4
5\t6\t7\t8
EOF
  my $sh = IO::Scalar->new( \$data );
  my $m = mslurp( $sh, { col_idx => [ 0, 2 ] } );
  $sh->close;
  is_deeply( $m, [ [ 1, 3 ], [ 5, 7 ] ] );
}

{
  my $data = <<EOF;
1\t2\t3\t4
5\t6\t7\t8
EOF
  my $sh = IO::Scalar->new( \$data );
  my $m  = mslurp($sh);
  $sh->close;
  is_deeply( $m, [ [ 1, 2, 3, 4 ], [ 5, 6, 7, 8 ] ] );
}
{
  my $data;
  my $sh = IO::Scalar->new( \$data );
  my $fh = \*STDOUT;
  my $m  = mspew( $fh, [], { header => [qw/a b/] } );
  #is_deeply($m, [[1,2,3,4],[5,6,7,8]]);
}
{
  my $data = <<EOF;
1\t2\t3\t4
5\t6\t7\t8
EOF
  my $sh = IO::Scalar->new( \$data );
  my $m = dict_slurp( $sh, { key_idx => 1, val_idx => 0 } );
  $sh->close;
  is_deeply( $m, { 2 => [1], 6 => [5] } );
}
{
  my $data = <<EOF;
c1;c2
a;a1
b;b1
c;c1
c;c2
EOF
  my $sh = IO::Scalar->new( \$data );
  dies_ok {dict_slurp( $sh, { key_idx => 0, val_idx => 1, uniq => 1, strict => 1, sep => ';' } )};
  $sh->close;
  my $sh2 = IO::Scalar->new( \$data );
  my $m = dict_slurp( $sh2, { key_idx => 0, val_idx => 1, uniq => 1, strict => 0, sep => ';' } );
  $sh2->close;
  is_deeply( $m, { c1 => 'c2', a => 'a1', b => 'b1', c => 'c2' } );
}
{
  my $data = <<EOF;
1\t2\t3\t4
5\t6\t7\t8
EOF
  my $sh = IO::Scalar->new( \$data );
  my $m = dict_slurp( $sh, { key_idx => 1, val_idx => [ 0, 2 ] } );
  $sh->close;
  is_deeply( $m, { 2 => [ [ 1, 3 ] ], 6 => [ [ 5, 7 ] ] } );
}
{
  my $data = <<EOF;
1\t2\t3\t4
5\t6\t7\t8
EOF
  my $sh = IO::Scalar->new( \$data );
  my $m = dict_slurp( $sh, { key_idx => 1, val_idx => [ 0, 2 ], uniq => 1 } );
  $sh->close;
  is_deeply( $m, { 2 => [ 1, 3 ], 6 => [ 5, 7 ] } );
}

{
  my $data = <<EOF;
1\t2\t3\t4
5\t6\t7\t8
EOF
  my $sh = IO::Scalar->new( \$data );
  my $m  = dict_slurp(
    $sh,
    {
      key_idx       => 1,
      val_idx       => [ 0, 2 ],
      uniq          => 1,
      record_filter => sub { $_[0] =~ /3/ }
    }
  );
  $sh->close;
  is_deeply( $m, { 2 => [ 1, 3 ] } );
}

done_testing();