Commit | Line | Data |
c47cf415 |
1 | #!/usr/bin/env perl |
2 | # This is automatically generated by author/import-moose-test.pl. |
3 | # DO NOT EDIT THIS FILE. ANY CHANGES WILL BE LOST!!! |
4 | use t::lib::MooseCompat; |
5 | use strict; |
6 | use warnings; |
7 | use lib 't/lib'; |
8 | use Test::More; |
9 | $TODO = q{Mouse is not yet completed}; |
10 | use Test::Exception; |
11 | |
12 | our $called = 0; |
13 | { |
14 | package Foo::Trait::Constructor; |
15 | use Mouse::Role; |
16 | |
17 | around _generate_BUILDALL => sub { |
18 | my $orig = shift; |
19 | my $self = shift; |
20 | return $self->$orig(@_) . '$::called++;'; |
21 | } |
22 | } |
23 | |
24 | { |
25 | package Foo; |
26 | use Mouse; |
27 | Mouse::Util::MetaRole::apply_metaroles( |
28 | for => __PACKAGE__, |
29 | class_metaroles => { |
30 | constructor => ['Foo::Trait::Constructor'], |
31 | } |
32 | ); |
33 | } |
34 | |
35 | Foo->new; |
36 | is($called, 0, "no calls before inlining"); |
37 | Foo->meta->make_immutable; |
38 | |
39 | Foo->new; |
40 | is($called, 1, "inlined constructor has trait modifications"); |
41 | |
42 | ok(Foo->meta->constructor_class->meta->does_role('Foo::Trait::Constructor'), |
43 | "class has correct constructor traits"); |
44 | |
45 | { |
46 | package Foo::Sub; |
47 | use Mouse; |
48 | extends 'Foo'; |
49 | } |
50 | |
51 | $called = 0; |
52 | |
53 | Foo::Sub->new; |
54 | is($called, 0, "no calls before inlining"); |
55 | |
56 | Foo::Sub->meta->make_immutable; |
57 | |
58 | Foo::Sub->new; |
59 | is($called, 1, "inherits constructor trait properly"); |
60 | |
61 | ok(Foo::Sub->meta->constructor_class->meta->can('does_role') |
62 | && Foo::Sub->meta->constructor_class->meta->does_role('Foo::Trait::Constructor'), |
63 | "subclass inherits constructor traits"); |
64 | |
65 | { |
66 | package Foo2::Role; |
67 | use Mouse::Role; |
68 | } |
69 | { |
70 | package Foo2; |
71 | use Mouse -traits => ['Foo2::Role']; |
72 | } |
73 | { |
74 | package Bar2; |
75 | use Mouse; |
76 | } |
77 | { |
78 | package Baz2; |
79 | use Mouse; |
80 | my $meta = __PACKAGE__->meta; |
81 | ::lives_ok { $meta->superclasses('Foo2') } "can set superclasses once"; |
82 | ::isa_ok($meta, Foo2->meta->meta->name); |
83 | ::lives_ok { $meta->superclasses('Bar2') } "can still set superclasses"; |
84 | ::isa_ok($meta, Bar2->meta->meta->name); |
85 | ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance], |
86 | ['Foo2::Role'], |
87 | "still have the role attached"); |
88 | ::ok(!$meta->is_immutable, |
89 | "immutable superclass doesn't make this class immutable"); |
90 | ::lives_ok { $meta->make_immutable } "can still make immutable"; |
91 | } |
92 | { |
93 | package Foo3::Role; |
94 | use Mouse::Role; |
95 | } |
96 | { |
97 | package Bar3; |
98 | use Mouse -traits => ['Foo3::Role']; |
99 | } |
100 | { |
101 | package Baz3; |
102 | use Mouse -traits => ['Foo3::Role']; |
103 | my $meta = __PACKAGE__->meta; |
104 | ::lives_ok { $meta->superclasses('Foo2') } "can set superclasses once"; |
105 | ::isa_ok($meta, Foo2->meta->meta->name); |
106 | ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance], |
107 | ['Foo2::Role', 'Foo3::Role'], |
108 | "reconciled roles correctly"); |
109 | ::lives_ok { $meta->superclasses('Bar3') } "can still set superclasses"; |
110 | ::isa_ok($meta, Bar3->meta->meta->name); |
111 | ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance], |
112 | ['Foo2::Role', 'Foo3::Role'], |
113 | "roles still the same"); |
114 | ::ok(!$meta->is_immutable, |
115 | "immutable superclass doesn't make this class immutable"); |
116 | ::lives_ok { $meta->make_immutable } "can still make immutable"; |
117 | } |
118 | { |
119 | package Quux3; |
120 | use Mouse; |
121 | } |
122 | { |
123 | package Quuux3; |
124 | use Mouse -traits => ['Foo3::Role']; |
125 | my $meta = __PACKAGE__->meta; |
126 | ::lives_ok { $meta->superclasses('Foo2') } "can set superclasses once"; |
127 | ::isa_ok($meta, Foo2->meta->meta->name); |
128 | ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance], |
129 | ['Foo2::Role', 'Foo3::Role'], |
130 | "reconciled roles correctly"); |
131 | ::lives_ok { $meta->superclasses('Quux3') } "can still set superclasses"; |
132 | ::isa_ok($meta, Quux3->meta->meta->name); |
133 | ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance], |
134 | ['Foo2::Role', 'Foo3::Role'], |
135 | "roles still the same"); |
136 | ::ok(!$meta->is_immutable, |
137 | "immutable superclass doesn't make this class immutable"); |
138 | ::lives_ok { $meta->make_immutable } "can still make immutable"; |
139 | } |
140 | |
141 | { |
142 | package Foo4::Role; |
143 | use Mouse::Role; |
144 | } |
145 | { |
146 | package Foo4; |
147 | use Mouse -traits => ['Foo4::Role']; |
148 | __PACKAGE__->meta->make_immutable; |
149 | } |
150 | { |
151 | package Bar4; |
152 | use Mouse; |
153 | } |
154 | { |
155 | package Baz4; |
156 | use Mouse; |
157 | my $meta = __PACKAGE__->meta; |
158 | ::lives_ok { $meta->superclasses('Foo4') } "can set superclasses once"; |
159 | ::isa_ok($meta, Foo4->meta->_get_mutable_metaclass_name); |
160 | ::lives_ok { $meta->superclasses('Bar4') } "can still set superclasses"; |
161 | ::isa_ok($meta, Bar4->meta->meta->name); |
162 | ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance], |
163 | ['Foo4::Role'], |
164 | "still have the role attached"); |
165 | ::ok(!$meta->is_immutable, |
166 | "immutable superclass doesn't make this class immutable"); |
167 | ::lives_ok { $meta->make_immutable } "can still make immutable"; |
168 | } |
169 | { |
170 | package Foo5::Role; |
171 | use Mouse::Role; |
172 | } |
173 | { |
174 | package Bar5; |
175 | use Mouse -traits => ['Foo5::Role']; |
176 | } |
177 | { |
178 | package Baz5; |
179 | use Mouse -traits => ['Foo5::Role']; |
180 | my $meta = __PACKAGE__->meta; |
181 | ::lives_ok { $meta->superclasses('Foo4') } "can set superclasses once"; |
182 | ::isa_ok($meta, Foo4->meta->_get_mutable_metaclass_name); |
183 | ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance], |
184 | ['Foo4::Role', 'Foo5::Role'], |
185 | "reconciled roles correctly"); |
186 | ::lives_ok { $meta->superclasses('Bar5') } "can still set superclasses"; |
187 | ::isa_ok($meta, Bar5->meta->meta->name); |
188 | ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance], |
189 | ['Foo4::Role', 'Foo5::Role'], |
190 | "roles still the same"); |
191 | ::ok(!$meta->is_immutable, |
192 | "immutable superclass doesn't make this class immutable"); |
193 | ::lives_ok { $meta->make_immutable } "can still make immutable"; |
194 | } |
195 | { |
196 | package Quux5; |
197 | use Mouse; |
198 | } |
199 | { |
200 | package Quuux5; |
201 | use Mouse -traits => ['Foo5::Role']; |
202 | my $meta = __PACKAGE__->meta; |
203 | ::lives_ok { $meta->superclasses('Foo4') } "can set superclasses once"; |
204 | ::isa_ok($meta, Foo4->meta->_get_mutable_metaclass_name); |
205 | ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance], |
206 | ['Foo4::Role', 'Foo5::Role'], |
207 | "reconciled roles correctly"); |
208 | ::lives_ok { $meta->superclasses('Quux5') } "can still set superclasses"; |
209 | ::isa_ok($meta, Quux5->meta->meta->name); |
210 | ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance], |
211 | ['Foo4::Role', 'Foo5::Role'], |
212 | "roles still the same"); |
213 | ::ok(!$meta->is_immutable, |
214 | "immutable superclass doesn't make this class immutable"); |
215 | ::lives_ok { $meta->make_immutable } "can still make immutable"; |
216 | } |
217 | |
218 | { |
219 | package Foo5::Meta::Role; |
220 | use Mouse::Role; |
221 | } |
222 | { |
223 | package Foo5::SuperClass::WithMetaRole; |
224 | use Mouse -traits =>'Foo5::Meta::Role'; |
225 | } |
226 | { |
227 | package Foo5::SuperClass::After::Attribute; |
228 | use Mouse; |
229 | } |
230 | { |
231 | package Foo5; |
232 | use Mouse; |
233 | my @superclasses = ('Foo5::SuperClass::WithMetaRole'); |
234 | extends @superclasses; |
235 | |
236 | has an_attribute_generating_methods => ( is => 'ro' ); |
237 | |
238 | push(@superclasses, 'Foo5::SuperClass::After::Attribute'); |
239 | |
240 | ::lives_ok { |
241 | extends @superclasses; |
242 | } 'MI extends after_generated_methods with metaclass roles'; |
243 | ::lives_ok { |
244 | extends reverse @superclasses; |
245 | } |
246 | 'MI extends after_generated_methods with metaclass roles (reverse)'; |
247 | } |
248 | |
249 | { |
250 | package Foo6::Meta::Role; |
251 | use Mouse::Role; |
252 | } |
253 | { |
254 | package Foo6::SuperClass::WithMetaRole; |
255 | use Mouse -traits =>'Foo6::Meta::Role'; |
256 | } |
257 | { |
258 | package Foo6::Meta::OtherRole; |
259 | use Mouse::Role; |
260 | } |
261 | { |
262 | package Foo6::SuperClass::After::Attribute; |
263 | use Mouse -traits =>'Foo6::Meta::OtherRole'; |
264 | } |
265 | { |
266 | package Foo6; |
267 | use Mouse; |
268 | my @superclasses = ('Foo6::SuperClass::WithMetaRole'); |
269 | extends @superclasses; |
270 | |
271 | has an_attribute_generating_methods => ( is => 'ro' ); |
272 | |
273 | push(@superclasses, 'Foo6::SuperClass::After::Attribute'); |
274 | |
275 | ::throws_ok { |
276 | extends @superclasses; |
277 | } qr/compat.*pristine/, |
278 | 'unsafe MI extends after_generated_methods with metaclass roles'; |
279 | ::throws_ok { |
280 | extends reverse @superclasses; |
281 | } qr/compat.*pristine/, |
282 | 'unsafe MI extends after_generated_methods with metaclass roles (reverse)'; |
283 | } |
284 | |
285 | { |
286 | package Foo7::Meta::Trait; |
287 | use Mouse::Role; |
288 | } |
289 | |
290 | { |
291 | package Foo7; |
292 | use Mouse -traits => ['Foo7::Meta::Trait']; |
293 | } |
294 | |
295 | { |
296 | package Bar7; |
297 | # in an external file |
298 | use Mouse -traits => ['Bar7::Meta::Trait']; |
299 | ::lives_ok { extends 'Foo7' } "role reconciliation works"; |
300 | } |
301 | |
302 | { |
303 | package Bar72; |
304 | # in an external file |
305 | use Mouse -traits => ['Bar7::Meta::Trait2']; |
306 | ::lives_ok { extends 'Foo7' } "role reconciliation works"; |
307 | } |
308 | |
309 | done_testing; |