Merge pull request #3 from brianphillips/master
[gitmo/MooseX-Dependent.git] / t / 01-types-parameterizable.t
CommitLineData
a588ee00 1
6c67366e 2use Test::More tests=>79; {
d1cfb043 3
4 use strict;
5 use warnings;
6
7 use MooseX::Types::Parameterizable qw(Parameterizable);
8 use MooseX::Types::Moose qw(Int Any Maybe);
9 use Moose::Util::TypeConstraints;
10
11 use MooseX::Types -declare=>[qw(SubParameterizable IntLessThan EvenInt
12 LessThan100GreatThen5andEvenIntNot44 IntNot54
13 GreatThen5andEvenIntNot54or64)];
14
15 ok Parameterizable->check(1),
16 'Parameterizable is basically an "Any"';
17
18 is Parameterizable->validate(1), undef,
19 'No Error Message';
20
21 is Parameterizable->parent, 'Any',
22 'Parameterizable is an Any';
23
24 is Parameterizable->name, 'MooseX::Types::Parameterizable::Parameterizable',
25 'Parameterizable has expected name';
26
27 like Parameterizable->get_message,
28 qr/Validation failed for 'MooseX::Types::Parameterizable::Parameterizable' with value undef/,
29 'Got Expected Message';
30
31 ok Parameterizable->equals(Parameterizable),
32 'Parameterizable equal Parameterizable';
33
34 ok Parameterizable->is_a_type_of(Parameterizable),
35 'Parameterizable is_a_type_of Parameterizable';
36
37 ok Parameterizable->is_a_type_of('Any'),
38 'Parameterizable is_a_type_of Any';
39
40 ok Parameterizable->is_subtype_of('Any'),
41 'Parameterizable is_subtype_of Parameterizable';
0a9f5b94 42
d1cfb043 43 is Parameterizable->parent_type_constraint, 'Any',
44 'Correct parent type';
0a9f5b94 45
d1cfb043 46 is subtype( SubParameterizable, as Parameterizable ),
47 'main::SubParameterizable',
48 'Create a useless subtype';
0a9f5b94 49
d1cfb043 50 ok SubParameterizable->check(1),
51 'SubParameterizable is basically an "Any"';
52
53 is SubParameterizable->validate(1), undef,
54 'validate returned no error message';
0a9f5b94 55
d1cfb043 56 is SubParameterizable->parent, 'MooseX::Types::Parameterizable::Parameterizable',
57 'SubParameterizable is a Parameterizable';
58
59 is SubParameterizable->name, 'main::SubParameterizable',
60 'Parameterizable has expected name';
61
62 like SubParameterizable->get_message,
63 qr/Validation failed for 'main::SubParameterizable' with value undef/,
64 'Got Expected Message';
65
66 ok SubParameterizable->equals(SubParameterizable),
67 'SubParameterizable equal SubParameterizable';
68
69 ok !SubParameterizable->equals(Parameterizable),
70 'SubParameterizable does not equal Parameterizable';
71
72 ok SubParameterizable->is_a_type_of(Parameterizable),
73 'SubParameterizable is_a_type_of Parameterizable';
74
75 ok SubParameterizable->is_a_type_of(Any),
76 'SubParameterizable is_a_type_of Any';
77
78 ok SubParameterizable->is_subtype_of('Any'),
79 'SubParameterizable is_subtype_of Parameterizable';
80
81 ok !SubParameterizable->is_subtype_of(SubParameterizable),
82 'SubParameterizable is not is_subtype_of SubParameterizable';
83
84 ok subtype( EvenInt,
85 as Int,
86 where {
87 my $val = shift @_;
88 return $val % 2 ? 0:1;
89 }),
90 'Created a subtype of Int';
1e87d1a7 91
d1cfb043 92 ok !EvenInt->check('aaa'), '"aaa" not an Int';
93 ok !EvenInt->check(1), '1 is not even';
94 ok EvenInt->check(2), 'but 2 is!';
95
96 ok subtype( IntLessThan,
97 as Parameterizable[EvenInt, Maybe[Int]],
98 where {
99 my $value = shift @_;
100 my $constraining = shift @_ || 200;
101 return ($value < $constraining && $value > 5);
102 }),
103 'Created IntLessThan subtype';
104
105 ok !IntLessThan->check('aaa'),
106 '"aaa" is not an integer';
107
108 like IntLessThan->validate('aaa'),
5d7a8d2a 109 qr/Validation failed for 'main::EvenInt' with value .*aaa.*/,
d1cfb043 110 'Got expected error messge for "aaa"';
111
112 ok !IntLessThan->check(1),
113 '1 smaller than 5';
1e87d1a7 114
d1cfb043 115 ok !IntLessThan->check(2),
116 '2 smaller than 5';
117
118 ok !IntLessThan->check(15),
119 '15 greater than 5 (but odd)';
0a9f5b94 120
d1cfb043 121 ok !IntLessThan->check(301),
122 '301 is too big';
123
124 ok !IntLessThan->check(400),
125 '400 is too big';
126
127 ok IntLessThan->check(10),
128 '10 greater than 5 (and even)';
129
130 like IntLessThan->validate(1),
131 qr/Validation failed for 'main::EvenInt' with value 1/,
132 'error message is correct';
133
134 is IntLessThan->name, 'main::IntLessThan',
135 'Got correct name for IntLessThan';
136
137 is IntLessThan->parent, 'MooseX::Types::Parameterizable::Parameterizable[main::EvenInt, Maybe[Int]]',
138 'IntLessThan is a Parameterizable';
139
140 is IntLessThan->parent_type_constraint, EvenInt,
141 'Parent is an Int';
142
143 is IntLessThan->constraining_value_type_constraint, (Maybe[Int]),
144 'constraining is an Int';
145
146 ok IntLessThan->equals(IntLessThan),
147 'IntLessThan equals IntLessThan';
0a9f5b94 148
d1cfb043 149 ok IntLessThan->is_subtype_of(Parameterizable),
150 'IntLessThan is_subtype_of Parameterizable';
0a9f5b94 151
d1cfb043 152 ok IntLessThan->is_subtype_of(Int),
153 'IntLessThan is_subtype_of Int';
0a9f5b94 154
d1cfb043 155 ok IntLessThan->is_a_type_of(Parameterizable),
156 'IntLessThan is_a_type_of Parameterizable';
0a9f5b94 157
d1cfb043 158 ok IntLessThan->is_a_type_of(Int),
159 'IntLessThan is_a_type_of Int';
0a9f5b94 160
d1cfb043 161 ok IntLessThan->is_a_type_of(IntLessThan),
162 'IntLessThan is_a_type_of IntLessThan';
163
164 ok( (my $lessThan100GreatThen5andEvenInt = IntLessThan[100]),
165 'Parameterized!');
166
167 ok !$lessThan100GreatThen5andEvenInt->check(150),
168 '150 Not less than 100';
169
170 ok !$lessThan100GreatThen5andEvenInt->check(151),
171 '151 Not less than 100';
172
173 ok !$lessThan100GreatThen5andEvenInt->check(2),
174 'Not greater than 5';
0a9f5b94 175
d1cfb043 176 ok !$lessThan100GreatThen5andEvenInt->check(51),
177 'Not even';
0a9f5b94 178
d1cfb043 179 ok !$lessThan100GreatThen5andEvenInt->check('aaa'),
180 'Not Int';
181
182 ok $lessThan100GreatThen5andEvenInt->check(42),
183 'is Int, is even, greater than 5, less than 100';
66efbe23 184
d1cfb043 185 ok subtype( LessThan100GreatThen5andEvenIntNot44,
186 as IntLessThan[100],
187 where {
188 my $value = shift @_;
189 return $value != 44;
190 }),
191 'Created LessThan100GreatThen5andEvenIntNot44 subtype';
66efbe23 192
d1cfb043 193 ok !LessThan100GreatThen5andEvenIntNot44->check(150),
194 '150 Not less than 100';
195
196 ok !LessThan100GreatThen5andEvenIntNot44->check(300),
197 '300 Not less than 100 (check to make sure we are not defaulting 200)';
198
199 ok !LessThan100GreatThen5andEvenIntNot44->check(151),
200 '151 Not less than 100';
201
202 ok !LessThan100GreatThen5andEvenIntNot44->check(2),
203 'Not greater than 5';
66efbe23 204
d1cfb043 205 ok !LessThan100GreatThen5andEvenIntNot44->check(51),
206 'Not even';
66efbe23 207
d1cfb043 208 ok !LessThan100GreatThen5andEvenIntNot44->check('aaa'),
209 'Not Int';
210
211 ok LessThan100GreatThen5andEvenIntNot44->check(42),
212 'is Int, is even, greater than 5, less than 100';
66efbe23 213
d1cfb043 214 ok !LessThan100GreatThen5andEvenIntNot44->check(44),
215 'is Int, is even, greater than 5, less than 100 BUT 44!';
216
217 ok subtype( IntNot54,
218 as Maybe[Int],
219 where {
220 my $val = shift @_ || 200;
221 return $val != 54
222 }),
223 'Created a subtype of Int';
224
225 ok IntNot54->check(100), 'Not 54';
226 ok !IntNot54->check(54), '54!!';
227
228 ok( subtype( GreatThen5andEvenIntNot54or64,
229 as IntLessThan[IntNot54],
230 where {
231 my $value = shift @_;
232 return $value != 64;
233 }),
234 'Created GreatThen5andEvenIntNot54or64 subtype');
235
236 is( (GreatThen5andEvenIntNot54or64->name),
237 'main::GreatThen5andEvenIntNot54or64',
238 'got expected name');
239
240 ok GreatThen5andEvenIntNot54or64->check(150),
241 '150 is even, less than 200, not 54 or 64 but > 5';
6c67366e 242
d1cfb043 243 ok !GreatThen5andEvenIntNot54or64->check(202),
244 '202 is even, exceeds 200, not 54 or 64 but > 5';
245
246 is( ((GreatThen5andEvenIntNot54or64[100])->name),
247 'main::GreatThen5andEvenIntNot54or64[100]',
248 'got expected name');
249
250 ok !GreatThen5andEvenIntNot54or64([100])->check(150),
251 '150 Not less than 100';
252
253 ok !GreatThen5andEvenIntNot54or64([100])->check(300),
254 '300 Not less than 100 (check to make sure we are not defaulting 200)';
255
256 ok !GreatThen5andEvenIntNot54or64([100])->check(151),
257 '151 Not less than 100';
258
259 ok !GreatThen5andEvenIntNot54or64([100])->check(2),
260 'Not greater than 5';
6c67366e 261
d1cfb043 262 ok !GreatThen5andEvenIntNot54or64([100])->check(51),
263 'Not even';
6c67366e 264
d1cfb043 265 ok !GreatThen5andEvenIntNot54or64([100])->check('aaa'),
266 'Not Int';
267
268 ok GreatThen5andEvenIntNot54or64([100])->check(42),
269 'is Int, is even, greater than 5, less than 100';
270
271 ok !GreatThen5andEvenIntNot54or64([100])->check(64),
272 'is Int, is even, greater than 5, less than 100 BUT 64!';
273
274 CHECKPARAM: {
275 eval { GreatThen5andEvenIntNot54or64([54])->check(32) };
276 like $@,
277 qr/Validation failed for 'main::IntNot54' with value 54/,
278 'Got Expected Error';
279 }
0a9f5b94 280}