more-roles
[gitmo/Moose.git] / t / 047_role_conflict_edge_cases.t
CommitLineData
d30bc041 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
a2eec5e7 6use Test::More tests => 34;
d30bc041 7use Test::Exception;
8
9BEGIN {
10 use_ok('Moose');
11 use_ok('Moose::Role');
12}
13
14=pod
15
16Check for repeated inheritence causing
17a method conflict (which is not really
18a conflict)
19
20=cut
21
22{
23 package Role::Base;
24 use strict;
25 use warnings;
26 use Moose::Role;
27
28 sub foo { 'Role::Base::foo' }
29
30 package Role::Derived1;
31 use strict;
32 use warnings;
33 use Moose::Role;
34
35 with 'Role::Base';
36
37 package Role::Derived2;
38 use strict;
39 use warnings;
40 use Moose::Role;
41
42 with 'Role::Base';
43
44 package My::Test::Class1;
45 use strict;
46 use warnings;
47 use Moose;
48
49 ::lives_ok {
50 with 'Role::Derived1', 'Role::Derived2';
51 } '... roles composed okay (no conflicts)';
52}
53
54ok(Role::Base->meta->has_method('foo'), '... have the method foo as expected');
55ok(Role::Derived1->meta->has_method('foo'), '... have the method foo as expected');
56ok(Role::Derived2->meta->has_method('foo'), '... have the method foo as expected');
57ok(My::Test::Class1->meta->has_method('foo'), '... have the method foo as expected');
58
59is(My::Test::Class1->foo, 'Role::Base::foo', '... got the right value from method');
60
61=pod
62
63Check for repeated inheritence causing
64a method conflict with method modifiers
65(which is not really a conflict)
66
67=cut
68
69{
70 package Role::Base2;
71 use strict;
72 use warnings;
73 use Moose::Role;
74
75 override 'foo' => sub { super() . ' -> Role::Base::foo' };
76
77 package Role::Derived3;
78 use strict;
79 use warnings;
80 use Moose::Role;
81
82 with 'Role::Base2';
83
84 package Role::Derived4;
85 use strict;
86 use warnings;
87 use Moose::Role;
88
89 with 'Role::Base2';
90
91 package My::Test::Class2::Base;
92 use strict;
93 use warnings;
94 use Moose;
95
96 sub foo { 'My::Test::Class2::Base' }
97
98 package My::Test::Class2;
99 use strict;
100 use warnings;
101 use Moose;
102
103 extends 'My::Test::Class2::Base';
104
105 ::lives_ok {
106 with 'Role::Derived3', 'Role::Derived4';
107 } '... roles composed okay (no conflicts)';
108}
109
110ok(Role::Base2->meta->has_override_method_modifier('foo'), '... have the method foo as expected');
111ok(Role::Derived3->meta->has_override_method_modifier('foo'), '... have the method foo as expected');
112ok(Role::Derived4->meta->has_override_method_modifier('foo'), '... have the method foo as expected');
113ok(My::Test::Class2->meta->has_method('foo'), '... have the method foo as expected');
114isa_ok(My::Test::Class2->meta->get_method('foo'), 'Moose::Meta::Method::Overriden');
115ok(My::Test::Class2::Base->meta->has_method('foo'), '... have the method foo as expected');
116isa_ok(My::Test::Class2::Base->meta->get_method('foo'), 'Class::MOP::Method');
117
118is(My::Test::Class2::Base->foo, 'My::Test::Class2::Base', '... got the right value from method');
119is(My::Test::Class2->foo, 'My::Test::Class2::Base -> Role::Base::foo', '... got the right value from method');
120
121=pod
122
123Check for repeated inheritence of the
124same code. There are no conflicts with
125before/around/after method modifiers.
126
127This tests around, but should work the
128same for before/afters as well
129
130=cut
131
132{
133 package Role::Base3;
134 use strict;
135 use warnings;
136 use Moose::Role;
137
138 around 'foo' => sub { 'Role::Base::foo(' . (shift)->() . ')' };
139
140 package Role::Derived5;
141 use strict;
142 use warnings;
143 use Moose::Role;
144
145 with 'Role::Base3';
146
147 package Role::Derived6;
148 use strict;
149 use warnings;
150 use Moose::Role;
151
152 with 'Role::Base3';
153
154 package My::Test::Class3::Base;
155 use strict;
156 use warnings;
157 use Moose;
158
159 sub foo { 'My::Test::Class3::Base' }
160
161 package My::Test::Class3;
162 use strict;
163 use warnings;
164 use Moose;
165
166 extends 'My::Test::Class3::Base';
167
168 ::lives_ok {
169 with 'Role::Derived5', 'Role::Derived6';
170 } '... roles composed okay (no conflicts)';
171}
172
173ok(Role::Base3->meta->has_around_method_modifiers('foo'), '... have the method foo as expected');
174ok(Role::Derived5->meta->has_around_method_modifiers('foo'), '... have the method foo as expected');
175ok(Role::Derived6->meta->has_around_method_modifiers('foo'), '... have the method foo as expected');
176ok(My::Test::Class3->meta->has_method('foo'), '... have the method foo as expected');
177isa_ok(My::Test::Class3->meta->get_method('foo'), 'Class::MOP::Method::Wrapped');
178ok(My::Test::Class3::Base->meta->has_method('foo'), '... have the method foo as expected');
179isa_ok(My::Test::Class3::Base->meta->get_method('foo'), 'Class::MOP::Method');
180
181is(My::Test::Class3::Base->foo, 'My::Test::Class3::Base', '... got the right value from method');
182is(My::Test::Class3->foo, 'Role::Base::foo(My::Test::Class3::Base)', '... got the right value from method');
a2eec5e7 183
184=pod
185
186Check for repeated inheritence causing
187a attr conflict (which is not really
188a conflict)
189
190=cut
191
192{
193 package Role::Base4;
194 use strict;
195 use warnings;
196 use Moose::Role;
197
198 has 'foo' => (is => 'ro', default => 'Role::Base::foo');
199
200 package Role::Derived7;
201 use strict;
202 use warnings;
203 use Moose::Role;
204
205 with 'Role::Base4';
206
207 package Role::Derived8;
208 use strict;
209 use warnings;
210 use Moose::Role;
211
212 with 'Role::Base4';
213
214 package My::Test::Class4;
215 use strict;
216 use warnings;
217 use Moose;
218
219 ::lives_ok {
220 with 'Role::Derived7', 'Role::Derived8';
221 } '... roles composed okay (no conflicts)';
222}
223
224ok(Role::Base4->meta->has_attribute('foo'), '... have the attribute foo as expected');
225ok(Role::Derived7->meta->has_attribute('foo'), '... have the attribute foo as expected');
226ok(Role::Derived8->meta->has_attribute('foo'), '... have the attribute foo as expected');
227ok(My::Test::Class4->meta->has_attribute('foo'), '... have the attribute foo as expected');
228
229is(My::Test::Class4->new->foo, 'Role::Base::foo', '... got the right value from method');