get_all_methods and get_all_attributes
[gitmo/Class-MOP.git] / t / 004_advanced_methods.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 14;
7 use Test::Exception;
8
9 BEGIN {
10     use_ok('Class::MOP');   
11     use_ok('Class::MOP::Class');        
12 }
13
14 =pod
15
16 The following class hierarhcy is very contrived 
17 and totally horrid (it won't work under C3 even),
18 but it tests a number of aspect of this module.
19
20 A 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     
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
56 ok(!defined(Class::MOP::Class->initialize('Foo')->find_next_method_by_name('BUILD')), 
57    '... Foo::BUILD has not next method');
58
59 is(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    
63 is(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    
67 is(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    
71 is(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
75 is_deeply(
76     [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Foo')->get_all_methods() ],
77     [
78         Class::MOP::Class->initialize('Foo')->get_method('BUILD') ,
79         Class::MOP::Class->initialize('Foo')->get_method('foo'),
80     ],
81     '... got the right list of applicable methods for Foo');
82     
83 is_deeply(
84     [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Bar')->get_all_methods() ],
85     [
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'),
89     ],
90     '... got the right list of applicable methods for Bar');
91     
92
93 is_deeply(
94     [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Baz')->get_all_methods() ],
95     [   
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'),
100     ],
101     '... got the right list of applicable methods for Baz');
102
103 is_deeply(
104     [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Foo::Bar')->get_all_methods() ],
105     [
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'),
110     ],
111     '... got the right list of applicable methods for Foo::Bar');
112
113 # test compute_all_applicable_methods once for compat
114 is_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',
120             code  => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('BUILD')
121         },    
122         {
123             name  => 'bar',
124             class => 'Foo::Bar::Baz',
125             code  => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('bar')
126         },
127         {
128             name  => 'baz',
129             class => 'Baz',
130             code  => Class::MOP::Class->initialize('Baz')->get_method('baz')
131         },        
132         {
133             name  => 'foo',
134             class => 'Foo',
135             code  => Class::MOP::Class->initialize('Foo')->get_method('foo')
136         },   
137         {
138             name  => 'foobarbaz',
139             class => 'Foo::Bar::Baz',
140             code  => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('foobarbaz')
141         },            
142     ],
143     '... got the right list of applicable methods for Foo::Bar::Baz');
144
145 ## find_all_methods_by_name
146
147 is_deeply(
148     [ Class::MOP::Class->initialize('Foo::Bar')->find_all_methods_by_name('BUILD') ],
149     [
150         {
151             name  => 'BUILD',
152             class => 'Foo::Bar',
153             code  => Class::MOP::Class->initialize('Foo::Bar')->get_method('BUILD')
154         },    
155         {
156             name  => 'BUILD',
157             class => 'Foo',
158             code  => Class::MOP::Class->initialize('Foo')->get_method('BUILD')
159         },    
160         {
161             name  => 'BUILD',
162             class => 'Bar',
163             code  => Class::MOP::Class->initialize('Bar')->get_method('BUILD')
164         }
165     ],
166     '... got the right list of BUILD methods for Foo::Bar');
167
168 is_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',
174             code  => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('BUILD')
175         },    
176         {
177             name  => 'BUILD',
178             class => 'Foo',
179             code  => Class::MOP::Class->initialize('Foo')->get_method('BUILD')
180         },    
181         {
182             name  => 'BUILD',
183             class => 'Bar',
184             code  => Class::MOP::Class->initialize('Bar')->get_method('BUILD') 
185         },            
186     ],
187     '... got the right list of BUILD methods for Foo::Bar::Baz');