Commit | Line | Data |
f5298daf |
1 | # See https://rt.cpan.org/Ticket/Display.html?id=46347 |
2 | |
0a72c036 |
3 | use strict; |
f5298daf |
4 | use Test::More; |
0a72c036 |
5 | use 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 | |
59 | lives_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 |
77 | lives_ok { package My::Test5; use Moose; with 'My::Role5', 'My::Role1'; } |
78 | 'class consumes role5(provides method), role1'; |
0a72c036 |
79 | |
f5298daf |
80 | lives_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 |
85 | lives_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 |
93 | lives_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 |
102 | lives_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 | |
111 | lives_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 |
122 | lives_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 |
130 | dies_ok { package My::Test12; use Moose; with 'My::Role1'; with 'My::Role4'; } |
131 | 'class consumes role1; consumes role4(provides attribute)'; |
0a72c036 |
132 | |
f5298daf |
133 | lives_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 | |
141 | dies_ok { package My::Test14; use Moose; with 'My::Role1'; with 'My::Role5'; } |
f5298daf |
142 | 'class consumes role1; consumes role5(provides method)'; |
0a72c036 |
143 | |
f5298daf |
144 | done_testing; |