Add failing test for mutually dependent roles
[gitmo/Role-Tiny.git] / t / role-basic-composition.t
CommitLineData
60dfe768 1#!/usr/bin/env perl
2
3use lib 'lib', 't/role-basic/lib';
4use MyTests;
2c580674 5require Role::Tiny;
60dfe768 6
7{
8
9 package My::Does::Basic1;
2c580674 10 use Role::Tiny;
60dfe768 11 requires 'turbo_charger';
12
13 sub method {
14 return __PACKAGE__ . " method";
15 }
16}
17{
18
19 package My::Does::Basic2;
2c580674 20 use Role::Tiny;
60dfe768 21 requires 'turbo_charger';
22
23 sub method2 {
24 return __PACKAGE__ . " method2";
25 }
26}
27
28eval <<'END_PACKAGE';
29package My::Class1;
2c580674 30use Role::Tiny 'with';
60dfe768 31with qw(
32 My::Does::Basic1
33 My::Does::Basic2
34);
35sub turbo_charger {}
36END_PACKAGE
37ok !$@, 'We should be able to use two roles with the same requirements'
38 or die $@;
39
40{
41
42 package My::Does::Basic3;
2c580674 43 use Role::Tiny;
60dfe768 44 with 'My::Does::Basic2';
45
46 sub method3 {
47 return __PACKAGE__ . " method3";
48 }
49}
50
51eval <<'END_PACKAGE';
52package My::Class2;
2c580674 53use Role::Tiny 'with';
60dfe768 54with qw(
55 My::Does::Basic3
56);
57sub new { bless {} => shift }
58sub turbo_charger {}
59END_PACKAGE
60ok !$@, 'We should be able to use roles which consume roles'
61 or die $@;
62can_ok 'My::Class2', 'method2';
63is My::Class2->method2, 'My::Does::Basic2 method2',
64 '... and it should be the correct method';
65can_ok 'My::Class2', 'method3';
66is My::Class2->method3, 'My::Does::Basic3 method3',
67 '... and it should be the correct method';
68
69ok My::Class2->Role::Tiny::does_role('My::Does::Basic3'), 'A class DOES roles which it consumes';
70ok My::Class2->Role::Tiny::does_role('My::Does::Basic2'),
71 '... and should do roles which its roles consumes';
72ok !My::Class2->Role::Tiny::does_role('My::Does::Basic1'),
73 '... but not roles which it never consumed';
74
75my $object = My::Class2->new;
76ok $object->Role::Tiny::does_role('My::Does::Basic3'), 'An instance DOES roles which its class consumes';
77ok $object->Role::Tiny::does_role('My::Does::Basic2'),
78 '... and should do roles which its roles consumes';
79ok !$object->Role::Tiny::does_role('My::Does::Basic1'),
80 '... but not roles which it never consumed';
81
82{
83 {
84 package Role::Which::Imports;
2c580674 85 use Role::Tiny allow => 'TestMethods';
60dfe768 86 use TestMethods qw(this that);
87 }
88 {
89 package Class::With::ImportingRole;
2c580674 90 use Role::Tiny 'with';
60dfe768 91 with 'Role::Which::Imports';
92 sub new { bless {} => shift }
93 }
94 my $o = Class::With::ImportingRole->new;
95
96 foreach my $method (qw/this that/) {
97 can_ok $o, $method;
98 ok $o->$method($method), '... and calling "allow"ed methods should succeed';
99 is $o->$method, $method, '... and it should function correctly';
100 }
101}
102
103{
104 {
105 package Role::WithImportsOnceRemoved;
2c580674 106 use Role::Tiny;
60dfe768 107 with 'Role::Which::Imports';
108 }
109 {
110 package Class::With::ImportingRole2;
2c580674 111 use Role::Tiny 'with';
60dfe768 112$ENV{DEBUG} = 1;
113 with 'Role::WithImportsOnceRemoved';
114 sub new { bless {} => shift }
115 }
116 ok my $o = Class::With::ImportingRole2->new,
117 'We should be able to use roles which compose roles which import';
118
119 foreach my $method (qw/this that/) {
120 can_ok $o, $method;
121 ok $o->$method($method), '... and calling "allow"ed methods should succeed';
122 is $o->$method, $method, '... and it should function correctly';
123 }
124}
125
b0efdecc 126{
127 {
128 package Role1;
129 use Role::Tiny;
130 sub method1 { }
131 requires 'method2';
132 }
133
134 {
135 package Role2;
136 use Role::Tiny;
137 sub method2 { }
138 requires 'method1';
139 }
140 my $success = eval <<'END';
141 package Class;
142 use Role::Tiny::With;
143 with 'Role1', 'Role2';
144 1;
145END
146 is $success, 1, 'composed mutually dependent roles successfully' or diag "Error: $@";
147}
148
60dfe768 149done_testing;