avoid needing . in @INC in dev mode
[gitmo/Algorithm-C3.git] / t / 008_cached_merge_unordered.t
CommitLineData
ca604ce2 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More tests => 12;
7
8BEGIN {
9 use_ok('Algorithm::C3');
10}
11
12=pod
13
14Just like 007_cached_merge, but test the MROs in some wierd order, rather
15than alphabetical order.
16
17This example is taken from: http://rt.cpan.org/Public/Bug/Display.html?id=20879
18
19 --- --- ---
20Level 5 8 | A | 9 | B | A | C | (More General)
21 --- --- --- V
22 \ | / |
23 \ | / |
24 \ | / |
25 \ | / |
26 --- |
27Level 4 7 | D | |
28 --- |
29 / \ |
30 / \ |
31 --- --- |
32Level 3 4 | G | 6 | E | |
33 --- --- |
34 | | |
35 | | |
36 --- --- |
37Level 2 3 | H | 5 | F | |
38 --- --- |
39 \ / | |
40 \ / | |
41 \ | |
42 / \ | |
43 / \ | |
44 --- --- |
45Level 1 1 | J | 2 | I | |
46 --- --- |
47 \ / |
48 \ / |
49 --- v
50Level 0 0 | K | (More Specialized)
51 ---
52
53
540123456789A
55KJIHGFEDABC
56
57=cut
58
59{
60 package Test::A;
61 sub x { 1 }
62
63 package Test::B;
64 sub x { 1 }
65
66 package Test::C;
67 sub x { 1 }
68
69 package Test::D;
70 use base qw/Test::A Test::B Test::C/;
71
72 package Test::E;
73 use base qw/Test::D/;
74
75 package Test::F;
76 use base qw/Test::E/;
77
78 package Test::G;
79 use base qw/Test::D/;
80
81 package Test::H;
82 use base qw/Test::G/;
83
84 package Test::I;
85 use base qw/Test::H Test::F/;
86
87 package Test::J;
88 use base qw/Test::F/;
89
90 package Test::K;
91 use base qw/Test::J Test::I/;
92}
93
94sub supers {
95 no strict 'refs';
96 @{$_[0] . '::ISA'};
97}
98
99my %cache;
100
101is_deeply(
102 [ Algorithm::C3::merge('Test::J', \&supers, \%cache) ],
103 [ qw(Test::J Test::F Test::E Test::D Test::A Test::B Test::C) ],
104 '... got the right C3 merge order for Test::J');
105
106is_deeply(
107 [ Algorithm::C3::merge('Test::G', \&supers, \%cache) ],
108 [ qw(Test::G Test::D Test::A Test::B Test::C) ],
109 '... got the right C3 merge order for Test::G');
110
111is_deeply(
112 [ Algorithm::C3::merge('Test::B', \&supers, \%cache) ],
113 [ qw(Test::B) ],
114 '... got the right C3 merge order for Test::B');
115
116is_deeply(
117 [ Algorithm::C3::merge('Test::D', \&supers, \%cache) ],
118 [ qw(Test::D Test::A Test::B Test::C) ],
119 '... got the right C3 merge order for Test::D');
120
121is_deeply(
122 [ Algorithm::C3::merge('Test::C', \&supers, \%cache) ],
123 [ qw(Test::C) ],
124 '... got the right C3 merge order for Test::C');
125
126is_deeply(
127 [ Algorithm::C3::merge('Test::I', \&supers, \%cache) ],
128 [ qw(Test::I Test::H Test::G Test::F Test::E Test::D Test::A Test::B Test::C) ],
129 '... got the right C3 merge order for Test::I');
130
131is_deeply(
132 [ Algorithm::C3::merge('Test::K', \&supers, \%cache) ],
133 [ qw(Test::K Test::J Test::I Test::H Test::G Test::F Test::E Test::D Test::A Test::B Test::C) ],
134 '... got the right C3 merge order for Test::K');
135
136is_deeply(
137 [ Algorithm::C3::merge('Test::E', \&supers, \%cache) ],
138 [ qw(Test::E Test::D Test::A Test::B Test::C) ],
139 '... got the right C3 merge order for Test::E');
140
141is_deeply(
142 [ Algorithm::C3::merge('Test::F', \&supers, \%cache) ],
143 [ qw(Test::F Test::E Test::D Test::A Test::B Test::C) ],
144 '... got the right C3 merge order for Test::F');
145
146is_deeply(
147 [ Algorithm::C3::merge('Test::A', \&supers, \%cache) ],
148 [ qw(Test::A) ],
149 '... got the right C3 merge order for Test::A');
150
151is_deeply(
152 [ Algorithm::C3::merge('Test::H', \&supers, \%cache) ],
153 [ qw(Test::H Test::G Test::D Test::A Test::B Test::C) ],
154 '... got the right C3 merge order for Test::H');
155