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