test array delegation edge cases
[gitmo/Moose.git] / t / 030_roles / 045_role_compose_requires.t
1 #!/usr/bin/perl
2 # https://rt.cpan.org/Ticket/Display.html?id=46347
3 use strict;
4 use Test::More tests =>14;
5 use Test::Exception;
6
7 { package My::Role1;
8   use Moose::Role;
9   requires 'test_output';
10 }
11 { package My::Role2;
12   use Moose::Role;
13   has test_output => (is => 'rw');
14   with 'My::Role1';
15 }
16 { package My::Role3;
17   use Moose::Role;
18   sub test_output {}
19   with 'My::Role1';
20 }
21 { package My::Role4;
22   use Moose::Role;
23   has test_output => (is => 'rw');
24 }
25 { package My::Role5;
26   use Moose::Role;
27   sub test_output {}
28 }
29 { package My::Base1;
30   use Moose;
31   has test_output => (is => 'rw');
32 }
33 { package My::Base2;
34   use Moose;
35   sub test_output {}
36 }
37
38 # Roles providing attributes/methods should satisfy requires() of other
39 # roles they consume.
40 { local $TODO = "role attributes don't satisfy method requirements";
41     lives_ok { package My::Test1; use Moose; with 'My::Role2'; } 
42     'role2(provides attribute) consumes role1';
43 }
44
45 lives_ok { package My::Test2; use Moose; with 'My::Role3'; }
46     'role3(provides method) consumes role1';
47
48 # As I understand the design, Roles composed in the same with() statement
49 # should NOT demonstrate ordering dependency. Alter these tests if that
50 # assumption is false. -Vince Veselosky
51 { local $TODO = "role attributes don't satisfy method requirements";
52     lives_ok { package My::Test3; use Moose; with 'My::Role4','My::Role1'; }
53     'class consumes role4(provides attribute), role1';
54 }
55
56 { local $TODO = "role attributes don't satisfy method requirements";
57     lives_ok { package My::Test4; use Moose; with 'My::Role1','My::Role4'; }
58     'class consumes role1, role4(provides attribute)';
59 }
60
61 lives_ok { package My::Test5; use Moose; with 'My::Role5','My::Role1'; }
62     'class consumes role5(provides method), role1';
63
64 lives_ok { package My::Test6; use Moose; with 'My::Role1','My::Role5'; }
65     'class consumes role1, role5(provides method)';
66
67 # Inherited methods/attributes should satisfy requires(), as long as 
68 # extends() comes first in code order.
69 lives_ok {package My::Test7; use Moose; extends 'My::Base1'; with 'My::Role1';}
70     'class extends base1(provides attribute), consumes role1';
71
72 lives_ok {package My::Test8; use Moose; extends 'My::Base2'; with 'My::Role1';}
73     'class extends base2(provides method), consumes role1';
74
75 # Attributes/methods implemented in class should satisfy requires()
76 lives_ok {package My::Test9; use Moose; has 'test_output',is=>'rw'; with 'My::Role1';}
77     'class provides attribute, consumes role1';
78
79 lives_ok {package My::Test10; use Moose; sub test_output{} with 'My::Role1'; }
80     'class provides method, consumes role1';
81
82 # Roles composed in separate with() statements SHOULD demonstrate ordering 
83 # dependency. See comment with tests 3-6 above.
84 lives_ok { package My::Test11; use Moose; with 'My::Role4'; with 'My::Role1';}
85     'class consumes role4(provides attribute); consumes role1';
86
87 dies_ok { package My::Test12; use Moose; with 'My::Role1'; with 'My::Role4';}
88     'class consumes role1; consumes role4(provides attribute)';
89
90 lives_ok { package My::Test13; use Moose; with 'My::Role5'; with 'My::Role1';}
91     'class consumes role5(provides method); consumes role1';
92
93 dies_ok { package My::Test14; use Moose; with 'My::Role1'; with 'My::Role5'; }
94     'class consumes role1; consumes role5(provides method)';
95
96