90cd1eeb976b19cfa5eec38e4afb8ac6eddbe808
[gitmo/MooseX-Dependent.git] / t / 01-types-dependent.t
1
2 use Test::More tests=>62; {
3         
4         use strict;
5         use warnings;
6         
7         use MooseX::Dependent::Types qw(Dependent);
8         use MooseX::Types::Moose qw(Int Any);
9         use MooseX::Types -declare=>[qw(SubDependent IntLessThan EvenInt
10                 LessThan100GreatThen5andEvenIntNot44)];
11         use Moose::Util::TypeConstraints;
12         
13         ok Dependent->check(1),
14           'Dependent is basically an "Any"';
15           
16         is Dependent->validate(1), undef,
17           'No Error Message';
18           
19         is Dependent->parent, 'Any',
20           'Dependent is an Any';
21           
22         is Dependent->name, 'MooseX::Dependent::Types::Dependent',
23           'Dependent has expected name';
24           
25         is Dependent->get_message,
26           "Validation failed for 'MooseX::Dependent::Types::Dependent' failed with value undef",
27           'Got Expected Message';
28           
29         ok Dependent->equals(Dependent),
30           'Dependent equal Dependent';
31           
32         ok Dependent->is_a_type_of(Dependent),
33           'Dependent is_a_type_of Dependent';
34           
35         ok Dependent->is_a_type_of('Any'),
36           'Dependent is_a_type_of Any';
37           
38         ok Dependent->is_subtype_of('Any'),
39           'Dependent is_subtype_of Dependent';
40
41         is Dependent->parent_type_constraint, 'Any',
42           'Correct parent type';
43
44         is subtype( SubDependent, as Dependent ),
45           'main::SubDependent',
46           'Create a useless subtype';
47
48         ok SubDependent->check(1),
49           'SubDependent is basically an "Any"';
50           
51         is SubDependent->validate(1), undef,
52           'validate returned no error message';
53
54         is SubDependent->parent, 'MooseX::Dependent::Types::Dependent',
55           'SubDependent is a Dependent';
56           
57         is SubDependent->name, 'main::SubDependent',
58           'Dependent has expected name';
59           
60         is SubDependent->get_message,
61           "Validation failed for 'main::SubDependent' failed with value undef",
62           'Got Expected Message';
63           
64         ok SubDependent->equals(SubDependent),
65           'SubDependent equal SubDependent';
66           
67         ok !SubDependent->equals(Dependent),
68           'SubDependent does not equal Dependent';
69           
70         ok SubDependent->is_a_type_of(Dependent),
71           'SubDependent is_a_type_of Dependent';
72           
73         ok SubDependent->is_a_type_of(Any),
74           'SubDependent is_a_type_of Any';
75           
76         ok SubDependent->is_subtype_of('Any'),
77           'SubDependent is_subtype_of Dependent';
78           
79         ok !SubDependent->is_subtype_of(SubDependent),
80           'SubDependent is not is_subtype_of SubDependent';
81         
82         ok subtype( EvenInt,
83                 as Int,
84                 where {
85                         my $val = shift @_;
86                         return $val % 2 ? 0:1;
87                 }),
88           'Created a subtype of Int';
89
90         ok !EvenInt->check('aaa'), '"aaa" not an Int';    
91         ok !EvenInt->check(1), '1 is not even';
92         ok EvenInt->check(2), 'but 2 is!';
93           
94         ok subtype( IntLessThan,
95                 as Dependent[EvenInt, Int],
96                 where {
97                         my $value = shift @_;
98                         my $constraining = shift @_ || 200;  #warn "..... $constraining ......";
99                         return ($value < $constraining && $value > 5);
100                 }),
101           'Created IntLessThan subtype';
102           
103         ok !IntLessThan->check('aaa'),
104           '"aaa" is not an integer';
105           
106         is IntLessThan->validate('aaa'),
107           "Validation failed for 'main::EvenInt' failed with value aaa",
108           'Got expected error messge for "aaa"';
109           
110         ok !IntLessThan->check(1),
111           '1 smaller than 5';
112
113         ok !IntLessThan->check(2),
114           '2 smaller than 5';
115           
116         ok !IntLessThan->check(15),
117           '15 greater than 5 (but odd)';
118
119         ok !IntLessThan->check(301),
120           '301 is too big';
121           
122         ok !IntLessThan->check(400),
123           '400 is too big';
124           
125         ok IntLessThan->check(10),
126           '10 greater than 5 (and even)';
127           
128         is IntLessThan->validate(1),
129           "Validation failed for 'main::EvenInt' failed with value 1",
130           'error message is correct';
131           
132         is IntLessThan->name, 'main::IntLessThan',
133           'Got correct name for IntLessThan';
134         
135         is IntLessThan->parent, 'MooseX::Dependent::Types::Dependent[main::EvenInt, Int]',
136           'IntLessThan is a Dependent';
137           
138         is IntLessThan->parent_type_constraint, EvenInt,
139           'Parent is an Int';
140           
141         is IntLessThan->constraining_value_type_constraint, Int,
142           'constraining is an Int';
143           
144         ok IntLessThan->equals(IntLessThan),
145           'IntLessThan equals IntLessThan';
146
147         ok IntLessThan->is_subtype_of(Dependent),
148           'IntLessThan is_subtype_of Dependent';          
149
150         ok IntLessThan->is_subtype_of(Int),
151           'IntLessThan is_subtype_of Int';
152
153         ok IntLessThan->is_a_type_of(Dependent),
154           'IntLessThan is_a_type_of Dependent';   
155
156         ok IntLessThan->is_a_type_of(Int),
157           'IntLessThan is_a_type_of Int';
158
159         ok IntLessThan->is_a_type_of(IntLessThan),
160           'IntLessThan is_a_type_of IntLessThan';
161           
162         ok( (my $lessThan100GreatThen5andEvenInt = IntLessThan[100]),
163            'Parameterized!');
164         
165         ok !$lessThan100GreatThen5andEvenInt->check(150),
166           '150 Not less than 100';
167           
168         ok !$lessThan100GreatThen5andEvenInt->check(151),
169           '151 Not less than 100';
170           
171         ok !$lessThan100GreatThen5andEvenInt->check(2),
172           'Not greater than 5';
173
174         ok !$lessThan100GreatThen5andEvenInt->check(51),
175           'Not even';
176
177         ok !$lessThan100GreatThen5andEvenInt->check('aaa'),
178           'Not Int';
179           
180         ok $lessThan100GreatThen5andEvenInt->check(42),
181           'is Int, is even, greater than 5, less than 100';
182
183         ok subtype( LessThan100GreatThen5andEvenIntNot44,
184                 as IntLessThan[100],
185                 where {
186                         my $value = shift @_;
187                         return $value == 44 ? 0:1;
188                 }),
189           'Created LessThan100GreatThen5andEvenIntNot44 subtype';
190
191         ok !LessThan100GreatThen5andEvenIntNot44->check(150),
192           '150 Not less than 100';
193           
194         ok !LessThan100GreatThen5andEvenIntNot44->check(300),
195           '300 Not less than 100 (check to make sure we are not defaulting 200)';
196           
197         ok !LessThan100GreatThen5andEvenIntNot44->check(151),
198           '151 Not less than 100';
199           
200         ok !LessThan100GreatThen5andEvenIntNot44->check(2),
201           'Not greater than 5';
202
203         ok !LessThan100GreatThen5andEvenIntNot44->check(51),
204           'Not even';
205
206         ok !LessThan100GreatThen5andEvenIntNot44->check('aaa'),
207           'Not Int';
208           
209         ok LessThan100GreatThen5andEvenIntNot44->check(42),
210           'is Int, is even, greater than 5, less than 100';
211
212         ok !LessThan100GreatThen5andEvenIntNot44->check(44),
213           'is Int, is even, greater than 5, less than 100 BUT 44!';
214           
215         #die IntLessThan->validate(100);
216         #use Data::Dump qw/dump/;
217         #warn dump IntLessThan;
218 }