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