simplify more stuff
[gitmo/Class-MOP.git] / t / 004_advanced_methods.t
CommitLineData
a5eca695 1use strict;
2use warnings;
3
86a4d873 4use Test::More;
871e9eb5 5use Test::Fatal;
a5eca695 6
efd3d14c 7use Class::MOP;
8use Class::MOP::Class;
a5eca695 9
10=pod
11
86a4d873 12The following class hierarhcy is very contrived
a5eca695 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;
86a4d873 22
23 sub BUILD { 'Foo::BUILD' }
a5eca695 24 sub foo { 'Foo::foo' }
86a4d873 25
a5eca695 26 package Bar;
27 our @ISA = ('Foo');
86a4d873 28
29 sub BUILD { 'Bar::BUILD' }
30 sub bar { 'Bar::bar' }
31
a5eca695 32 package Baz;
33 our @ISA = ('Bar');
86a4d873 34
a5eca695 35 sub baz { 'Baz::baz' }
86a4d873 36 sub foo { 'Baz::foo' }
37
a5eca695 38 package Foo::Bar;
39 our @ISA = ('Foo', 'Bar');
86a4d873 40
41 sub BUILD { 'Foo::Bar::BUILD' }
42 sub foobar { 'Foo::Bar::foobar' }
43
a5eca695 44 package Foo::Bar::Baz;
45 our @ISA = ('Foo', 'Bar', 'Baz');
86a4d873 46
47 sub BUILD { 'Foo::Bar::Baz::BUILD' }
48 sub bar { 'Foo::Bar::Baz::bar' }
49 sub foobarbaz { 'Foo::Bar::Baz::foobarbaz' }
a5eca695 50}
51
86a4d873 52ok(!defined(Class::MOP::Class->initialize('Foo')->find_next_method_by_name('BUILD')),
8048fe76 53 '... Foo::BUILD has not next method');
54
86a4d873 55is(Class::MOP::Class->initialize('Bar')->find_next_method_by_name('BUILD'),
56 Class::MOP::Class->initialize('Foo')->get_method('BUILD'),
8048fe76 57 '... Bar::BUILD does have a next method');
86a4d873 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');
8048fe76 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');
86a4d873 78
a5eca695 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');
86a4d873 87
a5eca695 88
89is_deeply(
77ff94df 90 [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Baz')->get_all_methods() ],
86a4d873 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
a5eca695 109## find_all_methods_by_name
110
111is_deeply(
112 [ Class::MOP::Class->initialize('Foo::Bar')->find_all_methods_by_name('BUILD') ],
113 [
114 {
115 name => 'BUILD',
116 class => 'Foo::Bar',
7855ddba 117 code => Class::MOP::Class->initialize('Foo::Bar')->get_method('BUILD')
86a4d873 118 },
a5eca695 119 {
120 name => 'BUILD',
121 class => 'Foo',
7855ddba 122 code => Class::MOP::Class->initialize('Foo')->get_method('BUILD')
86a4d873 123 },
a5eca695 124 {
125 name => 'BUILD',
126 class => 'Bar',
7855ddba 127 code => Class::MOP::Class->initialize('Bar')->get_method('BUILD')
a5eca695 128 }
129 ],
130 '... got the right list of BUILD methods for Foo::Bar');
131
132is_deeply(
133 [ Class::MOP::Class->initialize('Foo::Bar::Baz')->find_all_methods_by_name('BUILD') ],
134 [
135 {
136 name => 'BUILD',
137 class => 'Foo::Bar::Baz',
7855ddba 138 code => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('BUILD')
86a4d873 139 },
a5eca695 140 {
141 name => 'BUILD',
142 class => 'Foo',
7855ddba 143 code => Class::MOP::Class->initialize('Foo')->get_method('BUILD')
86a4d873 144 },
a5eca695 145 {
146 name => 'BUILD',
147 class => 'Bar',
86a4d873 148 code => Class::MOP::Class->initialize('Bar')->get_method('BUILD')
149 },
a5eca695 150 ],
77ff94df 151 '... got the right list of BUILD methods for Foo::Bar::Baz');
86a4d873 152
153done_testing;