test array delegation edge cases
[gitmo/Moose.git] / t / 070_native_traits / 300_array_subtypes.t
CommitLineData
06d16be0 1#!/usr/bin/env perl
2use strict;
3use warnings;
4use Test::More;
5use Test::Exception;
6
7{
8 use Moose::Util::TypeConstraints;
9 use List::Util qw(sum);
10
11 subtype 'A1', as 'ArrayRef[Int]';
12 subtype 'A2', as 'ArrayRef', where { @$_ < 2 };
13 subtype 'A3', as 'ArrayRef[Int]', where { sum @$_ < 5 };
14
15 no Moose::Util::TypeConstraints;
16}
17
18{
19 package Foo;
20 use Moose;
21
22 has array => (
23 traits => ['Array'],
24 is => 'rw',
25 isa => 'ArrayRef',
26 handles => {
27 push_array => 'push',
28 },
29 );
30 has array_int => (
31 traits => ['Array'],
32 is => 'rw',
33 isa => 'ArrayRef[Int]',
34 handles => {
35 push_array_int => 'push',
36 },
37 );
38 has a1 => (
39 traits => ['Array'],
40 is => 'rw',
41 isa => 'A1',
42 handles => {
43 push_a1 => 'push',
44 },
45 );
46 has a2 => (
47 traits => ['Array'],
48 is => 'rw',
49 isa => 'A2',
50 handles => {
51 push_a2 => 'push',
52 },
53 );
54 has a3 => (
55 traits => ['Array'],
56 is => 'rw',
57 isa => 'A3',
58 handles => {
59 push_a3 => 'push',
60 },
61 );
62}
63
64my $foo = Foo->new;
65
66{
67 my $array = [];
68 dies_ok { $foo->push_array('foo') } "can't push onto undef";
69
70 $foo->array($array);
71 is($foo->array, $array, "same ref");
72 is_deeply($foo->array, [], "correct contents");
73
74 $foo->push_array('foo');
75 is($foo->array, $array, "same ref");
76 is_deeply($foo->array, ['foo'], "correct contents");
77}
78
79{
80 my $array = [];
81 dies_ok { $foo->push_array_int(1) } "can't push onto undef";
82
83 $foo->array_int($array);
84 is($foo->array_int, $array, "same ref");
85 is_deeply($foo->array_int, [], "correct contents");
86
87 dies_ok { $foo->push_array_int('foo') } "can't push wrong type";
88 is($foo->array_int, $array, "same ref");
89 is_deeply($foo->array_int, [], "correct contents");
90 @$array = ();
91
92 $foo->push_array_int(1);
93 is($foo->array_int, $array, "same ref");
94 is_deeply($foo->array_int, [1], "correct contents");
95}
96
97{
98 my $array = [];
99 dies_ok { $foo->push_a1('foo') } "can't push onto undef";
100
101 $foo->a1($array);
102 is($foo->a1, $array, "same ref");
103 is_deeply($foo->a1, [], "correct contents");
104
105 { local $TODO = "type parameters aren't checked on subtypes";
106 dies_ok { $foo->push_a1('foo') } "can't push wrong type";
107 }
108 is($foo->a1, $array, "same ref");
109 { local $TODO = "type parameters aren't checked on subtypes";
110 is_deeply($foo->a1, [], "correct contents");
111 }
112 @$array = ();
113
114 $foo->push_a1(1);
115 is($foo->a1, $array, "same ref");
116 is_deeply($foo->a1, [1], "correct contents");
117}
118
119{
120 my $array = [];
121 dies_ok { $foo->push_a2('foo') } "can't push onto undef";
122
123 $foo->a2($array);
124 is($foo->a2, $array, "same ref");
125 is_deeply($foo->a2, [], "correct contents");
126
127 $foo->push_a2('foo');
128 is($foo->a2, $array, "same ref");
129 is_deeply($foo->a2, ['foo'], "correct contents");
130
131 { local $TODO = "overall tcs aren't checked";
132 dies_ok { $foo->push_a2('bar') } "can't push more than one element";
133 }
134 is($foo->a2, $array, "same ref");
135 { local $TODO = "overall tcs aren't checked";
136 is_deeply($foo->a2, ['foo'], "correct contents");
137 }
138}
139
140{
141 my $array = [];
142 dies_ok { $foo->push_a3(1) } "can't push onto undef";
143
144 $foo->a3($array);
145 is($foo->a3, $array, "same ref");
146 is_deeply($foo->a3, [], "correct contents");
147
148 { local $TODO = "tc parameters aren't checked on subtypes";
149 dies_ok { $foo->push_a3('foo') } "can't push non-int";
150 }
151 { local $TODO = "overall tcs aren't checked";
152 dies_ok { $foo->push_a3(100) } "can't violate overall type constraint";
153 }
154 is($foo->a3, $array, "same ref");
155 { local $TODO = "tc checks are broken";
156 is_deeply($foo->a3, [], "correct contents");
157 }
158 @$array = ();
159
160 $foo->push_a3(1);
161 is($foo->a3, $array, "same ref");
162 is_deeply($foo->a3, [1], "correct contents");
163
164 { local $TODO = "overall tcs aren't checked";
165 dies_ok { $foo->push_a3(100) } "can't violate overall type constraint";
166 }
167 is($foo->a3, $array, "same ref");
168 { local $TODO = "overall tcs aren't checked";
169 is_deeply($foo->a3, [1], "correct contents");
170 }
171 @$array = (1);
172
173 $foo->push_a3(3);
174 is($foo->a3, $array, "same ref");
175 is_deeply($foo->a3, [1, 3], "correct contents");
176}
177
178done_testing;