#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 14;
use Test::Exception;
use VS::RuleEngine::Engine;
use lib 't/lib';
use Test::VS::RuleEngine::Rule;
my $engine = VS::RuleEngine::Engine->new();
# Rule
throws_ok {
$engine->add_rule(undef);
} qr/Name is undefined/;
throws_ok {
$engine->add_rule(2342 => undef);
} qr/Name '2342' is invalid/;
throws_ok {
$engine->add_rule(Foo => undef);
} qr/Rule is undefined/;
throws_ok {
$engine->add_rule(Foo => "");
} qr/Rule '' doesn't look like a valid class name/;
throws_ok {
$engine->add_rule(Foo => 2554);
} qr/Rule '2554' doesn't look like a valid class name/;
throws_ok {
$engine->add_rule(Foo => bless({}, "Bar"));
} qr/Rule is an instance that does not conform to VS::RuleEngine::Rule/;
throws_ok {
$engine->add_rule(Foo => 'VS::RuleEngine::Rule::NonExistent');
} qr{Can't locate VS/RuleEngine/Rule/NonExistent.pm};
throws_ok {
$engine->add_rule(Foo => "VS::RuleEngine::Action");
} qr/Rule 'VS::RuleEngine::Action' does not conform to VS::RuleEngine::Rule/;
lives_ok {
$engine->add_rule(Foo => "VS::RuleEngine::Rule");
};
throws_ok {
$engine->add_rule(Foo => "VS::RuleEngine::Rule");
} qr/Rule 'Foo' is already defined/;
lives_ok {
$engine->add_rule(Bar => Test::VS::RuleEngine::Rule->new());
};
# Getting
my $input = $engine->_get_rule("Foo");
isa_ok($input, "VS::RuleEngine::TypeDecl");
throws_ok {
$engine->_get_rule("Baz");
} qr/Rule 'Baz' does not exist/;
is_deeply([sort $engine->rules], [qw(Bar Foo)]);