Inline the does method.
[gitmo/Moose.git] / t / 030_roles / 045_role_compose_requires.t
CommitLineData
f5298daf 1# See https://rt.cpan.org/Ticket/Display.html?id=46347
2
0a72c036 3use strict;
e3d22b28 4use warnings;
5
f5298daf 6use Test::More;
0a72c036 7use Test::Exception;
8
f5298daf 9{
10 package My::Role1;
11 use Moose::Role;
12 requires 'test_output';
0a72c036 13}
f5298daf 14
15{
16 package My::Role2;
17 use Moose::Role;
18 has test_output => ( is => 'rw' );
19 with 'My::Role1';
0a72c036 20}
f5298daf 21
22{
23 package My::Role3;
24 use Moose::Role;
25 sub test_output { }
26 with 'My::Role1';
0a72c036 27}
f5298daf 28
29{
30 package My::Role4;
31 use Moose::Role;
32 has test_output => ( is => 'rw' );
0a72c036 33}
f5298daf 34
35{
36 package My::Role5;
37 use Moose::Role;
38 sub test_output { }
0a72c036 39}
f5298daf 40
41{
42 package My::Base1;
43 use Moose;
44 has test_output => ( is => 'rw' );
0a72c036 45}
f5298daf 46
47{
48 package My::Base2;
49 use Moose;
50 sub test_output { }
0a72c036 51}
52
53# Roles providing attributes/methods should satisfy requires() of other
54# roles they consume.
f5298daf 55{
56 local $TODO = "role attributes don't satisfy method requirements";
57 lives_ok { package My::Test1; use Moose; with 'My::Role2'; }
0a72c036 58 'role2(provides attribute) consumes role1';
59}
60
61lives_ok { package My::Test2; use Moose; with 'My::Role3'; }
f5298daf 62'role3(provides method) consumes role1';
0a72c036 63
64# As I understand the design, Roles composed in the same with() statement
65# should NOT demonstrate ordering dependency. Alter these tests if that
66# assumption is false. -Vince Veselosky
f5298daf 67{
68 local $TODO = "role attributes don't satisfy method requirements";
69 lives_ok { package My::Test3; use Moose; with 'My::Role4', 'My::Role1'; }
0a72c036 70 'class consumes role4(provides attribute), role1';
71}
72
f5298daf 73{
74 local $TODO = "role attributes don't satisfy method requirements";
75 lives_ok { package My::Test4; use Moose; with 'My::Role1', 'My::Role4'; }
0a72c036 76 'class consumes role1, role4(provides attribute)';
77}
78
f5298daf 79lives_ok { package My::Test5; use Moose; with 'My::Role5', 'My::Role1'; }
80'class consumes role5(provides method), role1';
0a72c036 81
f5298daf 82lives_ok { package My::Test6; use Moose; with 'My::Role1', 'My::Role5'; }
83'class consumes role1, role5(provides method)';
0a72c036 84
f5298daf 85# Inherited methods/attributes should satisfy requires(), as long as
0a72c036 86# extends() comes first in code order.
f5298daf 87lives_ok {
88 package My::Test7;
89 use Moose;
90 extends 'My::Base1';
91 with 'My::Role1';
92}
93'class extends base1(provides attribute), consumes role1';
0a72c036 94
f5298daf 95lives_ok {
96 package My::Test8;
97 use Moose;
98 extends 'My::Base2';
99 with 'My::Role1';
100}
101'class extends base2(provides method), consumes role1';
0a72c036 102
103# Attributes/methods implemented in class should satisfy requires()
f5298daf 104lives_ok {
105
106 package My::Test9;
107 use Moose;
108 has 'test_output', is => 'rw';
109 with 'My::Role1';
110}
111'class provides attribute, consumes role1';
112
113lives_ok {
0a72c036 114
f5298daf 115 package My::Test10;
116 use Moose;
117 sub test_output { }
118 with 'My::Role1';
119}
120'class provides method, consumes role1';
0a72c036 121
f5298daf 122# Roles composed in separate with() statements SHOULD demonstrate ordering
0a72c036 123# dependency. See comment with tests 3-6 above.
f5298daf 124lives_ok {
125 package My::Test11;
126 use Moose;
127 with 'My::Role4';
128 with 'My::Role1';
129}
130'class consumes role4(provides attribute); consumes role1';
0a72c036 131
f5298daf 132dies_ok { package My::Test12; use Moose; with 'My::Role1'; with 'My::Role4'; }
133'class consumes role1; consumes role4(provides attribute)';
0a72c036 134
f5298daf 135lives_ok {
136 package My::Test13;
137 use Moose;
138 with 'My::Role5';
139 with 'My::Role1';
140}
141'class consumes role5(provides method); consumes role1';
0a72c036 142
143dies_ok { package My::Test14; use Moose; with 'My::Role1'; with 'My::Role5'; }
f5298daf 144'class consumes role1; consumes role5(provides method)';
0a72c036 145
f5298daf 146done_testing;