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