File: 36utils-map.t

package info (click to toggle)
libfuture-perl 0.52-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 676 kB
  • sloc: perl: 4,636; makefile: 2
file content (92 lines) | stat: -rw-r--r-- 2,219 bytes parent folder | download | duplicates (2)
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;