Make sure method map is updated after a method is removed
[gitmo/Class-MOP.git] / t / 004_advanced_methods.t
CommitLineData
a5eca695 1use strict;
2use warnings;
3
efd3d14c 4use Test::More tests => 12;
a5eca695 5use Test::Exception;
6
efd3d14c 7use Class::MOP;
8use Class::MOP::Class;
a5eca695 9
10=pod
11
12The following class hierarhcy is very contrived
13and totally horrid (it won't work under C3 even),
14but it tests a number of aspect of this module.
15
16A more real-world example would be a nice addition :)
17
18=cut
19
20{
21 package Foo;
22
23 sub BUILD { 'Foo::BUILD' }
24 sub foo { 'Foo::foo' }
25
26 package Bar;
27 our @ISA = ('Foo');
28
29 sub BUILD { 'Bar::BUILD' }
30 sub bar { 'Bar::bar' }
31
32 package Baz;
33 our @ISA = ('Bar');
34
a5eca695 35 sub baz { 'Baz::baz' }
36 sub foo { 'Baz::foo' }
37
38 package Foo::Bar;
39 our @ISA = ('Foo', 'Bar');
40
41 sub BUILD { 'Foo::Bar::BUILD' }
42 sub foobar { 'Foo::Bar::foobar' }
43
44 package Foo::Bar::Baz;
45 our @ISA = ('Foo', 'Bar', 'Baz');
46
47 sub BUILD { 'Foo::Bar::Baz::BUILD' }
48 sub bar { 'Foo::Bar::Baz::bar' }
49 sub foobarbaz { 'Foo::Bar::Baz::foobarbaz' }
50}
51
8048fe76 52ok(!defined(Class::MOP::Class->initialize('Foo')->find_next_method_by_name('BUILD')),
53 '... Foo::BUILD has not next method');
54
55is(Class::MOP::Class->initialize('Bar')->find_next_method_by_name('BUILD'),
56 Class::MOP::Class->initialize('Foo')->get_method('BUILD'),
57 '... Bar::BUILD does have a next method');
58
59is(Class::MOP::Class->initialize('Baz')->find_next_method_by_name('BUILD'),
60 Class::MOP::Class->initialize('Bar')->get_method('BUILD'),
61 '... Baz->BUILD does have a next method');
62
63is(Class::MOP::Class->initialize('Foo::Bar')->find_next_method_by_name('BUILD'),
64 Class::MOP::Class->initialize('Foo')->get_method('BUILD'),
65 '... Foo::Bar->BUILD does have a next method');
66
67is(Class::MOP::Class->initialize('Foo::Bar::Baz')->find_next_method_by_name('BUILD'),
68 Class::MOP::Class->initialize('Foo')->get_method('BUILD'),
69 '... Foo::Bar::Baz->BUILD does have a next method');
70
a5eca695 71is_deeply(
77ff94df 72 [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Foo')->get_all_methods() ],
a5eca695 73 [
77ff94df 74 Class::MOP::Class->initialize('Foo')->get_method('BUILD') ,
75 Class::MOP::Class->initialize('Foo')->get_method('foo'),
a5eca695 76 ],
77 '... got the right list of applicable methods for Foo');
78
79is_deeply(
77ff94df 80 [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Bar')->get_all_methods() ],
a5eca695 81 [
77ff94df 82 Class::MOP::Class->initialize('Bar')->get_method('BUILD'),
83 Class::MOP::Class->initialize('Bar')->get_method('bar'),
84 Class::MOP::Class->initialize('Foo')->get_method('foo'),
a5eca695 85 ],
86 '... got the right list of applicable methods for Bar');
87
88
89is_deeply(
77ff94df 90 [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Baz')->get_all_methods() ],
22286063 91 [
77ff94df 92 Class::MOP::Class->initialize('Bar')->get_method('BUILD'),
93 Class::MOP::Class->initialize('Bar')->get_method('bar'),
94 Class::MOP::Class->initialize('Baz')->get_method('baz'),
95 Class::MOP::Class->initialize('Baz')->get_method('foo'),
a5eca695 96 ],
97 '... got the right list of applicable methods for Baz');
98
99is_deeply(
77ff94df 100 [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Foo::Bar')->get_all_methods() ],
a5eca695 101 [
77ff94df 102 Class::MOP::Class->initialize('Foo::Bar')->get_method('BUILD'),
103 Class::MOP::Class->initialize('Bar')->get_method('bar'),
104 Class::MOP::Class->initialize('Foo')->get_method('foo'),
105 Class::MOP::Class->initialize('Foo::Bar')->get_method('foobar'),
a5eca695 106 ],
107 '... got the right list of applicable methods for Foo::Bar');
108
77ff94df 109# test compute_all_applicable_methods once for compat
a5eca695 110is_deeply(
111 [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Foo::Bar::Baz')->compute_all_applicable_methods() ],
112 [
113 {
114 name => 'BUILD',
115 class => 'Foo::Bar::Baz',
7855ddba 116 code => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('BUILD')
a5eca695 117 },
118 {
119 name => 'bar',
120 class => 'Foo::Bar::Baz',
7855ddba 121 code => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('bar')
a5eca695 122 },
123 {
124 name => 'baz',
125 class => 'Baz',
7855ddba 126 code => Class::MOP::Class->initialize('Baz')->get_method('baz')
a5eca695 127 },
128 {
129 name => 'foo',
130 class => 'Foo',
7855ddba 131 code => Class::MOP::Class->initialize('Foo')->get_method('foo')
a5eca695 132 },
133 {
134 name => 'foobarbaz',
135 class => 'Foo::Bar::Baz',
7855ddba 136 code => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('foobarbaz')
a5eca695 137 },
138 ],
139 '... got the right list of applicable methods for Foo::Bar::Baz');
140
141## find_all_methods_by_name
142
143is_deeply(
144 [ Class::MOP::Class->initialize('Foo::Bar')->find_all_methods_by_name('BUILD') ],
145 [
146 {
147 name => 'BUILD',
148 class => 'Foo::Bar',
7855ddba 149 code => Class::MOP::Class->initialize('Foo::Bar')->get_method('BUILD')
a5eca695 150 },
151 {
152 name => 'BUILD',
153 class => 'Foo',
7855ddba 154 code => Class::MOP::Class->initialize('Foo')->get_method('BUILD')
a5eca695 155 },
156 {
157 name => 'BUILD',
158 class => 'Bar',
7855ddba 159 code => Class::MOP::Class->initialize('Bar')->get_method('BUILD')
a5eca695 160 }
161 ],
162 '... got the right list of BUILD methods for Foo::Bar');
163
164is_deeply(
165 [ Class::MOP::Class->initialize('Foo::Bar::Baz')->find_all_methods_by_name('BUILD') ],
166 [
167 {
168 name => 'BUILD',
169 class => 'Foo::Bar::Baz',
7855ddba 170 code => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('BUILD')
a5eca695 171 },
172 {
173 name => 'BUILD',
174 class => 'Foo',
7855ddba 175 code => Class::MOP::Class->initialize('Foo')->get_method('BUILD')
a5eca695 176 },
177 {
178 name => 'BUILD',
179 class => 'Bar',
7855ddba 180 code => Class::MOP::Class->initialize('Bar')->get_method('BUILD')
22286063 181 },
a5eca695 182 ],
77ff94df 183 '... got the right list of BUILD methods for Foo::Bar::Baz');