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