# $Id: 010-basic.t 2701 2007-10-04 20:31:37Z andy $
use strict;
use warnings;
use Test::More tests => 13;
use Parallel::Iterator qw( iterate iterate_as_array iterate_as_hash );
sub array_iter {
my @ar = @_;
my $pos = 0;
return sub {
return if $pos >= @ar;
my @r = ( $pos, $ar[$pos] );
$pos++;
return @r;
};
}
sub fill_array_from_iter {
my $iter = shift;
my @ar = ();
while ( my ( $pos, $value ) = $iter->() ) {
# die "Value for $pos is undef!\n" unless defined $value;
$ar[$pos] = $value;
}
return @ar;
}
{
my @ar = ( 1 .. 5 );
my $iter = array_iter( @ar );
my @got = fill_array_from_iter( $iter );
is_deeply \@got, \@ar, 'iterators';
}
for my $workers ( 0, 1, 2, 10 ) {
my @nums = ( 1 .. 100 );
my @double = map $_ * 2, @nums;
my $done = 0;
my $double_iter = iterate(
{
workers => $workers,
nowarn => 1
},
sub {
my ( $id, $job ) = @_;
return $job * 2;
},
array_iter( @nums )
);
my @got = fill_array_from_iter( $double_iter );
is_deeply \@got, \@double, "double, $workers workers";
}
# Array iterator
{
my @input = ( 1 .. 5 );
my @quad = map $_ * 4, @input;
my $quad_iter = iterate(
{
workers => 1,
nowarn => 1
},
sub {
my ( $id, $job ) = @_;
return $job * 4;
},
\@input
);
my @got = fill_array_from_iter( $quad_iter );
is_deeply \@got, \@quad, "array iterator";
}
# iterate_as_array
{
my @input = ( 1 .. 5 );
my @quad = map $_ * 4, @input;
my @got = iterate_as_array(
{
workers => 1,
nowarn => 1
},
sub {
my ( $id, $job ) = @_;
return $job * 4;
},
\@input
);
is_deeply \@got, \@quad, "array iterator";
}
# Hash iterator
{
my %input = (
one => 1,
three => 3,
five => 5,
seven => 7,
nine => 9
);
my $treble_iter = iterate(
{
workers => 1,
nowarn => 1
},
sub {
my ( $key, $job ) = @_;
return $job * 3;
},
\%input
);
my %expect = %input;
$_ *= 3 for values %expect;
my %output;
while ( my ( $k, $v ) = $treble_iter->() ) {
$output{$k} = $v;
}
is_deeply \%output, \%expect, "iterate_as_array";
}
# iterate_as_hash
{
my %input = (
one => 1,
three => 3,
five => 5,
seven => 7,
nine => 9
);
my %output = iterate_as_hash(
{
workers => 1,
nowarn => 1
},
sub {
my ( $key, $job ) = @_;
return $job * 3;
},
\%input
);
my %expect = %input;
$_ *= 3 for values %expect;
is_deeply \%output, \%expect, "iterate_as_hash";
}
# Empty input
{
my @input = ();
my @got = iterate_as_array(
{
workers => 1,
nowarn => 1
},
sub {
my ( $id, $job ) = @_;
return $job * 5;
},
\@input
);
is_deeply \@got, \@input, "array iterator";
}
# Die
{
my @input = ( 1 .. 5 );
my $iter = iterate(
{
workers => 1,
nowarn => 1
},
sub {
my ( $id, $job ) = @_;
die "Oops";
},
\@input
);
eval { $iter->() };
like $@, qr{Oops}, "died OK";
}
# Warn
{
my @input = ( 1 .. 5 );
my $iter = iterate(
{
workers => 1,
onerror => 'warn',
nowarn => 1
},
sub {
my ( $id, $job ) = @_;
die "Oops";
},
\@input
);
my @warning;
local $SIG{__WARN__} = sub {
push @warning, @_;
};
$iter->();
like $warning[0], qr{Oops}, "warned OK";
}
# Callback
{
my @input = ( 1 .. 5 );
my @warning;
my $iter = iterate(
{
workers => 1,
onerror => sub { push @warning, @_ },
nowarn => 1
},
sub {
my ( $id, $job ) = @_;
die "Oops";
},
\@input
);
$iter->();
like $warning[1], qr{Oops}, "warned OK";
}
1;