Cleanup syntax and use done_testing
[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 Test::More;
5 use Test::Exception;
6
7 {
8     package My::Role1;
9     use Moose::Role;
10     requires 'test_output';
11 }
12
13 {
14     package My::Role2;
15     use Moose::Role;
16     has test_output => ( is => 'rw' );
17     with 'My::Role1';
18 }
19
20 {
21     package My::Role3;
22     use Moose::Role;
23     sub test_output { }
24     with 'My::Role1';
25 }
26
27 {
28     package My::Role4;
29     use Moose::Role;
30     has test_output => ( is => 'rw' );
31 }
32
33 {
34     package My::Role5;
35     use Moose::Role;
36     sub test_output { }
37 }
38
39 {
40     package My::Base1;
41     use Moose;
42     has test_output => ( is => 'rw' );
43 }
44
45 {
46     package My::Base2;
47     use Moose;
48     sub test_output { }
49 }
50
51 # Roles providing attributes/methods should satisfy requires() of other
52 # roles they consume.
53 {
54     local $TODO = "role attributes don't satisfy method requirements";
55     lives_ok { package My::Test1; use Moose; with 'My::Role2'; }
56     'role2(provides attribute) consumes role1';
57 }
58
59 lives_ok { package My::Test2; use Moose; with 'My::Role3'; }
60 'role3(provides method) consumes role1';
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
65 {
66     local $TODO = "role attributes don't satisfy method requirements";
67     lives_ok { package My::Test3; use Moose; with 'My::Role4', 'My::Role1'; }
68     'class consumes role4(provides attribute), role1';
69 }
70
71 {
72     local $TODO = "role attributes don't satisfy method requirements";
73     lives_ok { package My::Test4; use Moose; with 'My::Role1', 'My::Role4'; }
74     'class consumes role1, role4(provides attribute)';
75 }
76
77 lives_ok { package My::Test5; use Moose; with 'My::Role5', 'My::Role1'; }
78 'class consumes role5(provides method), role1';
79
80 lives_ok { package My::Test6; use Moose; with 'My::Role1', 'My::Role5'; }
81 'class consumes role1, role5(provides method)';
82
83 # Inherited methods/attributes should satisfy requires(), as long as
84 # extends() comes first in code order.
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';
92
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';
100
101 # Attributes/methods implemented in class should satisfy requires()
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 {
112
113     package My::Test10;
114     use Moose;
115     sub test_output { }
116     with 'My::Role1';
117 }
118 'class provides method, consumes role1';
119
120 # Roles composed in separate with() statements SHOULD demonstrate ordering
121 # dependency. See comment with tests 3-6 above.
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';
129
130 dies_ok { package My::Test12; use Moose; with 'My::Role1'; with 'My::Role4'; }
131 'class consumes role1; consumes role4(provides attribute)';
132
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';
140
141 dies_ok { package My::Test14; use Moose; with 'My::Role1'; with 'My::Role5'; }
142 'class consumes role1; consumes role5(provides method)';
143
144 done_testing;