1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
use feature ':5.10';
use warnings;
use strict;
use Test::More tests => 10;
use POE;
BEGIN
{
use_ok('POE::Component::PubSub');
}
isa_ok(POE::Component::PubSub->new('pub_alias'), 'POE::Component::PubSub');
POE::Session->create
(
'inline_states' =>
{
'_start' => sub
{
$_[KERNEL]->alias_set('runner');
$_[KERNEL]->yield('continue');
},
'continue' => sub
{
make_publisher();
make_subscriber();
$_[KERNEL]->post('test1', 'fire');
},
}
);
POE::Kernel->run();
exit 0;
sub make_publisher()
{
POE::Session->create
(
'inline_states' =>
{
'_start' => sub
{
$_[KERNEL]->alias_set('test1');
$_[KERNEL]->yield('publisher');
},
'publisher' => sub
{
$_[KERNEL]->post('pub_alias', 'publish', 'foo');
$_[KERNEL]->post('pub_alias', 'publish', 'bar', +PUBLISH_INPUT, 'input');
pass('Published');
},
'fire' => sub
{
$_[KERNEL]->post('pub_alias', 'foo', 'ARGUMENT');
pass('Event fired');
},
'input' => sub
{
pass('input event fired');
if(defined($_[ARG0]))
{
if($_[ARG0] == 1)
{
pass('input argument okay');
$_[KERNEL]->alias_remove('test1');
$_[KERNEL]->call('pub_alias', 'destroy');
$_[KERNEL]->yield('destroyed');
return;
}
}
fail('input argument not okay');
},
'destroyed' => sub
{
if(!$_[KERNEL]->post('pub_alias', 'nonexistant_events'))
{
pass('destroy works');
}
else
{
fail('destroy does not work appropriate');
}
}
}
);
}
sub make_subscriber()
{
POE::Session->create
(
'inline_states' =>
{
'_start' => sub
{
$_[KERNEL]->alias_set('test2');
$_[KERNEL]->yield('subscriber');
},
'subscriber' => sub
{
$_[KERNEL]->post('pub_alias', 'subscribe', 'foo', 'fired_event');
pass('Subscribed');
},
'fired_event' => sub
{
pass('Event received');
ok($_[ARG0] eq 'ARGUMENT', 'Argument passed successfully');
$_[KERNEL]->post('pub_alias', 'bar', 1);
$_[KERNEL]->alias_remove('test2');
}
}
);
}
|