Tweak latter instances of the test to remove the metaclass instances for the classes...
[gitmo/Moose.git] / t / 060_compat / 004_extends_nonmoose_that_isa_moose_with_metarole.t
1 use strict;
2 use warnings;
3 use Test::More tests => 18;
4 use Class::MOP ();
5
6 {
7     package My::Role;
8     use Moose::Role;
9 }
10
11 {
12     package SomeClass;
13     use Moose -traits => 'My::Role';
14 }
15
16 {
17     package SubClassUseBase;
18     use base qw/SomeClass/;
19 }
20
21 {
22     package SubSubClassUseBase;
23     use Moose;
24     use Test::More;
25     use Test::Exception;
26     lives_ok {
27         extends 'SubClassUseBase';
28     }
29     'Can extend non-Moose class with parent class that is a Moose class with a meta role';
30 }
31
32 {
33     ok( SubSubClassUseBase->meta->meta->can('does_role')
34         && SubSubClassUseBase->meta->meta->does_role('My::Role'),
35         'SubSubClassUseBase meta metaclass does the My::Role role' );
36 }
37
38 # Note, remote metaclasses of the 'use base' classes after each test, so that
39 # they have to be re-initialized - otherwise latter tests would not demonstrate
40 # the original issue.
41 Class::MOP::remove_metaclass_by_name('SubClassUseBase');
42
43 {
44     package OtherClass;
45     use Moose;
46 }
47
48 {
49     package OtherSubClassUseBase;
50     use base 'OtherClass';
51 }
52
53 {
54     package MultiParent1;
55     use Moose;
56     use Test::More;
57     use Test::Exception;
58     lives_ok {
59         extends qw( SubClassUseBase OtherSubClassUseBase );
60     }
61     'Can extend two non-Moose classes with parents that are different Moose metaclasses';
62 }
63
64 {
65     ok( MultiParent1->meta->meta->can('does_role')
66         && MultiParent1->meta->meta->does_role('My::Role'),
67         'MultiParent1 meta metaclass does the My::Role role' );
68 }
69
70 Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/);
71
72 {
73     package MultiParent2;
74     use Moose;
75     use Test::More;
76     use Test::Exception;
77     lives_ok {
78         extends qw( OtherSubClassUseBase SubClassUseBase );
79     }
80     'Can extend two non-Moose classes with parents that are different Moose metaclasses (reverse order)';
81 }
82
83 {
84     ok( MultiParent2->meta->meta->can('does_role')
85         && MultiParent2->meta->meta->does_role('My::Role'),
86         'MultiParent2 meta metaclass does the My::Role role' );
87 }
88
89 Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/);
90
91 {
92     package MultiParent3;
93     use Moose;
94     use Test::More;
95     use Test::Exception;
96     lives_ok {
97         extends qw( OtherClass SubClassUseBase );
98     }
99     'Can extend one Moose class and one non-Moose class';
100 }
101
102 {
103     ok( MultiParent3->meta->meta->can('does_role')
104         && MultiParent3->meta->meta->does_role('My::Role'),
105         'MultiParent3 meta metaclass does the My::Role role' );
106 }
107
108 Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/);
109
110 {
111     package MultiParent4;
112     use Moose;
113     use Test::More;
114     use Test::Exception;
115     lives_ok {
116         extends qw( SubClassUseBase OtherClass );
117     }
118     'Can extend one non-Moose class and one Moose class';
119 }
120
121 {
122     ok( MultiParent4->meta->meta->can('does_role')
123         && MultiParent4->meta->meta->does_role('My::Role'),
124         'MultiParent4 meta metaclass does the My::Role role' );
125 }
126
127 Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/);
128
129 {
130     package MultiChild1;
131     use Moose;
132     use Test::More;
133     use Test::Exception;
134     lives_ok {
135         extends 'MultiParent1';
136     }
137     'Can extend class that itself extends two non-Moose classes with Moose parents';
138 }
139
140 {
141     ok( MultiChild1->meta->meta->can('does_role')
142         && MultiChild1->meta->meta->does_role('My::Role'),
143         'MultiChild1 meta metaclass does the My::Role role' );
144 }
145
146 Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/);
147
148 {
149     package MultiChild2;
150     use Moose;
151     use Test::More;
152     use Test::Exception;
153     lives_ok {
154         extends 'MultiParent2';
155     }
156     'Can extend class that itself extends two non-Moose classes with Moose parents (reverse order)';
157 }
158
159 {
160     ok( MultiChild2->meta->meta->can('does_role')
161         && MultiChild2->meta->meta->does_role('My::Role'),
162         'MultiChild2 meta metaclass does the My::Role role' );
163 }
164
165 Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/);
166
167 {
168     package MultiChild3;
169     use Moose;
170     use Test::More;
171     use Test::Exception;
172     lives_ok {
173         extends 'MultiParent3';
174     }
175     'Can extend class that itself extends one Moose and one non-Moose parent';
176 }
177
178 {
179     ok( MultiChild3->meta->meta->can('does_role')
180         && MultiChild3->meta->meta->does_role('My::Role'),
181         'MultiChild3 meta metaclass does the My::Role role' );
182 }
183
184 Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/);
185
186 {
187     package MultiChild4;
188     use Moose;
189     use Test::More;
190     use Test::Exception;
191     lives_ok {
192         extends 'MultiParent4';
193     }
194     'Can extend class that itself extends one non-Moose and one Moose parent';
195 }
196
197 {
198     ok( MultiChild4->meta->meta->can('does_role')
199         && MultiChild4->meta->meta->does_role('My::Role'),
200         'MultiChild4 meta metaclass does the My::Role role' );
201 }
202
203 Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/);
204