Commit | Line | Data |
f5298daf |
1 | # See https://rt.cpan.org/Ticket/Display.html?id=46347 |
2 | |
0a72c036 |
3 | use strict; |
e3d22b28 |
4 | use warnings; |
5 | |
f5298daf |
6 | use Test::More; |
53a4d826 |
7 | use Test::Exception; |
0a72c036 |
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"; |
53a4d826 |
57 | lives_ok { package My::Test1; use Moose; with 'My::Role2'; } |
0a72c036 |
58 | 'role2(provides attribute) consumes role1'; |
59 | } |
60 | |
53a4d826 |
61 | lives_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"; |
53a4d826 |
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"; |
53a4d826 |
75 | lives_ok { package My::Test4; use Moose; with 'My::Role1', 'My::Role4'; } |
0a72c036 |
76 | 'class consumes role1, role4(provides attribute)'; |
77 | } |
78 | |
53a4d826 |
79 | lives_ok { package My::Test5; use Moose; with 'My::Role5', 'My::Role1'; } |
f5298daf |
80 | 'class consumes role5(provides method), role1'; |
0a72c036 |
81 | |
53a4d826 |
82 | lives_ok { package My::Test6; use Moose; with 'My::Role1', 'My::Role5'; } |
f5298daf |
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. |
53a4d826 |
87 | lives_ok { |
f5298daf |
88 | package My::Test7; |
89 | use Moose; |
90 | extends 'My::Base1'; |
91 | with 'My::Role1'; |
53a4d826 |
92 | } |
f5298daf |
93 | 'class extends base1(provides attribute), consumes role1'; |
0a72c036 |
94 | |
53a4d826 |
95 | lives_ok { |
f5298daf |
96 | package My::Test8; |
97 | use Moose; |
98 | extends 'My::Base2'; |
99 | with 'My::Role1'; |
53a4d826 |
100 | } |
f5298daf |
101 | 'class extends base2(provides method), consumes role1'; |
0a72c036 |
102 | |
103 | # Attributes/methods implemented in class should satisfy requires() |
53a4d826 |
104 | lives_ok { |
f5298daf |
105 | |
106 | package My::Test9; |
107 | use Moose; |
108 | has 'test_output', is => 'rw'; |
109 | with 'My::Role1'; |
53a4d826 |
110 | } |
f5298daf |
111 | 'class provides attribute, consumes role1'; |
112 | |
53a4d826 |
113 | lives_ok { |
0a72c036 |
114 | |
f5298daf |
115 | package My::Test10; |
116 | use Moose; |
117 | sub test_output { } |
118 | with 'My::Role1'; |
53a4d826 |
119 | } |
f5298daf |
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. |
53a4d826 |
124 | lives_ok { |
f5298daf |
125 | package My::Test11; |
126 | use Moose; |
127 | with 'My::Role4'; |
128 | with 'My::Role1'; |
53a4d826 |
129 | } |
f5298daf |
130 | 'class consumes role4(provides attribute); consumes role1'; |
0a72c036 |
131 | |
53a4d826 |
132 | dies_ok { package My::Test12; use Moose; with 'My::Role1'; with 'My::Role4'; } |
f5298daf |
133 | 'class consumes role1; consumes role4(provides attribute)'; |
0a72c036 |
134 | |
53a4d826 |
135 | lives_ok { |
f5298daf |
136 | package My::Test13; |
137 | use Moose; |
138 | with 'My::Role5'; |
139 | with 'My::Role1'; |
53a4d826 |
140 | } |
f5298daf |
141 | 'class consumes role5(provides method); consumes role1'; |
0a72c036 |
142 | |
53a4d826 |
143 | dies_ok { package My::Test14; use Moose; with 'My::Role1'; with 'My::Role5'; } |
f5298daf |
144 | 'class consumes role1; consumes role5(provides method)'; |
0a72c036 |
145 | |
f5298daf |
146 | done_testing; |