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
|
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
use Future;
# Result transformation
{
my $f1 = Future->new;
my $future = $f1->transform(
done => sub { result => @_ },
);
$f1->done( 1, 2, 3 );
is_deeply( [ $future->get ], [ result => 1, 2, 3 ], '->transform result' );
}
# Failure transformation
{
my $f1 = Future->new;
my $future = $f1->transform(
fail => sub { "failure\n" => @_ },
);
$f1->fail( "something failed\n" );
is_deeply( [ $future->failure ], [ "failure\n" => "something failed\n" ], '->transform failure' );
}
# code dies
{
my $f1 = Future->new;
my $future = $f1->transform(
done => sub { die "It fails\n" },
);
$f1->done;
is_deeply( [ $future->failure ], [ "It fails\n" ], '->transform catches exceptions' );
}
# Cancellation
{
my $f1 = Future->new;
my $cancelled;
$f1->on_cancel( sub { $cancelled++ } );
my $future = $f1->transform;
$future->cancel;
is( $cancelled, 1, '->transform cancel' );
}
# Void context raises a warning
{
my $warnings;
local $SIG{__WARN__} = sub { $warnings .= $_[0]; };
Future->done->transform(
done => sub { }
);
like( $warnings,
qr/^Calling ->transform in void context at /,
'Warning in void context' );
}
done_testing;
|