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