07_abortable_callbacks.t [plain text]
use strict;
use Test::More qw(no_plan);
use IO::Scalar;
use lib 't/lib';
use Foo;
ok( Foo->add_trigger(
name => 'before_foo',
callback => sub { print "before_foo\n" }
),
'add_trigger in Foo'
);
ok( Foo->add_trigger(
callback => sub { print "after_foo\n" },
name => 'after_foo', # change the param order to test from hash -> list
),
'add_trigger in foo'
);
my $foo = Foo->new;
{
my $out;
tie *STDOUT, 'IO::Scalar', \$out;
$foo->foo;
is $out, "before_foo\nfoo\nafter_foo\n";
}
ok( Foo->add_trigger(
name => 'after_foo',
callback => sub { print "after_foo2\n" }
),
'add_trigger in Foo'
);
{
tie *STDOUT, 'IO::Scalar', \my $out;
$foo->foo;
is $out, "before_foo\nfoo\nafter_foo\nafter_foo2\n";
}
ok( Foo->add_trigger(
name => 'after_foo',
callback => sub { print ref $_[0] }
),
'add_trigger in Foo'
);
{
tie *STDOUT, 'IO::Scalar', \my $out;
$foo->foo;
is $out, "before_foo\nfoo\nafter_foo\nafter_foo2\nFoo", 'class name';
}
ok( Foo->add_trigger(
name => 'after_foo',
callback => sub { print "\ngets_here"; return 'YAY'; },
abortable => 1
),
'add_trigger in Foo'
);
{
tie *STDOUT, 'IO::Scalar', \my $out;
is( $foo->foo, 4, "Success returned" );
is_deeply ($foo->last_trigger_results->[-1], ['YAY']);
is $out,
"before_foo\nfoo\nafter_foo\nafter_foo2\nFoo\ngets_here",
'class name';
}
ok( Foo->add_trigger(
name => 'after_foo',
callback => sub { print "\nstopping_after"; return undef; },
abortable => 1
),
'add_trigger in Foo'
);
ok( Foo->add_trigger(
name => 'after_foo',
callback => sub { print "should not get here" }
),
'add_trigger in Foo'
);
{
tie *STDOUT, 'IO::Scalar', \my $out;
is( $foo->foo, undef, "The lat thing we ran was 'stopping_after', then returned failure " );
is $out,
"before_foo\nfoo\nafter_foo\nafter_foo2\nFoo\ngets_here\nstopping_after",
'class name';
unlike( $out, qr/should not get here/ );
}
# coverage tests
{
# pass a non-code ref and catch the carp
my @die;
eval {
local $SIG{__DIE__} = sub { push @die, @_ };
Foo->add_trigger(
name => 'wrong_type',
callback => []
);
};
like(
pop(@die),
qr(add_trigger[(][)] needs coderef at ),
'check for right callback param'
);
}