use strict;
use warnings;
use Test::More;
use File::Temp qw<tempdir tempfile>;
use File::Slurp qw<slurp>;
use Bot::Training;
use Hailo;
plan skip_all => "This test is known to fail on OpenBSD" if $^O eq 'openbsd';
plan tests => 815;
# Dir to store our brains
my $dir = tempdir( "hailo-test-dbd-so-XXXX", CLEANUP => 1, TMPDIR => 1 );
my ($fh, $brain_file) = tempfile( DIR => $dir, SUFFIX => '.sqlite', EXLOCK => 0 );
my $trainfile = Bot::Training->new->file("starcraft")->file;
my @train = split /\n/, slurp($trainfile);
my $initial_order = 3;
{
ok(-f $brain_file, "$brain_file is still -f");
my $hailo = Hailo->new(
brain => $brain_file,
order => $initial_order,
);
ok($hailo, "Construct a new Hailo with a non-standard order");
is($hailo->order, $initial_order, "order = $initial_order");
$hailo->train(\@train);
my ($tokens) = $hailo->stats;
is($tokens, 395, "Hailo now knows about 395 tokens");
}
{
ok(-f $brain_file, "$brain_file is still -f");
my $hailo = Hailo->new(
brain => $brain_file,
);
ok($hailo, "Construct a new Hailo from an existing brain");
is($hailo->order, 2, "Standard order is still 2");
my $reply = $hailo->reply();
ok($reply, "Got reply $reply from Hailo");
is($hailo->order, $initial_order, "Order has been loaded from the database");
is($hailo->_engine->order, $initial_order, "Order has been propagated from the database -> engine");
is($hailo->_storage->order, $initial_order, "Order has been propagated from the database -> storage");
my ($tokens) = $hailo->stats;
is($tokens, 395, "Hailo still knows about 395 tokens");
}
for my $order (1 .. 200) {
ok(-f $brain_file, "$brain_file is still -f");
my $hailo = Hailo->new(
brain => $brain_file,
order => $order,
);
ok($hailo, "Construct a new Hailo from an existing brain with order = $order");
is($hailo->order, $order, "Custom order is now $order");
if ($order == $initial_order) {
my $reply = $hailo->reply();
ok($reply, "Got reply $reply from Hailo");
is($hailo->_engine->order, $initial_order, "Order has been propagated from the database -> engine");
is($hailo->_storage->order, $initial_order, "Order has been propagated from the database -> storage");
my ($tokens) = $hailo->stats;
is($tokens, 395, "Hailo still knows about 395 tokens");
} else {
local $@;
eval { $hailo->reply() };
like($@, qr/You've manually supplied an order of `\d+'/, "Tried to reply after setting custom order $order");
}
}