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