The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;
use Path::Dispatcher;

my @calls;

my $dispatcher = Path::Dispatcher->new(
    rules => [
        Path::Dispatcher::Rule::Alternation->new(
            rules => [
                Path::Dispatcher::Rule::Eq->new(
                    string => 'foo',
                    block  => sub { push @calls, 'foo' },
                ),
                Path::Dispatcher::Rule::Eq->new(
                    string => 'bar',
                    block  => sub { push @calls, 'bar' },
                ),
            ],
            block => sub { push @calls, 'alternation' },
        ),
    ],
);

$dispatcher->run("foo");
is_deeply([splice @calls], ['alternation'], "the alternation matched; doesn't automatically run the subrules");

$dispatcher->run("bar");
is_deeply([splice @calls], ['alternation'], "the alternation matched; doesn't automatically run the subrules");

$dispatcher->run("baz");
is_deeply([splice @calls], [], "each subrule of the intersection must match");

is_deeply([$dispatcher->complete("")], ["foo", "bar"]);
is_deeply([$dispatcher->complete("f")], ["foo"]);
is_deeply([$dispatcher->complete("b")], ["bar"]);
is_deeply([$dispatcher->complete("fo")], ["foo"]);
is_deeply([$dispatcher->complete("ba")], ["bar"]);
is_deeply([$dispatcher->complete("foo")], []);
is_deeply([$dispatcher->complete("bar")], []);
is_deeply([$dispatcher->complete("fx")], []);
is_deeply([$dispatcher->complete("baz")], []);

# test empty alternation
$dispatcher = Path::Dispatcher->new(
    rules => [
        Path::Dispatcher::Rule::Alternation->new(
            rules => [ ],
            block => sub { push @calls, 'alternation' },
        ),
    ],
);

$dispatcher->run("foo");
is_deeply([splice @calls], [], "no subrules means no match");

done_testing;