renaming tests
[gitmo/MooseX-Types-Structured.git] / t / 02-constraints.t
CommitLineData
65748864 1BEGIN {
2 use strict;
3 use warnings;
0f766471 4 use Test::More tests=>42;
65748864 5 use Test::Exception;
6}
7
8{
bc64165b 9 package Test::MooseX::Meta::TypeConstraint::Structured;
65748864 10
11 use Moose;
6c2f284c 12 use MooseX::Types::Structured qw(Tuple Dict);
13 use Moose::Util::TypeConstraints;
9a920d27 14
c3abf064 15 subtype 'MyString',
16 as 'Str',
17 where { $_=~m/abc/};
9a920d27 18
c3abf064 19 has 'tuple' => (is=>'rw', isa=>Tuple['Int', 'Str', 'MyString']);
bc64165b 20 has 'dict' => (is=>'rw', isa=>Dict[name=>'Str', age=>'Int']);
8b276dd4 21 has 'dict_with_maybe' => (is=>'rw', isa=>Dict[name=>'Str', age=>'Maybe[Int]']);
22 has 'tuple_with_param' => (is=>'rw', isa=>Tuple['Int', 'Str', 'ArrayRef[Int]']);
23 has 'tuple_with_maybe' => (is=>'rw', isa=>Tuple['Int', 'Str', 'Maybe[Int]']);
9a920d27 24 has 'dict_with_tuple' => (is=>'rw', isa=>Dict[key1=>'Str', key2=>Tuple['Int','Str']]);
6c2f284c 25 has 'optional_tuple' => (is=>'rw', isa=>Tuple['Int', 'Int'],['Int'] );
26 has 'optional_dict' => (is=>'rw', isa=>Dict[key1=>'Int'],[key2=>'Int'] );
0f766471 27
28 has 'crazy' => (
29 is=>'rw',
30 isa=>Tuple(
31 ## First ArrayRef Arg is the required type constraints for the top
32 ## level Tuple.
33 [
34 'Int',
35 'MyString',
36 ## The third required element is a Dict type constraint, which
37 ## itself has two required keys and a third optional key.
38 Dict([name=>'Str',age=>'Int'],[visits=>'Int'])
39 ],
40 ## Second ArrayRef Arg defines the optional constraints for the top
41 ## level Tuple.
42 [
43 'Int',
44 ## This Tuple has one required type constraint and two optional.
45 Tuple(
46 ['Int'],
47 ['Int','HashRef'],
48 ),
49 ],
50 )
51 );
65748864 52}
53
54## Instantiate a new test object
55
bc64165b 56ok my $record = Test::MooseX::Meta::TypeConstraint::Structured->new
65748864 57 => 'Instantiated new Record test class.';
58
bc64165b 59isa_ok $record => 'Test::MooseX::Meta::TypeConstraint::Structured'
65748864 60 => 'Created correct object type.';
0f766471 61
62## Test crazy
63
64lives_ok sub {
65 $record->crazy([1,'hello.abc.world', {name=>'John', age=>39}]);
66} => 'Set crazy attribute with no optionals used';
67
68is_deeply $record->crazy, [1, 'hello.abc.world', {name=>'John', age=>39}]
69 => 'correct values for crazy attributes no optionals';
70
71lives_ok sub {
72 $record->crazy([1,'hello.abc.world', {name=>'John', age=>39, visits=>10},10, [1,2,{key=>'value'}]]);
73} => 'Set crazy attribute with all optionals used';
74
75is_deeply $record->crazy, [1,'hello.abc.world', {name=>'John', age=>39, visits=>10},10, [1,2,{key=>'value'}]]
76 => 'correct values for crazy attributes all optionals';
b5f77bd3 77
0f766471 78lives_ok sub {
79 $record->crazy([1,'hello.abc.world', {name=>'John', age=>39},10, [1,2]]);
80} => 'Set crazy attribute with some optionals used';
81
82throws_ok sub {
83 $record->crazy([1,'hello', 'test.xxx.test']);
84}, qr/Validation failed for 'MyString'/
85 => 'Properly failed for bad value in crazy attribute 01';
86
87throws_ok sub {
88 $record->crazy([1,'hello.abc.world', {notname=>'John', notage=>39}]);
89}, qr/Validation failed for 'Str'/
90 => 'Properly failed for bad value in crazy attribute 02';
91
bc64165b 92## Test Tuple type constraint
93
65748864 94lives_ok sub {
c3abf064 95 $record->tuple([1,'hello', 'test.abc.test']);
65748864 96} => 'Set tuple attribute without error';
97
98is $record->tuple->[0], 1
99 => 'correct set the tuple attribute index 0';
100
101is $record->tuple->[1], 'hello'
102 => 'correct set the tuple attribute index 1';
103
c3abf064 104is $record->tuple->[2], 'test.abc.test'
105 => 'correct set the tuple attribute index 2';
106
107throws_ok sub {
108 $record->tuple([1,'hello', 'test.xxx.test']);
109}, qr/Validation failed for 'MyString'/
110 => 'Properly failed for bad value in custom type constraint';
111
65748864 112throws_ok sub {
c3abf064 113 $record->tuple(['asdasd',2, 'test.abc.test']);
65748864 114}, qr/Validation failed for 'Int'/
115 => 'Got Expected Error for violating constraints';
116
bc64165b 117## Test the Dictionary type constraint
118
119lives_ok sub {
120 $record->dict({name=>'frith', age=>23});
121} => 'Set dict attribute without error';
122
123is $record->dict->{name}, 'frith'
124 => 'correct set the dict attribute name';
125
126is $record->dict->{age}, 23
127 => 'correct set the dict attribute age';
128
129throws_ok sub {
130 $record->dict({name=>[1,2,3], age=>'sdfsdfsd'});
131}, qr/Validation failed for 'Str'/
132 => 'Got Expected Error for bad value in dict';
8b276dd4 133
134## Test tuple_with_maybe
135
136lives_ok sub {
137 $record->tuple_with_maybe([1,'hello', 1]);
138} => 'Set tuple attribute without error';
139
140throws_ok sub {
141 $record->tuple_with_maybe([1,'hello', 'a']);
142}, qr/Validation failed for 'Maybe\[Int\]'/
143 => 'Properly failed for bad value parameterized constraint';
144
145lives_ok sub {
146 $record->tuple_with_maybe([1,'hello']);
147} => 'Set tuple attribute without error skipping optional parameter';
148
149## Test Tuple with parameterized type
150
151lives_ok sub {
152 $record->tuple_with_param([1,'hello', [1,2,3]]);
153} => 'Set tuple attribute without error';
154
155throws_ok sub {
156 $record->tuple_with_param([1,'hello', [qw/a b c/]]);
157}, qr/Validation failed for 'ArrayRef\[Int\]'/
158 => 'Properly failed for bad value parameterized constraint';
159
160## Test dict_with_maybe
161
162lives_ok sub {
163 $record->dict_with_maybe({name=>'frith', age=>23});
164} => 'Set dict attribute without error';
165
166is $record->dict_with_maybe->{name}, 'frith'
167 => 'correct set the dict attribute name';
168
169is $record->dict_with_maybe->{age}, 23
170 => 'correct set the dict attribute age';
171
172throws_ok sub {
173 $record->dict_with_maybe({name=>[1,2,3], age=>'sdfsdfsd'});
174}, qr/Validation failed for 'Str'/
175 => 'Got Expected Error for bad value in dict';
176
177throws_ok sub {
178 $record->dict_with_maybe({age=>30});
179}, qr/Validation failed for 'Str'/
180 => 'Got Expected Error for missing named parameter';
181
182lives_ok sub {
183 $record->dict_with_maybe({name=>'usal'});
184} => 'Set dict attribute without error, skipping optional';
9a920d27 185
186## Test dict_with_tuple
187
188lives_ok sub {
189 $record->dict_with_tuple({key1=>'Hello', key2=>[1,'World']});
190} => 'Set tuple attribute without error';
191
192throws_ok sub {
193 $record->dict_with_tuple({key1=>'Hello', key2=>['World',2]});
194}, qr/Validation failed for 'Int'/
195 => 'Threw error on bad constraint';
196
b5f77bd3 197## Test optional_tuple
9a920d27 198
b5f77bd3 199lives_ok sub {
200 $record->optional_tuple([1,2,3]);
201} => 'Set tuple attribute with optional bits';
202
203is_deeply $record->optional_tuple, [1,2,3]
204 => 'correct values set';
205
206lives_ok sub {
207 $record->optional_tuple([4,5]);
208} => 'Set tuple attribute withOUT optional bits';
209
210is_deeply $record->optional_tuple, [4,5]
211 => 'correct values set again';
212
213throws_ok sub {
214 $record->optional_tuple([1,2,'bad']);
215}, qr/Validation failed for 'Int'/
216 => 'Properly failed for bad value in optional bit';
9a920d27 217
6479ca33 218# Test optional_dict
219
220lives_ok sub {
221 $record->optional_dict({key1=>1,key2=>2});
222} => 'Set tuple attribute with optional bits';
223
224is_deeply $record->optional_dict, {key1=>1,key2=>2}
225 => 'correct values set';
226
227lives_ok sub {
228 $record->optional_dict({key1=>3});
229} => 'Set tuple attribute withOUT optional bits';
230
231is_deeply $record->optional_dict, {key1=>3}
232 => 'correct values set again';
233
234throws_ok sub {
235 $record->optional_dict({key1=>1,key2=>'bad'});
236}, qr/Validation failed for 'Int'/
237 => 'Properly failed for bad value in optional bit';
6479ca33 238