The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 22;

# --------------------------------------

BEGIN{ use_ok('Set::FA'); use_ok('Set::FA::Element'); }

my(@a) = map
{
    Set::FA::Element -> new
		(
		 accepting   => ['ping'],
		 id          => "a.$_",
		 start       => 'ping',
		 transitions =>
		 [
		  ['ping', 'a', 'pong'],
		  ['ping', '.', 'ping'],
		  ['pong', 'b', 'ping'],
		  ['pong', '.', 'pong'],
		 ],
		)
} (0 .. 2);

my(@b) = map
{
    Set::FA::Element -> new
		(
		 accepting   => ['pong'],
		 id          => "b.$_",
         start       => 'ping',
		 transitions =>
		 [
		  ['ping', 'a', 'pong'],
		  ['ping', '.', 'ping'],
		  ['pong', 'b', 'ping'],
		  ['pong', '.', 'pong'],
		 ],
		)
} (0 .. 4);

my(@c) = map
{
    Set::FA::Element -> new
		(
        accepting   => ['happy'],
        id          => "c.$_",
        start       => 'sad',
        transitions =>
		 [
		  ['sad',   'dog', 'happy'],
		  ['sad',   '.',   'sad'  ],
		  ['happy', '.',   'happy'],
		 ],
		)
} (0 .. 6);

my($set) = Set::FA -> new(@a, @b, @c);

my($sub_a) = $set -> accept('abbba');
my($sub_b) = $set -> final;

ok($sub_a -> size == @b, 'Sub_a/b sizes match');
ok($sub_a -> includes(@b) == 1, 'Sub_a contains b');
ok($sub_b -> size == @b, 'Sub_b/b sizes match');
ok($sub_b -> includes(@b) == 1, 'Sub_b contains b');

$set -> reset;

$sub_b = $set -> final;

ok($sub_b -> size == scalar @a, 'Sub_b/a sizes match');
ok($sub_b -> includes(@a) == 1, 'Sub_b contains a');

$sub_a = $set -> accept('aaabbaaabdogbbbbbababa');
$sub_b = $set -> final;

ok($sub_a -> size ==  @b + @c, 'Sub_a/b/c sizes match');
ok($sub_a -> includes(@b, @c) == 1, 'Sub_a includes b/c');
ok($sub_b -> size == @b + @c, 'Sub_b/b/c sizes match');
ok($sub_b -> includes(@b, @c) == 1, 'Sub_b includes b/c');

ok($set -> in_state('ping') -> size == 0, 'Set is not in state ping');
ok($set -> in_state('pong') -> size == @a + @b, 'Set a/b is in state pong');
ok($set -> in_state('sad') -> size == 0, 'Set is not in state sad');
ok($set -> in_state('happy') -> size == @c, 'Set c is in state happy');

$sub_a -> reset;
$set -> step('b');

ok($set -> in_state('ping') -> size == @a + @b, 'Set a/c are in state ping');
ok($set -> in_state('pong') -> size == 0, 'Set is not in state pong');
ok($set -> in_state('sad') -> size == @c, 'Set c is in state sad');
ok($set -> in_state('happy') -> size == 0, 'Set is not in state happy');
ok($set -> final -> size == @a, 'Set a final sizes match');
ok($set -> final -> includes(@a) == 1, 'Set final includes a');