#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
use Test::Fatal;
use Future;
# then done
{
my $f1 = Future->new;
my $fdone;
my $fseq = $f1->then(
sub {
is( $_[0], "f1 result", '2-arg then done block passed result of $f1' );
return $fdone = Future->new;
},
sub {
die "then fail block should not be invoked";
},
);
$f1->done( "f1 result" );
ok( defined $fdone, '$fdone now defined after $f1 done' );
$fdone->done( results => "here" );
ok( $fseq->is_ready, '$fseq is done after $fdone done' );
is_deeply( [ $fseq->get ], [ results => "here" ], '$fseq->get returns results' );
}
# then fail
{
my $f1 = Future->new;
my $ffail;
my $fseq = $f1->then(
sub {
die "then done block should not be invoked";
},
sub {
is( $_[0], "The failure\n", '2-arg then fail block passed failure of $f1' );
return $ffail = Future->new;
},
);
$f1->fail( "The failure\n" );
ok( defined $ffail, '$ffail now defined after $f1 fail' );
$ffail->done( fallback => "result" );
ok( $fseq->is_ready, '$fseq is done after $ffail fail' );
is_deeply( [ $fseq->get ], [ fallback => "result" ], '$fseq->get returns results' );
}
# then done fails doesn't trigger fail block
{
my $f1 = Future->new;
my $fdone;
my $fseq = $f1->then(
sub { $fdone = Future->new; },
sub { die "then fail block should not be invoked"; },
);
$f1->done( "Done" );
$fdone->fail( "The failure\n" );
ok( $fseq->is_ready, '$fseq is ready after $fdone fail' );
ok( scalar $fseq->failure, '$fseq failed after $fdone fail' );
}
done_testing;