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