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