1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
#!/usr/bin/perl
use v5.14;
use warnings;
use Test2::V0;
use Future;
use Future::Utils qw( fmap_concat fmap_scalar );
# fmap_concat no concurrency
{
my @subf;
my $future = fmap_concat {
return $subf[$_[0]] = Future->new
} foreach => [ 0 .. 2 ];
my @results;
$future->on_done( sub { @results = @_ });
$subf[0]->done( "A", "B" );
$subf[1]->done( "C", "D", );
$subf[2]->done( "E" );
ok( $future->is_ready, '$future now ready after subs done for fmap_concat' );
is( [ $future->result ], [qw( A B C D E )], '$future->result for fmap_concat' );
is( \@results, [qw( A B C D E )], '@results for fmap_concat' );
}
# fmap_concat concurrent
{
my @subf;
my $future = fmap_concat {
return $subf[$_[0]] = Future->new
} foreach => [ 0 .. 2 ],
concurrent => 3;
# complete out of order
$subf[0]->done( "A", "B" );
$subf[2]->done( "E" );
$subf[1]->done( "C", "D" );
is( [ $future->result ], [qw( A B C D E )], '$future->result for fmap_concat out of order' );
}
# fmap_concat concurrent above input
{
my @subf;
my $future = fmap_concat {
return $subf[$_[0]] = Future->new;
} foreach => [ 0 .. 2 ],
concurrent => 5;
$subf[0]->done( "A" );
$subf[1]->done( "B" );
$subf[2]->done( "C" );
is( [ $future->result ], [qw( A B C )], '$future->result for fmap_concat concurrent more than input' );
}
# fmap_concat cancel
{
my $f = Future->new;
my $fmap = fmap_concat { $f }
foreach => [ $f ],
concurrent => 2;
ok( lives { $fmap->cancel },
'$fmap_concat->cancel does not throw on undef slots' );
ok( $fmap->is_cancelled, 'was cancelled correctly' );
}
# fmap_scalar no concurrency
{
my @subf;
my $future = fmap_scalar {
return $subf[$_[0]] = Future->new
} foreach => [ 0 .. 2 ];
my @results;
$future->on_done( sub { @results = @_ });
$subf[0]->done( "A" );
$subf[1]->done( "B" );
$subf[2]->done( "C" );
ok( $future->is_ready, '$future now ready after subs done for fmap_scalar' );
is( [ $future->result ], [qw( A B C )], '$future->result for fmap_scalar' );
is( \@results, [qw( A B C )], '@results for fmap_scalar' );
}
done_testing;
|