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