use strict;
use warnings;

use Test::More tests=>14;

use_ok 'MooseX::Meta::TypeConstraint::Structured';
use_ok 'Moose::Util::TypeConstraints';

ok my $int = find_type_constraint('Int') => 'Got Int';
ok my $str = find_type_constraint('Str') => 'Got Str';
ok my $arrayref = find_type_constraint('ArrayRef') => 'Got ArrayRef';

my $list_tc = MooseX::Meta::TypeConstraint::Structured->new(
    name => 'list_tc',
    parent => $arrayref,
    type_constraints => [$int, $str],
    constraint_generator=> sub {
        my ($self) = @_;
        my @type_constraints = @{ $self->type_constraints };

        return sub {
            my ($values, $err) = @_;
            my @values = @$values;

            for my $type_constraint (@type_constraints) {
                my $value = shift @values || return;
                $type_constraint->check($value) || return;
            }
            if(@values) {
                return;
            } else {
                return 1;
            }
        }
    }
);

isa_ok $list_tc, 'MooseX::Meta::TypeConstraint::Structured';

ok !$arrayref->check() => 'Parent undef fails';
ok !$list_tc->check() => 'undef fails';
ok !$list_tc->check(1) => '1 fails';
ok !$list_tc->check([]) => '[] fails';
ok !$list_tc->check([1]) => '[1] fails';
ok !$list_tc->check([1,2,3]) => '[1,2,3] fails';
ok !$list_tc->check(['a','b']) => '["a","b"] fails';

ok $list_tc->check([1,'a']) => '[1,"a"] passes';
