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