#!/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;