Commit | Line | Data |
4c15a12d |
1 | #!/usr/bin/perl |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
6 | use Test::More skip_all => "provisional test"; |
7 | use Test::Exception; |
8 | |
9 | BEGIN { |
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 | |