Add what does moose stand for section back to docs
[gitmo/Moose.git] / t / roles / 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;
b10dde3a 7use 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 60is( 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 75is( exception { package My::Test5; use Moose; with 'My::Role5', 'My::Role1'; }, undef, 'class consumes role5(provides method), role1' );
0a72c036 76
b10dde3a 77is( 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 81is( 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 88is( 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 96is( 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 104is( 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 114is( 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 121isnt( exception { package My::Test12; use Moose; with 'My::Role1'; with 'My::Role4'; }, undef, 'class consumes role1; consumes role4(provides attribute)' );
0a72c036 122
b10dde3a 123is( 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 130isnt( exception { package My::Test14; use Moose; with 'My::Role1'; with 'My::Role5'; }, undef, 'class consumes role1; consumes role5(provides method)' );
0a72c036 131
f5298daf 132done_testing;