getting close to a 0.07 release
[gitmo/Class-MOP.git] / t / 002_class_precedence_list.t
CommitLineData
0882828e 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
1a7ebbb3 6use Test::More tests => 6;
0882828e 7
8BEGIN {
9 use_ok('Class::MOP');
10 use_ok('Class::MOP::Class');
11}
12
13=pod
14
15 A
16 / \
17B C
18 \ /
19 D
20
21=cut
22
23{
24 package My::A;
aa448b16 25 use metaclass;
0882828e 26 package My::B;
27 our @ISA = ('My::A');
28 package My::C;
29 our @ISA = ('My::A');
30 package My::D;
31 our @ISA = ('My::B', 'My::C');
32}
33
34is_deeply(
aa448b16 35 [ My::D->meta->class_precedence_list ],
0882828e 36 [ 'My::D', 'My::B', 'My::A', 'My::C', 'My::A' ],
37 '... My::D->meta->class_precedence_list == (D B A C A)');
38
39=pod
40
bfe4d0fc 41 A <-+
42 | |
43 B |
44 | |
45 C --+
0882828e 46
47=cut
48
49{
50 package My::2::A;
aa448b16 51 use metaclass;
bfe4d0fc 52 our @ISA = ('My::2::C');
53
0882828e 54 package My::2::B;
bfe4d0fc 55 our @ISA = ('My::2::A');
56
57 package My::2::C;
58 our @ISA = ('My::2::B');
0882828e 59}
60
aa448b16 61eval { My::2::B->meta->class_precedence_list };
0882828e 62ok($@, '... recursive inheritance breaks correctly :)');
63
64=pod
65
66 +--------+
67 | A |
68 | / \ |
69 +->B C-+
70 \ /
71 D
72
73=cut
74
75{
76 package My::3::A;
aa448b16 77 use metaclass;
0882828e 78 package My::3::B;
79 our @ISA = ('My::3::A');
80 package My::3::C;
81 our @ISA = ('My::3::A', 'My::3::B');
82 package My::3::D;
83 our @ISA = ('My::3::B', 'My::3::C');
84}
85
86is_deeply(
aa448b16 87 [ My::3::D->meta->class_precedence_list ],
0882828e 88 [ 'My::3::D', 'My::3::B', 'My::3::A', 'My::3::C', 'My::3::A', 'My::3::B', 'My::3::A' ],
89 '... My::3::D->meta->class_precedence_list == (D B A C A B A)');
fe122940 90
91=pod
92
93Test all the class_precedence_lists
94using Perl's own dispatcher to check
95against.
96
97=cut
98
99my @CLASS_PRECEDENCE_LIST;
100
101{
102 package Foo;
aa448b16 103 use metaclass;
fe122940 104
105 sub CPL { push @CLASS_PRECEDENCE_LIST => 'Foo' }
106
107 package Bar;
108 our @ISA = ('Foo');
109
110 sub CPL {
111 push @CLASS_PRECEDENCE_LIST => 'Bar';
112 $_[0]->SUPER::CPL();
113 }
114
115 package Baz;
aa448b16 116 use metaclass;
fe122940 117 our @ISA = ('Bar');
118
119 sub CPL {
120 push @CLASS_PRECEDENCE_LIST => 'Baz';
121 $_[0]->SUPER::CPL();
122 }
123
124 package Foo::Bar;
125 our @ISA = ('Baz');
126
127 sub CPL {
128 push @CLASS_PRECEDENCE_LIST => 'Foo::Bar';
129 $_[0]->SUPER::CPL();
130 }
131
132 package Foo::Bar::Baz;
133 our @ISA = ('Foo::Bar');
134
135 sub CPL {
136 push @CLASS_PRECEDENCE_LIST => 'Foo::Bar::Baz';
137 $_[0]->SUPER::CPL();
138 }
139
140}
141
142Foo::Bar::Baz->CPL();
143
144is_deeply(
aa448b16 145 [ Foo::Bar::Baz->meta->class_precedence_list ],
fe122940 146 [ @CLASS_PRECEDENCE_LIST ],
147 '... Foo::Bar::Baz->meta->class_precedence_list == @CLASS_PRECEDENCE_LIST');
148