Commit | Line | Data |
a30fa891 |
1 | BEGIN { |
8dbdca20 |
2 | use strict; |
3 | use warnings; |
4 | use Test::More tests=>32; |
5 | use Test::Exception; |
a30fa891 |
6 | } |
7 | |
8 | { |
9 | package Test::MooseX::Meta::TypeConstraint::Structured::Tuple; |
10 | |
11 | use Moose; |
12 | use MooseX::Types::Structured qw(Tuple); |
8dbdca20 |
13 | use MooseX::Types::Moose qw(Int Str Object ArrayRef HashRef Maybe); |
14 | use MooseX::Types -declare => [qw(MyString MoreThanFive FiveByFive MyArrayRefMoreThanTwoInt)]; |
15 | |
a30fa891 |
16 | subtype MyString, |
a2efc685 |
17 | as Str, |
a30fa891 |
18 | where { $_=~m/abc/}; |
8dbdca20 |
19 | |
a2efc685 |
20 | subtype MoreThanFive, |
21 | as Int, |
22 | where { $_ > 5}; |
8dbdca20 |
23 | |
a2efc685 |
24 | subtype MyArrayRefMoreThanTwoInt, |
25 | as ArrayRef[MoreThanFive], |
26 | where { scalar @$_ > 2 }; |
8dbdca20 |
27 | |
a2efc685 |
28 | subtype FiveByFive, |
29 | as Tuple[MoreThanFive, MyArrayRefMoreThanTwoInt]; |
8dbdca20 |
30 | |
a30fa891 |
31 | #use Data::Dump qw/dump/; warn dump Tuple; |
32 | |
33 | has 'tuple' => (is=>'rw', isa=>Tuple[Int, Str, MyString]); |
8dbdca20 |
34 | has 'tuple_with_param' => (is=>'rw', isa=>Tuple[Int, Str, ArrayRef[Int]]); |
35 | has 'tuple_with_maybe' => (is=>'rw', isa=>Tuple[Int, Str, Maybe[Int], Object]); |
36 | has 'tuple_with_maybe2' => (is=>'rw', isa=>Tuple[Int, Str, Maybe[Int]]); |
37 | has 'tuple_with_union' => (is=>'rw', isa=>Tuple[Int,Str,Int|Object,Int]); |
38 | has 'tuple2' => (is=>'rw', isa=>Tuple[Int,Str,Int]); |
39 | has 'tuple_with_parameterized' => (is=>'rw', isa=>Tuple[Int,Str,Int,ArrayRef[Int]]); |
a2efc685 |
40 | has 'FiveByFiveAttr' => (is=>'rw', isa=>FiveByFive); |
a30fa891 |
41 | } |
42 | |
43 | ## Instantiate a new test object |
44 | |
45 | ok my $record = Test::MooseX::Meta::TypeConstraint::Structured::Tuple->new |
46 | => 'Instantiated new Record test class.'; |
8dbdca20 |
47 | |
a30fa891 |
48 | isa_ok $record => 'Test::MooseX::Meta::TypeConstraint::Structured::Tuple' |
49 | => 'Created correct object type.'; |
8dbdca20 |
50 | |
a30fa891 |
51 | ## Test Tuple type constraint |
52 | |
53 | lives_ok sub { |
54 | $record->tuple([1,'hello', 'test.abc.test']); |
55 | } => 'Set tuple attribute without error'; |
56 | |
57 | is $record->tuple->[0], 1 |
58 | => 'correct set the tuple attribute index 0'; |
59 | |
60 | is $record->tuple->[1], 'hello' |
61 | => 'correct set the tuple attribute index 1'; |
62 | |
63 | is $record->tuple->[2], 'test.abc.test' |
64 | => 'correct set the tuple attribute index 2'; |
65 | |
66 | throws_ok sub { |
8dbdca20 |
67 | $record->tuple([1,'hello', 'test.xxx.test']); |
a30fa891 |
68 | }, qr/Attribute \(tuple\) does not pass the type constraint/ |
69 | => 'Properly failed for bad value in custom type constraint'; |
8dbdca20 |
70 | |
a30fa891 |
71 | throws_ok sub { |
8dbdca20 |
72 | $record->tuple(['asdasd',2, 'test.abc.test']); |
a30fa891 |
73 | }, qr/Attribute \(tuple\) does not pass the type constraint/ |
74 | => 'Got Expected Error for violating constraints'; |
75 | |
76 | ## Test tuple_with_maybe |
77 | |
78 | lives_ok sub { |
79 | $record->tuple_with_maybe([1,'hello', 1, $record]); |
80 | } => 'Set tuple attribute without error'; |
81 | |
82 | throws_ok sub { |
83 | $record->tuple_with_maybe([1,'hello', 'a', $record]); |
84 | }, qr/Attribute \(tuple_with_maybe\) does not pass the type constraint/ |
85 | => 'Properly failed for bad value parameterized constraint'; |
86 | |
87 | lives_ok sub { |
88 | $record->tuple_with_maybe([1,'hello',undef, $record]); |
89 | } => 'Set tuple attribute without error skipping optional parameter'; |
90 | |
91 | ## Test tuple_with_maybe2 |
92 | |
93 | lives_ok sub { |
94 | $record->tuple_with_maybe2([1,'hello', 1]); |
95 | } => 'Set tuple attribute without error'; |
96 | |
97 | throws_ok sub { |
98 | $record->tuple_with_maybe2([1,'hello', 'a']); |
99 | }, qr/Attribute \(tuple_with_maybe2\) does not pass the type constraint/ |
100 | => 'Properly failed for bad value parameterized constraint'; |
101 | |
102 | lives_ok sub { |
103 | $record->tuple_with_maybe2([1,'hello',undef]); |
104 | } => 'Set tuple attribute without error skipping optional parameter'; |
105 | |
190a34eb |
106 | SKIP: { |
107 | skip 'Core Maybe incorrectly allows null.', 1, 1; |
108 | throws_ok sub { |
109 | $record->tuple_with_maybe2([1,'hello']); |
110 | }, qr/Attribute \(tuple_with_maybe2\) does not pass the type constraint/ |
111 | => 'Properly fails for missing maybe (needs to be at least undef)'; |
112 | } |
a30fa891 |
113 | |
114 | ## Test Tuple with parameterized type |
115 | |
116 | lives_ok sub { |
117 | $record->tuple_with_param([1,'hello', [1,2,3]]); |
118 | } => 'Set tuple attribute without error'; |
119 | |
120 | throws_ok sub { |
121 | $record->tuple_with_param([1,'hello', [qw/a b c/]]); |
122 | }, qr/Attribute \(tuple_with_param\) does not pass the type constraint/ |
123 | => 'Properly failed for bad value parameterized constraint'; |
124 | |
125 | ## Test tuple2 (Tuple[Int,Str,Int]) |
126 | |
127 | ok $record->tuple2([1,'hello',3]) |
128 | => "[1,'hello',3] properly suceeds"; |
129 | |
130 | throws_ok sub { |
8dbdca20 |
131 | $record->tuple2([1,2,'world']); |
a30fa891 |
132 | }, qr/Attribute \(tuple2\) does not pass the type constraint/ => "[1,2,'world'] properly fails"; |
133 | |
134 | throws_ok sub { |
8dbdca20 |
135 | $record->tuple2(['hello1',2,3]); |
a30fa891 |
136 | }, qr/Attribute \(tuple2\) does not pass the type constraint/ => "['hello',2,3] properly fails"; |
137 | |
138 | throws_ok sub { |
8dbdca20 |
139 | $record->tuple2(['hello2',2,'world']); |
a30fa891 |
140 | }, qr/Attribute \(tuple2\) does not pass the type constraint/ => "['hello',2,'world'] properly fails"; |
141 | |
142 | |
143 | ## Test tuple_with_parameterized (Tuple[Int,Str,Int,ArrayRef[Int]]) |
144 | |
145 | ok $record->tuple_with_parameterized([1,'hello',3,[1,2,3]]) |
146 | => "[1,'hello',3,[1,2,3]] properly suceeds"; |
147 | |
148 | throws_ok sub { |
8dbdca20 |
149 | $record->tuple_with_parameterized([1,2,'world']); |
a30fa891 |
150 | }, qr/Attribute \(tuple_with_parameterized\) does not pass the type constraint/ |
151 | => "[1,2,'world'] properly fails"; |
152 | |
153 | throws_ok sub { |
8dbdca20 |
154 | $record->tuple_with_parameterized(['hello1',2,3]); |
a30fa891 |
155 | }, qr/Attribute \(tuple_with_parameterized\) does not pass the type constraint/ |
156 | => "['hello',2,3] properly fails"; |
157 | |
158 | throws_ok sub { |
8dbdca20 |
159 | $record->tuple_with_parameterized(['hello2',2,'world']); |
a30fa891 |
160 | }, qr/Attribute \(tuple_with_parameterized\) does not pass the type constraint/ |
161 | => "['hello',2,'world'] properly fails"; |
162 | |
163 | throws_ok sub { |
8dbdca20 |
164 | $record->tuple_with_parameterized([1,'hello',3,[1,2,'world']]); |
a30fa891 |
165 | }, qr/Attribute \(tuple_with_parameterized\) does not pass the type constraint/ |
166 | => "[1,'hello',3,[1,2,'world']] properly fails"; |
a2efc685 |
167 | |
168 | ## Test FiveByFiveAttr |
169 | |
170 | lives_ok sub { |
171 | $record->FiveByFiveAttr([6,[7,8,9]]); |
172 | } => 'Set FiveByFiveAttr correctly'; |
173 | |
174 | throws_ok sub { |
8dbdca20 |
175 | $record->FiveByFiveAttr([1,'hello', 'test']); |
a2efc685 |
176 | }, qr/Attribute \(FiveByFiveAttr\) does not pass the type constraint/ |
177 | => q{Properly failed for bad value in FiveByFiveAttr [1,'hello', 'test']}; |
178 | |
179 | throws_ok sub { |
8dbdca20 |
180 | $record->FiveByFiveAttr([1,[8,9,10]]); |
a2efc685 |
181 | }, qr/Attribute \(FiveByFiveAttr\) does not pass the type constraint/ |
182 | => q{Properly failed for bad value in FiveByFiveAttr [1,[8,9,10]]}; |
8dbdca20 |
183 | |
a2efc685 |
184 | throws_ok sub { |
8dbdca20 |
185 | $record->FiveByFiveAttr([10,[11,12,0]]); |
a2efc685 |
186 | }, qr/Attribute \(FiveByFiveAttr\) does not pass the type constraint/ |
187 | => q{Properly failed for bad value in FiveByFiveAttr [10,[11,12,0]]}; |
8dbdca20 |
188 | |
a2efc685 |
189 | throws_ok sub { |
8dbdca20 |
190 | $record->FiveByFiveAttr([1,[1,1,0]]); |
a2efc685 |
191 | }, qr/Attribute \(FiveByFiveAttr\) does not pass the type constraint/ |
192 | => q{Properly failed for bad value in FiveByFiveAttr [1,[1,1,0]]}; |
193 | |
194 | throws_ok sub { |
8dbdca20 |
195 | $record->FiveByFiveAttr([10,[11,12]]); |
a2efc685 |
196 | }, qr/Attribute \(FiveByFiveAttr\) does not pass the type constraint/ |
197 | => q{Properly failed for bad value in FiveByFiveAttr [10,[11,12]}; |
8dbdca20 |
198 | |