1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
=pod
This tests how well Moose type constraints
play with Declare::Constraints::Simple.
Pretty well if I do say so myself :)
=cut
BEGIN {
eval "use Declare::Constraints::Simple;";
plan skip_all => "Declare::Constraints::Simple is required for this test" if $@;
}
use Test::Exception;
{
package Foo;
use Moose;
use Moose::Util::TypeConstraints;
use Declare::Constraints::Simple -All;
# define your own type ...
type( 'HashOfArrayOfObjects',
{
where => IsHashRef(
-keys => HasLength,
-values => IsArrayRef(IsObject)
)
} );
has 'bar' => (
is => 'rw',
isa => 'HashOfArrayOfObjects',
);
# inline the constraints as anon-subtypes
has 'baz' => (
is => 'rw',
isa => subtype( { as => 'ArrayRef', where => IsArrayRef(IsInt) } ),
);
package Bar;
use Moose;
}
my $hash_of_arrays_of_objs = {
foo1 => [ Bar->new ],
foo2 => [ Bar->new, Bar->new ],
};
my $array_of_ints = [ 1 .. 10 ];
my $foo;
lives_ok {
$foo = Foo->new(
'bar' => $hash_of_arrays_of_objs,
'baz' => $array_of_ints,
);
} '... construction succeeded';
isa_ok($foo, 'Foo');
is_deeply($foo->bar, $hash_of_arrays_of_objs, '... got our value correctly');
is_deeply($foo->baz, $array_of_ints, '... got our value correctly');
dies_ok {
$foo->bar([]);
} '... validation failed correctly';
dies_ok {
$foo->bar({ foo => 3 });
} '... validation failed correctly';
dies_ok {
$foo->bar({ foo => [ 1, 2, 3 ] });
} '... validation failed correctly';
dies_ok {
$foo->baz([ "foo" ]);
} '... validation failed correctly';
dies_ok {
$foo->baz({});
} '... validation failed correctly';
done_testing;
|