#!/usr/bin/perl use strict; use warnings; use Test::More; use Test::Fatal; use Test::Refcount; use IO::Async::Notifier; use Future; my ( $err, $name, @detail ); my $notifier = IO::Async::Notifier->new( on_error => sub { ( undef, $err, $name, @detail ) = @_; }, ); # done { my $f = Future->new; $notifier->adopt_future( $f ); is_refcount( $f, 2, '$f has refcount 2 after ->adopt_future' ); is_oneref( $notifier, '$notifier still has refcount 1 after ->adopt_future' ); $f->done( "result" ); is_refcount( $f, 1, '$f has refcount 1 after $f->done' ); } # fail { my $f = Future->new; $notifier->adopt_future( $f ); $f->fail( "It failed", name => 1, 2, 3 ); is( $err, "It failed", '$err after $f->fail' ); is( $name, "name", '$name after $f->fail' ); is_deeply( \@detail, [ 1, 2, 3 ], '@detail after $f->fail' ); is_refcount( $f, 1, '$f has refcount 1 after $f->fail' ); undef $err; $f = Future->new; $notifier->adopt_future( $f->else_done() ); $f->fail( "Not captured" ); ok( !defined $err, '$err not defined after ->else_done suppressed failure' ); } done_testing;