Beam-Emitter

 view release on metacpan or  search on metacpan

t/emitter.t  view on Meta::CPAN


use strict;
use warnings;
use Test::More;
use Test::Fatal;

use Scalar::Util qw[ refaddr ];

{
    package My::Emitter;

    use Moo;
    with 'Beam::Emitter';

    sub foo {
        my ( $self ) = @_;
        my $event = $self->emit( "foo" );
        return if $event->is_default_stopped;
        $self->emit( "after_foo" );
    }
}

subtest 'event listeners' => sub {
    my $emitter = My::Emitter->new;
    my $foo_listener = sub {
        my ( $event ) = @_;
        is $event->name, 'foo', 'foo event has correct name';
        is $event->emitter, $emitter, 'foo event has correct emitter';
    };
    my $after_foo_listener = sub {
        my ( $event ) = @_;
        is $event->name, 'after_foo', 'after_foo event has correct name';
        is $event->emitter, $emitter, 'after_foo event has correct emitter';
    };
    $emitter->on( foo => $foo_listener );
    $emitter->subscribe( after_foo => $after_foo_listener );
    $emitter->foo;
};

subtest 'unsubscribe' => sub {
    my $emitter = My::Emitter->new;
    my $foo_count = 0;
    my $foo_listener = sub {
        my ( $event ) = @_;
        if ( $foo_count++ == 0 ) {
            is $event->name, 'foo', 'foo event has correct name';
            is $event->emitter, $emitter, 'foo event has correct emitter';
        }
        else {
            fail "foo listener not called a second time";
        }
    };
    my $after_foo_count = 0;
    my $after_foo_listener = sub {
        my ( $event ) = @_;
        if ( $after_foo_count++ == 0 ) {
            is $event->name, 'after_foo', 'after_foo event has correct name';
            is $event->emitter, $emitter, 'after_foo event has correct emitter';
        }
        else {
            fail "after_foo listener not called a second time";
        }
    };
    $emitter->on( foo => $foo_listener );
    $emitter->subscribe( after_foo => $after_foo_listener );



( run in 1.177 second using v1.01-cache-2.11-cpan-54e63673c56 )