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