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