minor doc fix
[gitmo/Moose.git] / t / 030_roles / 011_overriding.t
CommitLineData
4c15a12d 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More skip_all => "provisional test";
7use Test::Exception;
8
9BEGIN {
10 use_ok('Moose');
11}
12
13{
14 # no conflicts, this doesn't actually test the new behavior, it's just an example
15
16 lives_ok {
17 package Role::A;
18 use Moose::Role;
19
20 use constant;
21 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(bar) };
22 } "define role A";
23
24 lives_ok {
25 package Role::B;
26 use Moose::Role;
27
28 use constant;
29 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(xxy) };
30 } "define role B";
31
32 lives_ok {
33 package Role::C;
34 use Moose::Role;
35
36 with qw(Role::A Role::B); # conflict between 'foo's here
37
38 use constant;
39 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(foo zot) };
40 } "define role C";
41
42 lives_ok {
43 package Class::A;
44 use Moose;
45
46 with qw(Role::C);
47
48 use constant;
49 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(zot) };
50 } "define class A";
51
52 can_ok( Class::A->new, qw(foo bar xxy zot) );
53
54 is( eval { Class::A->new->foo }, "Role::C::foo", "foo" );
55 is( eval { Class::A->new->zot }, "Class::A::zot", "zot" );
56 is( eval { Class::A->new->bar }, "Role::A::bar", "bar" );
57 is( eval { Class::A->new->xxy }, "Role::B::xxy", "xxy" );
58
59}
60
61{
62 # conflict resolved by role, same result as prev
63
64 lives_ok {
65 package Role::D;
66 use Moose::Role;
67
68 use constant;
69 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(foo bar) };
70 } "define role Role::D";
71
72 lives_ok {
73 package Role::E;
74 use Moose::Role;
75
76 use constant;
77 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(foo xxy) };
78 } "define role Role::E";
79
80 lives_ok {
81 package Role::F;
82 use Moose::Role;
83
84 with qw(Role::D Role::E); # conflict between 'foo's here
85
86 use constant;
87 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(foo zot) };
88 } "define role Role::F";
89
90 lives_ok {
91 package Class::B;
92 use Moose;
93
94 with qw(Role::F);
95
96 use constant;
97 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(zot) };
98 } "define class Class::B";
99
100 can_ok( Class::B->new, qw(foo bar xxy zot) );
101
102 is( eval { Class::B->new->foo }, "Role::F::foo", "foo" );
103 is( eval { Class::B->new->zot }, "Class::B::zot", "zot" );
104 is( eval { Class::B->new->bar }, "Role::D::bar", "bar" );
105 is( eval { Class::B->new->xxy }, "Role::E::xxy", "xxy" );
106
107}
108
109{
110 # conflict propagation
111
112 lives_ok {
113 package Role::H;
114 use Moose::Role;
115
116 use constant;
117 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(foo bar) };
118 } "define role Role::H";
119
120 lives_ok {
121 package Role::J;
122 use Moose::Role;
123
124 use constant;
125 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(foo xxy) };
126 } "define role Role::J";
127
128 lives_ok {
129 package Role::I;
130 use Moose::Role;
131
132 with qw(Role::J Role::H); # conflict between 'foo's here
133
134 use constant;
135 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(zot) };
136 } "define role Role::I";
137
138 throws_ok {
139 package Class::C;
140 use Moose;
141
142 with qw(Role::I);
143
144 use constant;
145 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(zot) };
146 } qr/requires.*'foo'/, "defining class Class::C fails";
147
148 lives_ok {
149 package Class::D;
150 use Moose;
151
152 has foo => ( default => __PACKAGE__ . "::foo", is => "rw" );
153
154 use constant;
155 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(zot) };
156
157 with qw(Role::I);
158 } "resolved with attr";
159
160 lives_ok {
161 package Class::E;
162 use Moose;
163
164 with qw(Role::I);
165
166 use constant;
167 BEGIN { constant->import($_ => __PACKAGE__ . "::$_") for qw(foo zot) };
168 } "resolved with method";
169
170 can_ok( Class::D->new, qw(foo bar xxy zot) );
171
172 is( eval { Class::D->new->foo }, "Class::D::foo", "foo" );
173 is( eval { Class::D->new->zot }, "Class::D::zot", "zot" );
174 is( eval { Class::D->new->bar }, "Role::H::bar", "bar" );
175 is( eval { Class::D->new->xxy }, "Role::I::xxy", "xxy" );
176
177 can_ok( Class::E->new, qw(foo bar xxy zot) );
178
179 is( eval { Class::E->new->foo }, "Class::E::foo", "foo" );
180 is( eval { Class::E->new->zot }, "Class::E::zot", "zot" );
181 is( eval { Class::E->new->bar }, "Role::H::bar", "bar" );
182 is( eval { Class::E->new->xxy }, "Role::J::xxy", "xxy" );
183
184}
185