Commit | Line | Data |
38bf2a25 |
1 | use strict; |
2 | use warnings; |
3 | |
986a8b22 |
4 | # for instance, App::ForkProve |
5 | my $preloaded; |
6 | BEGIN { $preloaded = exists $INC{'Class/MOP.pm'} } |
7 | |
38bf2a25 |
8 | use Test::More; |
9 | |
b5ae7c00 |
10 | use Class::Load qw(is_class_loaded); |
11 | |
38bf2a25 |
12 | BEGIN { |
13 | use_ok('Class::MOP'); |
14 | use_ok('Class::MOP::Mixin'); |
15 | use_ok('Class::MOP::Mixin::AttributeCore'); |
16 | use_ok('Class::MOP::Mixin::HasAttributes'); |
17 | use_ok('Class::MOP::Mixin::HasMethods'); |
18 | use_ok('Class::MOP::Package'); |
19 | use_ok('Class::MOP::Module'); |
20 | use_ok('Class::MOP::Class'); |
21 | use_ok('Class::MOP::Class::Immutable::Trait'); |
22 | use_ok('Class::MOP::Method'); |
23 | use_ok('Class::MOP::Method'); |
24 | use_ok('Class::MOP::Method::Wrapped'); |
25 | use_ok('Class::MOP::Method::Inlined'); |
26 | use_ok('Class::MOP::Method::Generated'); |
27 | use_ok('Class::MOP::Method::Accessor'); |
28 | use_ok('Class::MOP::Method::Constructor'); |
29 | use_ok('Class::MOP::Method::Meta'); |
2683d371 |
30 | use_ok('Class::MOP::Method::Overload'); |
38bf2a25 |
31 | use_ok('Class::MOP::Instance'); |
32 | use_ok('Class::MOP::Object'); |
33 | } |
34 | |
35 | # make sure we are tracking metaclasses correctly |
36 | |
37 | my %METAS = ( |
38 | 'Class::MOP::Attribute' => Class::MOP::Attribute->meta, |
39 | 'Class::MOP::Method::Inlined' => Class::MOP::Method::Inlined->meta, |
40 | 'Class::MOP::Method::Generated' => Class::MOP::Method::Generated->meta, |
41 | 'Class::MOP::Method::Accessor' => Class::MOP::Method::Accessor->meta, |
42 | 'Class::MOP::Method::Constructor' => Class::MOP::Method::Constructor->meta, |
43 | 'Class::MOP::Method::Meta' => Class::MOP::Method::Meta->meta, |
2683d371 |
44 | 'Class::MOP::Method::Overload' => Class::MOP::Method::Overload->meta, |
38bf2a25 |
45 | 'Class::MOP::Mixin' => Class::MOP::Mixin->meta, |
46 | 'Class::MOP::Mixin::AttributeCore' => Class::MOP::Mixin::AttributeCore->meta, |
47 | 'Class::MOP::Mixin::HasAttributes' => Class::MOP::Mixin::HasAttributes->meta, |
48 | 'Class::MOP::Mixin::HasMethods' => Class::MOP::Mixin::HasMethods->meta, |
49 | 'Class::MOP::Package' => Class::MOP::Package->meta, |
50 | 'Class::MOP::Module' => Class::MOP::Module->meta, |
51 | 'Class::MOP::Class' => Class::MOP::Class->meta, |
52 | 'Class::MOP::Method' => Class::MOP::Method->meta, |
53 | 'Class::MOP::Method::Wrapped' => Class::MOP::Method::Wrapped->meta, |
54 | 'Class::MOP::Instance' => Class::MOP::Instance->meta, |
55 | 'Class::MOP::Object' => Class::MOP::Object->meta, |
56 | 'Class::MOP::Class::Immutable::Trait' => Class::MOP::class_of('Class::MOP::Class::Immutable::Trait'), |
57 | 'Class::MOP::Class::Immutable::Class::MOP::Class' => Class::MOP::Class::Immutable::Class::MOP::Class->meta, |
35be939f |
58 | 'UNIVERSAL' => Class::MOP::class_of('UNIVERSAL'), |
38bf2a25 |
59 | ); |
60 | |
b5ae7c00 |
61 | ok( is_class_loaded($_), '... ' . $_ . ' is loaded' ) |
38bf2a25 |
62 | for keys %METAS; |
63 | |
35be939f |
64 | # The trait shouldn't be made immutable, it doesn't actually do anything, and |
65 | # it doesn't even matter because it's not a class that will be |
66 | # instantiated. Making UNIVERSAL immutable just seems like a bad idea. |
67 | my %expect_mutable = map { $_ => 1 } qw( Class::MOP::Class::Immutable::Trait UNIVERSAL ); |
68 | |
38bf2a25 |
69 | for my $meta (values %METAS) { |
35be939f |
70 | if ( $expect_mutable{$meta->name} ) { |
38bf2a25 |
71 | ok( $meta->is_mutable(), '... ' . $meta->name . ' is mutable' ); |
72 | } |
73 | else { |
74 | ok( $meta->is_immutable(), '... ' . $meta->name . ' is immutable' ); |
75 | } |
76 | } |
77 | |
986a8b22 |
78 | SKIP: { |
79 | skip "this list may be incorrect if we preloaded things", 3 if $preloaded; |
80 | is_deeply( |
81 | {Class::MOP::get_all_metaclasses}, |
82 | \%METAS, |
83 | '... got all the metaclasses' |
84 | ); |
85 | |
86 | is_deeply( |
87 | [ |
88 | sort { $a->name cmp $b->name } |
89 | Class::MOP::get_all_metaclass_instances |
90 | ], |
91 | [ |
92 | Class::MOP::Attribute->meta, |
93 | Class::MOP::Class->meta, |
94 | Class::MOP::Class::Immutable::Class::MOP::Class->meta, |
95 | Class::MOP::class_of('Class::MOP::Class::Immutable::Trait'), |
96 | Class::MOP::Instance->meta, |
97 | Class::MOP::Method->meta, |
98 | Class::MOP::Method::Accessor->meta, |
99 | Class::MOP::Method::Constructor->meta, |
100 | Class::MOP::Method::Generated->meta, |
101 | Class::MOP::Method::Inlined->meta, |
102 | Class::MOP::Method::Meta->meta, |
103 | Class::MOP::Method::Overload->meta, |
104 | Class::MOP::Method::Wrapped->meta, |
105 | Class::MOP::Mixin->meta, |
106 | Class::MOP::Mixin::AttributeCore->meta, |
107 | Class::MOP::Mixin::HasAttributes->meta, |
108 | Class::MOP::Mixin::HasMethods->meta, |
109 | Class::MOP::Module->meta, |
110 | Class::MOP::Object->meta, |
111 | Class::MOP::Package->meta, |
112 | Class::MOP::class_of('UNIVERSAL'), |
113 | ], |
114 | '... got all the metaclass instances' |
115 | ); |
116 | |
117 | is_deeply( |
118 | [ sort { $a cmp $b } Class::MOP::get_all_metaclass_names() ], |
119 | [ |
120 | sort qw/ |
121 | Class::MOP::Attribute |
122 | Class::MOP::Class |
123 | Class::MOP::Class::Immutable::Class::MOP::Class |
124 | Class::MOP::Class::Immutable::Trait |
125 | Class::MOP::Mixin |
126 | Class::MOP::Mixin::AttributeCore |
127 | Class::MOP::Mixin::HasAttributes |
128 | Class::MOP::Mixin::HasMethods |
129 | Class::MOP::Instance |
130 | Class::MOP::Method |
131 | Class::MOP::Method::Accessor |
132 | Class::MOP::Method::Constructor |
133 | Class::MOP::Method::Generated |
134 | Class::MOP::Method::Inlined |
135 | Class::MOP::Method::Wrapped |
136 | Class::MOP::Method::Meta |
137 | Class::MOP::Method::Overload |
138 | Class::MOP::Module |
139 | Class::MOP::Object |
140 | Class::MOP::Package |
141 | UNIVERSAL |
142 | /, |
143 | ], |
144 | '... got all the metaclass names' |
145 | ); |
146 | } |
38bf2a25 |
147 | |
148 | # testing the meta-circularity of the system |
149 | |
150 | is( |
151 | Class::MOP::Class->meta->meta, Class::MOP::Class->meta->meta->meta, |
152 | '... Class::MOP::Class->meta->meta == Class::MOP::Class->meta->meta->meta' |
153 | ); |
154 | |
155 | is( |
156 | Class::MOP::Class->meta->meta->meta, Class::MOP::Class->meta->meta->meta->meta, |
157 | '... Class::MOP::Class->meta->meta->meta == Class::MOP::Class->meta->meta->meta->meta' |
158 | ); |
159 | |
160 | is( |
161 | Class::MOP::Class->meta->meta, Class::MOP::Class->meta->meta->meta->meta, |
162 | '... Class::MOP::Class->meta->meta == Class::MOP::Class->meta->meta->meta->meta' |
163 | ); |
164 | |
165 | is( |
166 | Class::MOP::Class->meta->meta, Class::MOP::Class->meta->meta->meta->meta->meta, |
167 | '... Class::MOP::Class->meta->meta == Class::MOP::Class->meta->meta->meta->meta->meta' |
168 | ); |
169 | |
170 | isa_ok(Class::MOP::Class->meta, 'Class::MOP::Class'); |
171 | |
172 | done_testing; |