summaryrefslogtreecommitdiff
path: root/t/05then-else.t
diff options
context:
space:
mode:
Diffstat (limited to 't/05then-else.t')
-rw-r--r--t/05then-else.t78
1 files changed, 78 insertions, 0 deletions
diff --git a/t/05then-else.t b/t/05then-else.t
new file mode 100644
index 0000000..ff35ac7
--- /dev/null
+++ b/t/05then-else.t
@@ -0,0 +1,78 @@
+#!/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;