Revert most of the conversion to Test::Fatal so we can redo it
[gitmo/Moose.git] / t / 030_roles / 045_role_compose_requires.t
1 # See https://rt.cpan.org/Ticket/Display.html?id=46347
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7 use Test::Exception;
8
9 {
10     package My::Role1;
11     use Moose::Role;
12     requires 'test_output';
13 }
14
15 {
16     package My::Role2;
17     use Moose::Role;
18     has test_output => ( is => 'rw' );
19     with 'My::Role1';
20 }
21
22 {
23     package My::Role3;
24     use Moose::Role;
25     sub test_output { }
26     with 'My::Role1';
27 }
28
29 {
30     package My::Role4;
31     use Moose::Role;
32     has test_output => ( is => 'rw' );
33 }
34
35 {
36     package My::Role5;
37     use Moose::Role;
38     sub test_output { }
39 }
40
41 {
42     package My::Base1;
43     use Moose;
44     has test_output => ( is => 'rw' );
45 }
46
47 {
48     package My::Base2;
49     use Moose;
50     sub test_output { }
51 }
52
53 # Roles providing attributes/methods should satisfy requires() of other
54 # roles they consume.
55 {
56     local $TODO = "role attributes don't satisfy method requirements";
57     lives_ok { package My::Test1; use Moose; with 'My::Role2'; }
58     'role2(provides attribute) consumes role1';
59 }
60
61 lives_ok { package My::Test2; use Moose; with 'My::Role3'; }
62 'role3(provides method) consumes role1';
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
67 {
68     local $TODO = "role attributes don't satisfy method requirements";
69     lives_ok { package My::Test3; use Moose; with 'My::Role4', 'My::Role1'; }
70     'class consumes role4(provides attribute), role1';
71 }
72
73 {
74     local $TODO = "role attributes don't satisfy method requirements";
75     lives_ok { package My::Test4; use Moose; with 'My::Role1', 'My::Role4'; }
76     'class consumes role1, role4(provides attribute)';
77 }
78
79 lives_ok { package My::Test5; use Moose; with 'My::Role5', 'My::Role1'; }
80 'class consumes role5(provides method), role1';
81
82 lives_ok { package My::Test6; use Moose; with 'My::Role1', 'My::Role5'; }
83 'class consumes role1, role5(provides method)';
84
85 # Inherited methods/attributes should satisfy requires(), as long as
86 # extends() comes first in code order.
87 lives_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';
94
95 lives_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';
102
103 # Attributes/methods implemented in class should satisfy requires()
104 lives_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
113 lives_ok {
114
115     package My::Test10;
116     use Moose;
117     sub test_output { }
118     with 'My::Role1';
119 }
120 'class provides method, consumes role1';
121
122 # Roles composed in separate with() statements SHOULD demonstrate ordering
123 # dependency. See comment with tests 3-6 above.
124 lives_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';
131
132 dies_ok { package My::Test12; use Moose; with 'My::Role1'; with 'My::Role4'; }
133 'class consumes role1; consumes role4(provides attribute)';
134
135 lives_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';
142
143 dies_ok { package My::Test14; use Moose; with 'My::Role1'; with 'My::Role5'; }
144 'class consumes role1; consumes role5(provides method)';
145
146 done_testing;