Commit | Line | Data |
0a72c036 |
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 | |