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

use strict;
use warnings;

use Test::More tests => 10;

BEGIN { use_ok("VS::RuleEngine::TypeDecl"); }

require VS::RuleEngine::Engine;

my $obj = bless {}, "Foo";
my $type = VS::RuleEngine::TypeDecl->new($obj);
isa_ok($type, "VS::RuleEngine::TypeDecl");
ok($obj == $type->instantiate);

{
    package A;
    sub new {
        my ($pkg, @args) = @_;
        ::is($pkg, "A");
        ::is(@args, 0);
        return bless {}, $pkg;
    }
}

$type = VS::RuleEngine::TypeDecl->new("A");
$obj = $type->instantiate();
isa_ok($obj, "A");

{
    package B;
    sub new {
        my ($pkg, @args) = @_;
        ::is(@args, 2);
        ::is_deeply([@args], [qw(foo baz)]);
        return bless {}, $pkg;
    }
}

$type = VS::RuleEngine::TypeDecl->new("B", [], "foo", "baz");
$obj = $type->instantiate();

{
    package C;
    sub new {
        my ($pkg, %args) = @_;
        ::is_deeply(\%args, { foo => 1, bar => 2 });
    }
}

my $e = VS::RuleEngine::Engine->new();
$e->add_defaults(d1 => { foo => 1 });
$type = VS::RuleEngine::TypeDecl->new("C", "d1", bar => 2);
$obj = $type->instantiate($e);

$type = VS::RuleEngine::TypeDecl->new("C", [qw(d1)], bar => 2);
$obj = $type->instantiate($e);