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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
|
use strict;
use warnings;
use Test::More tests=>46;
use Test::Fatal;
use Moose::Util::TypeConstraints ();
use MooseX::Types::Structured qw(Optional);
APITEST: {
ok my $Optional = Moose::Util::TypeConstraints::find_or_parse_type_constraint('MooseX::Types::Structured::Optional')
=> 'Got Optional';
isa_ok $Optional
=> 'Moose::Meta::TypeConstraint::Parameterizable';
ok my $int = Moose::Util::TypeConstraints::find_or_parse_type_constraint('Int')
=> 'Got Int';
ok my $arrayref = Moose::Util::TypeConstraints::find_or_parse_type_constraint('ArrayRef[Int]')
=> 'Got ArrayRef[Int]';
BASIC: {
ok my $Optional_Int = $Optional->parameterize($int), 'Parameterized Int';
ok my $Optional_ArrayRef = $Optional->parameterize($arrayref), 'Parameterized ArrayRef';
ok $Optional_Int->check() => 'Optional is allowed to not exist';
ok !$Optional_Int->check(undef) => 'Optional is NOT allowed to be undef';
ok $Optional_Int->check(199) => 'Correctly validates 199';
ok !$Optional_Int->check("a") => 'Correctly fails "a"';
ok $Optional_ArrayRef->check() => 'Optional is allowed to not exist';
ok !$Optional_ArrayRef->check(undef) => 'Optional is NOT allowed to be undef';
ok $Optional_ArrayRef->check([1,2,3]) => 'Correctly validates [1,2,3]';
ok !$Optional_ArrayRef->check("a") => 'Correctly fails "a"';
ok !$Optional_ArrayRef->check(["a","b"]) => 'Correctly fails ["a","b"]';
}
SUBREF: {
ok my $Optional_Int = Optional->parameterize($int),'Parameterized Int';
ok my $Optional_ArrayRef = Optional->parameterize($arrayref), 'Parameterized ArrayRef';
ok $Optional_Int->check() => 'Optional is allowed to not exist';
ok !$Optional_Int->check(undef) => 'Optional is NOT allowed to be undef';
ok $Optional_Int->check(199) => 'Correctly validates 199';
ok !$Optional_Int->check("a") => 'Correctly fails "a"';
ok $Optional_ArrayRef->check() => 'Optional is allowed to not exist';
ok !$Optional_ArrayRef->check(undef) => 'Optional is NOT allowed to be undef';
ok $Optional_ArrayRef->check([1,2,3]) => 'Correctly validates [1,2,3]';
ok !$Optional_ArrayRef->check("a") => 'Correctly fails "a"';
ok !$Optional_ArrayRef->check(["a","b"]) => 'Correctly fails ["a","b"]';
}
}
OBJECTTEST: {
package Test::MooseX::Meta::TypeConstraint::Structured::Optional;
use Moose;
use MooseX::Types::Structured qw(Dict Tuple Optional);
use MooseX::Types::Moose qw(Int Str Object ArrayRef HashRef Maybe);
use MooseX::Types -declare => [qw(
MoreThanFive TupleOptional1 TupleOptional2 Gender DictOptional1 Insane
)];
subtype MoreThanFive,
as Int,
where { $_ > 5};
enum Gender,
[ qw/male female transgendered/ ];
subtype TupleOptional1() =>
as Tuple[Int, MoreThanFive, Optional[Str|Object]];
subtype TupleOptional2,
as Tuple[Int, MoreThanFive, Optional[HashRef[Int|Object]]];
subtype DictOptional1,
as Dict[name=>Str, age=>Int, gender=>Optional[Gender]];
subtype Insane,
as Tuple[
Int,
Optional[Str|Object],
DictOptional1,
Optional[ArrayRef[Int]]
];
has 'TupleOptional1Attr' => (is=>'rw', isa=>TupleOptional1);
has 'TupleOptional2Attr' => (is=>'rw', isa=>TupleOptional2);
has 'DictOptional1Attr' => (is=>'rw', isa=>DictOptional1);
has 'InsaneAttr' => (is=>'rw', isa=>Insane);
}
ok my $obj = Test::MooseX::Meta::TypeConstraint::Structured::Optional->new
=> 'Instantiated new test class.';
isa_ok $obj => 'Test::MooseX::Meta::TypeConstraint::Structured::Optional'
=> 'Created correct object type.';
# Test Insane
is( exception {
$obj->InsaneAttr([1,"hello",{name=>"John",age=>39,gender=>"male"},[1,2,3]]);
} => undef, 'Set InsaneAttr attribute without error [1,"hello",{name=>"John",age=>39,gender=>"male"},[1,2,3]]');
is( exception {
$obj->InsaneAttr([1,$obj,{name=>"John",age=>39},[1,2,3]]);
} => undef, 'Set InsaneAttr attribute without error [1,$obj,{name=>"John",age=>39},[1,2,3]]');
is( exception {
$obj->InsaneAttr([1,$obj,{name=>"John",age=>39}]);
} => undef, 'Set InsaneAttr attribute without error [1,$obj,{name=>"John",age=>39}]');
like( exception {
$obj->InsaneAttr([1,$obj,{name=>"John",age=>39},[qw/a b c/]]);
}, qr/Attribute \(InsaneAttr\) does not pass the type constraint/
=> q{InsaneAttr correctly fails [1,$obj,{name=>"John",age=>39},[qw/a b c/]]});
like( exception {
$obj->InsaneAttr([1,"hello",{name=>"John",age=>39,gender=>undef},[1,2,3]]);
}, qr/Attribute \(InsaneAttr\) does not pass the type constraint/
=> q{InsaneAttr correctly fails [1,"hello",{name=>"John",age=>39,gender=>undef},[1,2,3]]});
# Test TupleOptional1Attr
is( exception {
$obj->TupleOptional1Attr([1,10,"hello"]);
} => undef, 'Set TupleOptional1Attr attribute without error [1,10,"hello"]');
is( exception {
$obj->TupleOptional1Attr([1,10,$obj]);
} => undef, 'Set TupleOptional1Attr attribute without error [1,10,$obj]');
is( exception {
$obj->TupleOptional1Attr([1,10]);
} => undef, 'Set TupleOptional1Attr attribute without error [1,10]');
like( exception {
$obj->TupleOptional1Attr([1,10,[1,2,3]]);
}, qr/Attribute \(TupleOptional1Attr\) does not pass the type constraint/
=> q{TupleOptional1Attr correctly fails [1,10,[1,2,3]]});
like( exception {
$obj->TupleOptional1Attr([1,10,undef]);
}, qr/Attribute \(TupleOptional1Attr\) does not pass the type constraint/
=> q{TupleOptional1Attr correctly fails [1,10,undef]});
# Test TupleOptional2Attr
is( exception {
$obj->TupleOptional2Attr([1,10,{key1=>1,key2=>$obj}]);
} => undef, 'Set TupleOptional2Attr attribute without error [1,10,{key1=>1,key2=>$obj}]');
is( exception {
$obj->TupleOptional2Attr([1,10]);
} => undef, 'Set TupleOptional2Attr attribute without error [1,10]');
like( exception {
$obj->TupleOptional2Attr([1,10,[1,2,3]]);
}, qr/Attribute \(TupleOptional2Attr\) does not pass the type constraint/
=> q{TupleOptional2Attr correctly fails [1,10,[1,2,3]]});
like( exception {
$obj->TupleOptional2Attr([1,10,undef]);
}, qr/Attribute \(TupleOptional2Attr\) does not pass the type constraint/
=> q{TupleOptional2Attr correctly fails [1,10,undef]});
# Test DictOptional1Attr: Dict[name=>Str, age=>Int, gender=>Optional[Gender]];
is( exception {
$obj->DictOptional1Attr({name=>"John",age=>39,gender=>"male"});
} => undef, 'Set DictOptional1Attr attribute without error {name=>"John",age=>39,gender=>"male"}');
is( exception {
$obj->DictOptional1Attr({name=>"Vanessa",age=>34});
} => undef, 'Set DictOptional1Attr attribute without error {name=>"Vanessa",age=>34}');
like( exception {
$obj->DictOptional1Attr({name=>"John",age=>39,gender=>undef});
}, qr/Attribute \(DictOptional1Attr\) does not pass the type constraint/
=> q{TupleOptional2Attr correctly fails {name=>"John",age=>39,gender=>undef}});
like( exception {
$obj->DictOptional1Attr({name=>"John",age=>39,gender=>"aaa"});
}, qr/Attribute \(DictOptional1Attr\) does not pass the type constraint/
=> q{TupleOptional2Attr correctly fails {name=>"John",age=>39,gender=>"aaa"}});
|