Moose-2.1100 deprecated the list form of enum() calls
[gitmo/MooseX-Types-Structured.git] / t / 09-optional.t
CommitLineData
fbb43338 1use strict;
2use warnings;
3
190a34eb 4use Test::More tests=>46;
25c705c4 5use Test::Fatal;
fbb43338 6use Moose::Util::TypeConstraints;
e327145a 7use MooseX::Types::Structured qw(Optional);
8
190a34eb 9APITEST: {
e327145a 10
8dbdca20 11 ok my $Optional = Moose::Util::TypeConstraints::find_or_parse_type_constraint('MooseX::Types::Structured::Optional')
12 => 'Got Optional';
13
14 isa_ok $Optional
15 => 'Moose::Meta::TypeConstraint::Parameterizable';
16
17 ok my $int = Moose::Util::TypeConstraints::find_or_parse_type_constraint('Int')
18 => 'Got Int';
19
20 ok my $arrayref = Moose::Util::TypeConstraints::find_or_parse_type_constraint('ArrayRef[Int]')
21 => 'Got ArrayRef[Int]';
22
23 BASIC: {
24 ok my $Optional_Int = $Optional->parameterize($int), 'Parameterized Int';
25 ok my $Optional_ArrayRef = $Optional->parameterize($arrayref), 'Parameterized ArrayRef';
26
27 ok $Optional_Int->check() => 'Optional is allowed to not exist';
28
29 ok !$Optional_Int->check(undef) => 'Optional is NOT allowed to be undef';
30 ok $Optional_Int->check(199) => 'Correctly validates 199';
31 ok !$Optional_Int->check("a") => 'Correctly fails "a"';
32
33 ok $Optional_ArrayRef->check() => 'Optional is allowed to not exist';
34 ok !$Optional_ArrayRef->check(undef) => 'Optional is NOT allowed to be undef';
35 ok $Optional_ArrayRef->check([1,2,3]) => 'Correctly validates [1,2,3]';
36 ok !$Optional_ArrayRef->check("a") => 'Correctly fails "a"';
37 ok !$Optional_ArrayRef->check(["a","b"]) => 'Correctly fails ["a","b"]';
38 }
39
40 SUBREF: {
41 ok my $Optional_Int = Optional->parameterize($int),'Parameterized Int';
42 ok my $Optional_ArrayRef = Optional->parameterize($arrayref), 'Parameterized ArrayRef';
43
44 ok $Optional_Int->check() => 'Optional is allowed to not exist';
45
46 ok !$Optional_Int->check(undef) => 'Optional is NOT allowed to be undef';
47 ok $Optional_Int->check(199) => 'Correctly validates 199';
48 ok !$Optional_Int->check("a") => 'Correctly fails "a"';
49
50 ok $Optional_ArrayRef->check() => 'Optional is allowed to not exist';
51 ok !$Optional_ArrayRef->check(undef) => 'Optional is NOT allowed to be undef';
52 ok $Optional_ArrayRef->check([1,2,3]) => 'Correctly validates [1,2,3]';
53 ok !$Optional_ArrayRef->check("a") => 'Correctly fails "a"';
54 ok !$Optional_ArrayRef->check(["a","b"]) => 'Correctly fails ["a","b"]';
55 }
190a34eb 56}
57
58OBJECTTEST: {
59 package Test::MooseX::Meta::TypeConstraint::Structured::Optional;
60
61 use Moose;
62 use MooseX::Types::Structured qw(Dict Tuple Optional);
8dbdca20 63 use MooseX::Types::Moose qw(Int Str Object ArrayRef HashRef Maybe);
64 use MooseX::Types -declare => [qw(
190a34eb 65 MoreThanFive TupleOptional1 TupleOptional2 Gender DictOptional1 Insane
66 )];
8dbdca20 67
190a34eb 68 subtype MoreThanFive,
69 as Int,
70 where { $_ > 5};
8dbdca20 71
72 enum Gender,
02aebec2 73 [ qw/male female transgendered/ ];
8dbdca20 74
3108fd7b 75 subtype TupleOptional1() =>
8dbdca20 76 as Tuple[Int, MoreThanFive, Optional[Str|Object]];
190a34eb 77
78 subtype TupleOptional2,
8dbdca20 79 as Tuple[Int, MoreThanFive, Optional[HashRef[Int|Object]]];
80
81 subtype DictOptional1,
82 as Dict[name=>Str, age=>Int, gender=>Optional[Gender]];
83
84 subtype Insane,
85 as Tuple[
86 Int,
87 Optional[Str|Object],
88 DictOptional1,
89 Optional[ArrayRef[Int]]
90 ];
91
190a34eb 92 has 'TupleOptional1Attr' => (is=>'rw', isa=>TupleOptional1);
93 has 'TupleOptional2Attr' => (is=>'rw', isa=>TupleOptional2);
8dbdca20 94 has 'DictOptional1Attr' => (is=>'rw', isa=>DictOptional1);
95 has 'InsaneAttr' => (is=>'rw', isa=>Insane);
e327145a 96}
97
190a34eb 98ok my $obj = Test::MooseX::Meta::TypeConstraint::Structured::Optional->new
99 => 'Instantiated new test class.';
8dbdca20 100
190a34eb 101isa_ok $obj => 'Test::MooseX::Meta::TypeConstraint::Structured::Optional'
102 => 'Created correct object type.';
8dbdca20 103
190a34eb 104# Test Insane
105
25c705c4 106is( exception {
190a34eb 107 $obj->InsaneAttr([1,"hello",{name=>"John",age=>39,gender=>"male"},[1,2,3]]);
25c705c4 108} => undef, 'Set InsaneAttr attribute without error [1,"hello",{name=>"John",age=>39,gender=>"male"},[1,2,3]]');
190a34eb 109
25c705c4 110is( exception {
190a34eb 111 $obj->InsaneAttr([1,$obj,{name=>"John",age=>39},[1,2,3]]);
25c705c4 112} => undef, 'Set InsaneAttr attribute without error [1,$obj,{name=>"John",age=>39},[1,2,3]]');
190a34eb 113
25c705c4 114is( exception {
190a34eb 115 $obj->InsaneAttr([1,$obj,{name=>"John",age=>39}]);
25c705c4 116} => undef, 'Set InsaneAttr attribute without error [1,$obj,{name=>"John",age=>39}]');
190a34eb 117
25c705c4 118like( exception {
8dbdca20 119 $obj->InsaneAttr([1,$obj,{name=>"John",age=>39},[qw/a b c/]]);
190a34eb 120}, qr/Attribute \(InsaneAttr\) does not pass the type constraint/
25c705c4 121 => q{InsaneAttr correctly fails [1,$obj,{name=>"John",age=>39},[qw/a b c/]]});
190a34eb 122
25c705c4 123like( exception {
8dbdca20 124 $obj->InsaneAttr([1,"hello",{name=>"John",age=>39,gender=>undef},[1,2,3]]);
190a34eb 125}, qr/Attribute \(InsaneAttr\) does not pass the type constraint/
25c705c4 126 => q{InsaneAttr correctly fails [1,"hello",{name=>"John",age=>39,gender=>undef},[1,2,3]]});
8dbdca20 127
190a34eb 128# Test TupleOptional1Attr
129
25c705c4 130is( exception {
190a34eb 131 $obj->TupleOptional1Attr([1,10,"hello"]);
25c705c4 132} => undef, 'Set TupleOptional1Attr attribute without error [1,10,"hello"]');
190a34eb 133
25c705c4 134is( exception {
190a34eb 135 $obj->TupleOptional1Attr([1,10,$obj]);
25c705c4 136} => undef, 'Set TupleOptional1Attr attribute without error [1,10,$obj]');
190a34eb 137
25c705c4 138is( exception {
190a34eb 139 $obj->TupleOptional1Attr([1,10]);
25c705c4 140} => undef, 'Set TupleOptional1Attr attribute without error [1,10]');
190a34eb 141
25c705c4 142like( exception {
8dbdca20 143 $obj->TupleOptional1Attr([1,10,[1,2,3]]);
190a34eb 144}, qr/Attribute \(TupleOptional1Attr\) does not pass the type constraint/
25c705c4 145 => q{TupleOptional1Attr correctly fails [1,10,[1,2,3]]});
190a34eb 146
25c705c4 147like( exception {
8dbdca20 148 $obj->TupleOptional1Attr([1,10,undef]);
190a34eb 149}, qr/Attribute \(TupleOptional1Attr\) does not pass the type constraint/
25c705c4 150 => q{TupleOptional1Attr correctly fails [1,10,undef]});
8dbdca20 151
190a34eb 152# Test TupleOptional2Attr
153
25c705c4 154is( exception {
190a34eb 155 $obj->TupleOptional2Attr([1,10,{key1=>1,key2=>$obj}]);
25c705c4 156} => undef, 'Set TupleOptional2Attr attribute without error [1,10,{key1=>1,key2=>$obj}]');
190a34eb 157
25c705c4 158is( exception {
190a34eb 159 $obj->TupleOptional2Attr([1,10]);
25c705c4 160} => undef, 'Set TupleOptional2Attr attribute without error [1,10]');
190a34eb 161
25c705c4 162like( exception {
8dbdca20 163 $obj->TupleOptional2Attr([1,10,[1,2,3]]);
190a34eb 164}, qr/Attribute \(TupleOptional2Attr\) does not pass the type constraint/
25c705c4 165 => q{TupleOptional2Attr correctly fails [1,10,[1,2,3]]});
190a34eb 166
25c705c4 167like( exception {
8dbdca20 168 $obj->TupleOptional2Attr([1,10,undef]);
190a34eb 169}, qr/Attribute \(TupleOptional2Attr\) does not pass the type constraint/
25c705c4 170 => q{TupleOptional2Attr correctly fails [1,10,undef]});
8dbdca20 171
190a34eb 172# Test DictOptional1Attr: Dict[name=>Str, age=>Int, gender=>Optional[Gender]];
8dbdca20 173
25c705c4 174is( exception {
190a34eb 175 $obj->DictOptional1Attr({name=>"John",age=>39,gender=>"male"});
25c705c4 176} => undef, 'Set DictOptional1Attr attribute without error {name=>"John",age=>39,gender=>"male"}');
190a34eb 177
25c705c4 178is( exception {
190a34eb 179 $obj->DictOptional1Attr({name=>"Vanessa",age=>34});
25c705c4 180} => undef, 'Set DictOptional1Attr attribute without error {name=>"Vanessa",age=>34}');
190a34eb 181
25c705c4 182like( exception {
8dbdca20 183 $obj->DictOptional1Attr({name=>"John",age=>39,gender=>undef});
190a34eb 184}, qr/Attribute \(DictOptional1Attr\) does not pass the type constraint/
25c705c4 185 => q{TupleOptional2Attr correctly fails {name=>"John",age=>39,gender=>undef}});
fbb43338 186
25c705c4 187like( exception {
8dbdca20 188 $obj->DictOptional1Attr({name=>"John",age=>39,gender=>"aaa"});
190a34eb 189}, qr/Attribute \(DictOptional1Attr\) does not pass the type constraint/
25c705c4 190 => q{TupleOptional2Attr correctly fails {name=>"John",age=>39,gender=>"aaa"}});