1use strict;
2use warnings FATAL => 'all';
3use lib 't/inc';
4use POE;
5use POE::Component::IRC;
6use POE::Component::Server::IRC;
7use Test::More tests => 7;
8
9my $bot = POE::Component::IRC->spawn(Flood => 1);
10my $ircd = POE::Component::Server::IRC->spawn(
11    Auth      => 0,
12    AntiFlood => 0,
13);
14
15POE::Session->create(
16    package_states => [
17        main => [qw(
18            _start
19            ircd_listener_add
20            ircd_listener_failure
21            _shutdown
22            irc_registered
23            irc_connected
24            irc_001
25            irc_error
26            irc_disconnected
27            irc_shutdown
28        )],
29    ],
30);
31
32$poe_kernel->run();
33
34sub _start {
35    my ($kernel) = $_[KERNEL];
36    $ircd->yield('register', 'all');
37    $ircd->yield('add_listener');
38    $kernel->delay(_shutdown => 60, 'Timed out');
39}
40
41sub ircd_listener_failure {
42    my ($kernel, $op, $reason) = @_[KERNEL, ARG1, ARG3];
43    $kernel->yield('_shutdown', "$op: $reason");
44}
45
46sub ircd_listener_add {
47    my ($kernel, $heap, $session, $port) = @_[KERNEL, HEAP, SESSION, ARG0];
48    $kernel->signal($kernel, 'POCOIRC_REGISTER', $session, 'all');
49    $heap->{port} = $port;
50}
51
52sub irc_registered {
53    my ($heap, $irc) = @_[HEAP, ARG0];
54    pass('Registered');
55    isa_ok($irc, 'POE::Component::IRC');
56
57    $irc->yield(connect => {
58        nick    => 'TestBot',
59        server  => '127.0.0.1',
60        port    => $heap->{port},
61    });
62}
63
64sub irc_connected {
65    pass('Connected');
66}
67
68sub irc_001 {
69    my ($kernel, $sender, $text) = @_[KERNEL, SENDER, ARG1];
70    my $irc = $sender->get_heap();
71    pass('Logged in');
72    $irc->yield('quit');
73}
74
75sub irc_error {
76    pass('irc_error');
77}
78
79sub irc_disconnected {
80    pass('irc_disconnected');
81    $poe_kernel->yield('_shutdown');
82}
83
84sub _shutdown {
85    my ($kernel, $error) = @_[KERNEL, ARG0];
86    fail($error) if defined $error;
87
88    $kernel->alarm_remove_all();
89    $ircd->yield('shutdown');
90    $kernel->signal($kernel, 'POCOIRC_SHUTDOWN');
91}
92
93sub irc_shutdown {
94    pass('irc_shutdown');
95}
96