foo
[gitmo/Class-MOP.git] / t / 010_self_introspection.t
CommitLineData
a5eca695 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
7f436b8c 6use Test::More tests => 169;
a5eca695 7use Test::Exception;
8
9BEGIN {
727919c5 10 use_ok('Class::MOP');
a5eca695 11 use_ok('Class::MOP::Class');
6d5355c3 12 use_ok('Class::MOP::Package');
13 use_ok('Class::MOP::Module');
a5eca695 14}
15
013b1897 16{
17 my $class = Class::MOP::Class->initialize('Foo');
18 is($class->meta, Class::MOP::Class->meta, '... instance and class both lead to the same meta');
19}
20
6d5355c3 21my $class_mop_class_meta = Class::MOP::Class->meta();
22isa_ok($class_mop_class_meta, 'Class::MOP::Class');
a5eca695 23
6d5355c3 24my $class_mop_package_meta = Class::MOP::Package->meta();
25isa_ok($class_mop_package_meta, 'Class::MOP::Package');
26
27my $class_mop_module_meta = Class::MOP::Module->meta();
28isa_ok($class_mop_module_meta, 'Class::MOP::Module');
29
30my @class_mop_package_methods = qw(
31 meta
32
33 initialize
34
35 name
36
37 add_package_variable get_package_variable has_package_variable remove_package_variable
38);
39
40my @class_mop_module_methods = qw(
7f436b8c 41 meta
42
43 version
6d5355c3 44);
45
46my @class_mop_class_methods = qw(
2eb717d5 47 meta
48
587aca23 49 get_all_metaclasses get_all_metaclass_names get_all_metaclass_instances
50
66b3dded 51 initialize reinitialize create create_anon_class
552e3d24 52
2d711cc8 53 instance_metaclass get_meta_instance
7b31baf4 54 new_object clone_object
55 construct_instance construct_class_instance clone_instance
550d56db 56 check_metaclass_compatability
7b31baf4 57
7b31baf4 58 attribute_metaclass method_metaclass
59
a5eca695 60 superclasses class_precedence_list
552e3d24 61
aa448b16 62 has_method get_method add_method remove_method alias_method
96ceced8 63 get_method_list compute_all_applicable_methods
64 find_all_methods_by_name find_next_method_by_name
552e3d24 65
a4258ffd 66 add_before_method_modifier add_after_method_modifier add_around_method_modifier
ee5e71d4 67
552e3d24 68 has_attribute get_attribute add_attribute remove_attribute
058c1cf5 69 get_attribute_list get_attribute_map compute_all_applicable_attributes find_attribute_by_name
7b31baf4 70
857f87a7 71 is_mutable is_immutable make_immutable
72
77e5fce4 73 DESTROY
7f436b8c 74);
7b31baf4 75
6d5355c3 76# check the class ...
77
78is_deeply([ sort @class_mop_class_methods ], [ sort $class_mop_class_meta->get_method_list ], '... got the correct method list for class');
7b31baf4 79
6d5355c3 80foreach my $method_name (@class_mop_class_methods) {
81 ok($class_mop_class_meta->has_method($method_name), '... Class::MOP::Class->has_method(' . $method_name . ')');
a5eca695 82 {
83 no strict 'refs';
6d5355c3 84 is($class_mop_class_meta->get_method($method_name),
a5eca695 85 \&{'Class::MOP::Class::' . $method_name},
86 '... Class::MOP::Class->get_method(' . $method_name . ') == &Class::MOP::Class::' . $method_name);
87 }
88}
89
6d5355c3 90## check the package ....
91
92is_deeply([ sort @class_mop_package_methods ], [ sort $class_mop_package_meta->get_method_list ], '... got the correct method list for package');
93
94foreach my $method_name (@class_mop_package_methods) {
95 ok($class_mop_package_meta->has_method($method_name), '... Class::MOP::Package->has_method(' . $method_name . ')');
96 {
97 no strict 'refs';
98 is($class_mop_package_meta->get_method($method_name),
99 \&{'Class::MOP::Package::' . $method_name},
100 '... Class::MOP::Package->get_method(' . $method_name . ') == &Class::MOP::Package::' . $method_name);
101 }
102}
103
7f436b8c 104## check the module ....
105
106is_deeply([ sort @class_mop_module_methods ], [ sort $class_mop_module_meta->get_method_list ], '... got the correct method list for module');
107
108foreach my $method_name (@class_mop_module_methods) {
109 ok($class_mop_module_meta->has_method($method_name), '... Class::MOP::Module->has_method(' . $method_name . ')');
110 {
111 no strict 'refs';
112 is($class_mop_module_meta->get_method($method_name),
113 \&{'Class::MOP::Module::' . $method_name},
114 '... Class::MOP::Module->get_method(' . $method_name . ') == &Class::MOP::Module::' . $method_name);
115 }
116}
117
118
7b31baf4 119# check for imported functions which are not methods
120
2eb717d5 121foreach my $non_method_name (qw(
122 confess
123 blessed reftype
124 subname
125 svref_2object
126 )) {
6d5355c3 127 ok(!$class_mop_class_meta->has_method($non_method_name), '... NOT Class::MOP::Class->has_method(' . $non_method_name . ')');
2eb717d5 128}
129
7b31baf4 130# check for the right attributes
131
6d5355c3 132my @class_mop_package_attributes = (
2bab2be6 133 '$:package',
6d5355c3 134);
135
136my @class_mop_module_attributes = (
137);
138
139my @class_mop_class_attributes = (
2bab2be6 140 '%:attributes',
141 '$:attribute_metaclass',
142 '$:method_metaclass',
143 '$:instance_metaclass'
144);
7b31baf4 145
6d5355c3 146# check class
147
7b31baf4 148is_deeply(
6d5355c3 149 [ sort @class_mop_class_attributes ],
150 [ sort $class_mop_class_meta->get_attribute_list ],
7b31baf4 151 '... got the right list of attributes');
152
153is_deeply(
6d5355c3 154 [ sort @class_mop_class_attributes ],
155 [ sort keys %{$class_mop_class_meta->get_attribute_map} ],
7b31baf4 156 '... got the right list of attributes');
157
6d5355c3 158foreach my $attribute_name (@class_mop_class_attributes) {
159 ok($class_mop_class_meta->has_attribute($attribute_name), '... Class::MOP::Class->has_attribute(' . $attribute_name . ')');
160 isa_ok($class_mop_class_meta->get_attribute($attribute_name), 'Class::MOP::Attribute');
161}
162
7f436b8c 163# check module
6d5355c3 164
165is_deeply(
166 [ sort @class_mop_package_attributes ],
167 [ sort $class_mop_package_meta->get_attribute_list ],
168 '... got the right list of attributes');
169
170is_deeply(
171 [ sort @class_mop_package_attributes ],
172 [ sort keys %{$class_mop_package_meta->get_attribute_map} ],
173 '... got the right list of attributes');
174
175foreach my $attribute_name (@class_mop_package_attributes) {
176 ok($class_mop_package_meta->has_attribute($attribute_name), '... Class::MOP::Package->has_attribute(' . $attribute_name . ')');
177 isa_ok($class_mop_package_meta->get_attribute($attribute_name), 'Class::MOP::Attribute');
727919c5 178}
179
7f436b8c 180# check package
181
182is_deeply(
183 [ sort @class_mop_module_attributes ],
184 [ sort $class_mop_module_meta->get_attribute_list ],
185 '... got the right list of attributes');
186
187is_deeply(
188 [ sort @class_mop_module_attributes ],
189 [ sort keys %{$class_mop_module_meta->get_attribute_map} ],
190 '... got the right list of attributes');
191
192foreach my $attribute_name (@class_mop_module_attributes) {
193 ok($class_mop_module_meta->has_attribute($attribute_name), '... Class::MOP::Module->has_attribute(' . $attribute_name . ')');
194 isa_ok($class_mop_module_meta->get_attribute($attribute_name), 'Class::MOP::Attribute');
195}
196
7b31baf4 197## check the attributes themselves
198
6d5355c3 199# ... package
200
201ok($class_mop_package_meta->get_attribute('$:package')->has_reader, '... Class::MOP::Class $:package has a reader');
202is(ref($class_mop_package_meta->get_attribute('$:package')->reader), 'HASH', '... Class::MOP::Class $:package\'s a reader is { name => sub { ... } }');
203
204ok($class_mop_package_meta->get_attribute('$:package')->has_init_arg, '... Class::MOP::Class $:package has a init_arg');
205is($class_mop_package_meta->get_attribute('$:package')->init_arg, ':package', '... Class::MOP::Class $:package\'s a init_arg is :package');
7b31baf4 206
6d5355c3 207# ... class
7b31baf4 208
6d5355c3 209ok($class_mop_class_meta->get_attribute('%:attributes')->has_reader, '... Class::MOP::Class %:attributes has a reader');
210is(ref($class_mop_class_meta->get_attribute('%:attributes')->reader),
f7259199 211 'HASH',
7b31baf4 212 '... Class::MOP::Class %:attributes\'s a reader is &get_attribute_map');
213
6d5355c3 214ok($class_mop_class_meta->get_attribute('%:attributes')->has_init_arg, '... Class::MOP::Class %:attributes has a init_arg');
215is($class_mop_class_meta->get_attribute('%:attributes')->init_arg,
7b31baf4 216 ':attributes',
217 '... Class::MOP::Class %:attributes\'s a init_arg is :attributes');
218
6d5355c3 219ok($class_mop_class_meta->get_attribute('%:attributes')->has_default, '... Class::MOP::Class %:attributes has a default');
220is_deeply($class_mop_class_meta->get_attribute('%:attributes')->default,
7b31baf4 221 {},
222 '... Class::MOP::Class %:attributes\'s a default of {}');
223
6d5355c3 224ok($class_mop_class_meta->get_attribute('$:attribute_metaclass')->has_reader, '... Class::MOP::Class $:attribute_metaclass has a reader');
225is($class_mop_class_meta->get_attribute('$:attribute_metaclass')->reader,
7b31baf4 226 'attribute_metaclass',
227 '... Class::MOP::Class $:attribute_metaclass\'s a reader is &attribute_metaclass');
228
6d5355c3 229ok($class_mop_class_meta->get_attribute('$:attribute_metaclass')->has_init_arg, '... Class::MOP::Class $:attribute_metaclass has a init_arg');
230is($class_mop_class_meta->get_attribute('$:attribute_metaclass')->init_arg,
7b31baf4 231 ':attribute_metaclass',
232 '... Class::MOP::Class $:attribute_metaclass\'s a init_arg is :attribute_metaclass');
233
6d5355c3 234ok($class_mop_class_meta->get_attribute('$:attribute_metaclass')->has_default, '... Class::MOP::Class $:attribute_metaclass has a default');
235is($class_mop_class_meta->get_attribute('$:attribute_metaclass')->default,
7b31baf4 236 'Class::MOP::Attribute',
237 '... Class::MOP::Class $:attribute_metaclass\'s a default is Class::MOP:::Attribute');
238
6d5355c3 239ok($class_mop_class_meta->get_attribute('$:method_metaclass')->has_reader, '... Class::MOP::Class $:method_metaclass has a reader');
240is($class_mop_class_meta->get_attribute('$:method_metaclass')->reader,
7b31baf4 241 'method_metaclass',
242 '... Class::MOP::Class $:method_metaclass\'s a reader is &method_metaclass');
243
6d5355c3 244ok($class_mop_class_meta->get_attribute('$:method_metaclass')->has_init_arg, '... Class::MOP::Class $:method_metaclass has a init_arg');
245is($class_mop_class_meta->get_attribute('$:method_metaclass')->init_arg,
7b31baf4 246 ':method_metaclass',
247 '... Class::MOP::Class $:method_metaclass\'s init_arg is :method_metaclass');
248
6d5355c3 249ok($class_mop_class_meta->get_attribute('$:method_metaclass')->has_default, '... Class::MOP::Class $:method_metaclass has a default');
250is($class_mop_class_meta->get_attribute('$:method_metaclass')->default,
7b31baf4 251 'Class::MOP::Method',
252 '... Class::MOP::Class $:method_metaclass\'s a default is Class::MOP:::Method');
253
254# check the values of some of the methods
255
6d5355c3 256is($class_mop_class_meta->name, 'Class::MOP::Class', '... Class::MOP::Class->name');
257is($class_mop_class_meta->version, $Class::MOP::Class::VERSION, '... Class::MOP::Class->version');
a5eca695 258
6d5355c3 259ok($class_mop_class_meta->has_package_variable('$VERSION'), '... Class::MOP::Class->has_package_variable($VERSION)');
260is(${$class_mop_class_meta->get_package_variable('$VERSION')},
7b31baf4 261 $Class::MOP::Class::VERSION,
262 '... Class::MOP::Class->get_package_variable($VERSION)');
263
a5eca695 264is_deeply(
6d5355c3 265 [ $class_mop_class_meta->superclasses ],
2243a22b 266 [ qw/Class::MOP::Module/ ],
267 '... Class::MOP::Class->superclasses == [ Class::MOP::Module ]');
a5eca695 268
269is_deeply(
6d5355c3 270 [ $class_mop_class_meta->class_precedence_list ],
2243a22b 271 [ qw/
272 Class::MOP::Class
273 Class::MOP::Module
274 Class::MOP::Package
275 / ],
276 '... Class::MOP::Class->class_precedence_list == [ Class::MOP::Class Class::MOP::Module Class::MOP::Package ]');
a5eca695 277
6d5355c3 278is($class_mop_class_meta->attribute_metaclass, 'Class::MOP::Attribute', '... got the right value for attribute_metaclass');
279is($class_mop_class_meta->method_metaclass, 'Class::MOP::Method', '... got the right value for method_metaclass');
280is($class_mop_class_meta->instance_metaclass, 'Class::MOP::Instance', '... got the right value for instance_metaclass');
7b31baf4 281