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; |
b10dde3a |
7 | use Test::Fatal; |
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"; |
b10dde3a |
57 | is( exception { package My::Test1; use Moose; with 'My::Role2'; }, undef, 'role2(provides attribute) consumes role1' ); |
0a72c036 |
58 | } |
59 | |
b10dde3a |
60 | is( exception { package My::Test2; use Moose; with 'My::Role3'; }, undef, '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"; |
b10dde3a |
67 | is( exception { package My::Test3; use Moose; with 'My::Role4', 'My::Role1'; }, undef, 'class consumes role4(provides attribute), role1' ); |
0a72c036 |
68 | } |
69 | |
f5298daf |
70 | { |
71 | local $TODO = "role attributes don't satisfy method requirements"; |
b10dde3a |
72 | is( exception { package My::Test4; use Moose; with 'My::Role1', 'My::Role4'; }, undef, 'class consumes role1, role4(provides attribute)' ); |
0a72c036 |
73 | } |
74 | |
b10dde3a |
75 | is( exception { package My::Test5; use Moose; with 'My::Role5', 'My::Role1'; }, undef, 'class consumes role5(provides method), role1' ); |
0a72c036 |
76 | |
b10dde3a |
77 | is( exception { package My::Test6; use Moose; with 'My::Role1', 'My::Role5'; }, undef, 'class consumes role1, role5(provides method)' ); |
0a72c036 |
78 | |
f5298daf |
79 | # Inherited methods/attributes should satisfy requires(), as long as |
0a72c036 |
80 | # extends() comes first in code order. |
b10dde3a |
81 | is( exception { |
f5298daf |
82 | package My::Test7; |
83 | use Moose; |
84 | extends 'My::Base1'; |
85 | with 'My::Role1'; |
b10dde3a |
86 | }, undef, 'class extends base1(provides attribute), consumes role1' ); |
0a72c036 |
87 | |
b10dde3a |
88 | is( exception { |
f5298daf |
89 | package My::Test8; |
90 | use Moose; |
91 | extends 'My::Base2'; |
92 | with 'My::Role1'; |
b10dde3a |
93 | }, undef, 'class extends base2(provides method), consumes role1' ); |
0a72c036 |
94 | |
95 | # Attributes/methods implemented in class should satisfy requires() |
b10dde3a |
96 | is( exception { |
f5298daf |
97 | |
98 | package My::Test9; |
99 | use Moose; |
100 | has 'test_output', is => 'rw'; |
101 | with 'My::Role1'; |
b10dde3a |
102 | }, undef, 'class provides attribute, consumes role1' ); |
f5298daf |
103 | |
b10dde3a |
104 | is( exception { |
0a72c036 |
105 | |
f5298daf |
106 | package My::Test10; |
107 | use Moose; |
108 | sub test_output { } |
109 | with 'My::Role1'; |
b10dde3a |
110 | }, undef, 'class provides method, consumes role1' ); |
0a72c036 |
111 | |
f5298daf |
112 | # Roles composed in separate with() statements SHOULD demonstrate ordering |
0a72c036 |
113 | # dependency. See comment with tests 3-6 above. |
b10dde3a |
114 | is( exception { |
f5298daf |
115 | package My::Test11; |
116 | use Moose; |
117 | with 'My::Role4'; |
118 | with 'My::Role1'; |
b10dde3a |
119 | }, undef, 'class consumes role4(provides attribute); consumes role1' ); |
0a72c036 |
120 | |
b10dde3a |
121 | isnt( exception { package My::Test12; use Moose; with 'My::Role1'; with 'My::Role4'; }, undef, 'class consumes role1; consumes role4(provides attribute)' ); |
0a72c036 |
122 | |
b10dde3a |
123 | is( exception { |
f5298daf |
124 | package My::Test13; |
125 | use Moose; |
126 | with 'My::Role5'; |
127 | with 'My::Role1'; |
b10dde3a |
128 | }, undef, 'class consumes role5(provides method); consumes role1' ); |
0a72c036 |
129 | |
b10dde3a |
130 | isnt( exception { package My::Test14; use Moose; with 'My::Role1'; with 'My::Role5'; }, undef, 'class consumes role1; consumes role5(provides method)' ); |
0a72c036 |
131 | |
f5298daf |
132 | done_testing; |