Revert most of the conversion to Test::Fatal so we can redo it
[gitmo/Moose.git] / t / 030_roles / 045_role_compose_requires.t
CommitLineData
f5298daf 1# See https://rt.cpan.org/Ticket/Display.html?id=46347
2
0a72c036 3use strict;
e3d22b28 4use warnings;
5
f5298daf 6use Test::More;
53a4d826 7use 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 61lives_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 79lives_ok { package My::Test5; use Moose; with 'My::Role5', 'My::Role1'; }
f5298daf 80'class consumes role5(provides method), role1';
0a72c036 81
53a4d826 82lives_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 87lives_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 95lives_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 104lives_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 113lives_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 124lives_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 132dies_ok { package My::Test12; use Moose; with 'My::Role1'; with 'My::Role4'; }
f5298daf 133'class consumes role1; consumes role4(provides attribute)';
0a72c036 134
53a4d826 135lives_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 143dies_ok { package My::Test14; use Moose; with 'My::Role1'; with 'My::Role5'; }
f5298daf 144'class consumes role1; consumes role5(provides method)';
0a72c036 145
f5298daf 146done_testing;