The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use v5.10;
use Moose;

use lib 't/lib';

use Test::More tests => 14;
use Bot::Backbone::TestEventLoop;

{
    package TestBot;
    use Bot::Backbone;

    use Test::More;

    service chat => (
        service    => 'TestChat',
        dispatcher => 'test',
    );

    dispatcher test => as {
        command 'one' => run_this { pass('command, run_this'); };
        command 'two' => to_me run_this { pass('command, to_me, run_this'); };
        command 'three' => not_to_me run_this { pass('command, not_to_me, run_this'); };
        command 'four' => spoken run_this { pass('command, spoken, run_this'); };
        command 'five' => shouted run_this { pass('command, shouted, run_this'); };
        command 'six' => whispered run_this { pass('command, whispered, run_this'); };
        command 'seven' => given_parameters {
            parameter 'a' => ( match => qr/\d+/ );
        } run_this { 
            my ($bot, $m) = @_;
            is($m->parameters->{a}, 7, 'command, whispered, run_this, given_parameters');
        };
        also command 'seven' => run_this { pass('also, command, run_this') };
        command 'eight' => run_this_method 'do_eight';
        command 'nine' => respond {
            pass('command, respond');
            return 'nine';
        };
        command 'ten' => respond_by_method 'do_ten';
        not_command run_this { pass('not_command, run_this'); };
    };

    sub do_eight {
        pass('command, run_this_method');
    }

    sub do_ten {
        ok('command, respond_by_method');
        return 'ten';
    }
}

my $bot = TestBot->new( event_loop => 'Bot::Backbone::TestEventLoop' );
$bot->run;

my $chat = $bot->get_service('chat');
$chat->dispatch( text => 'one' );
$chat->dispatch( text => 'two' );
$chat->dispatch( text => 'three' );
$chat->dispatch( text => 'four' );
$chat->dispatch( text => 'five' );
$chat->dispatch( text => 'six' );
$chat->dispatch( text => 'seven' );
$chat->dispatch( text => 'seven 7' );
$chat->dispatch( text => 'eight' );
$chat->dispatch( text => 'nine' );
is($chat->mq_count, 1, 'nine responded');
is($chat->mq->[0]->{text}, 'nine', 'nine replied nine');
$chat->dispatch( text => 'ten' );
is($chat->mq_count, 2, 'ten responded');
is($chat->mq->[1]->{text}, 'ten', 'ten replied ten');
$chat->dispatch( text => 'something else' );