008_cached_merge_unordered.t [plain text]
use strict;
use warnings;
use Test::More tests => 12;
BEGIN {
use_ok('Algorithm::C3');
}
=pod
Just like 007_cached_merge, but test the MROs in some wierd order, rather
than alphabetical order.
This example is taken from: http://rt.cpan.org/Public/Bug/Display.html?id=20879
--- --- ---
Level 5 8 | A | 9 | B | A | C | (More General)
--- --- --- V
\ | / |
\ | / |
\ | / |
\ | / |
--- |
Level 4 7 | D | |
--- |
/ \ |
/ \ |
--- --- |
Level 3 4 | G | 6 | E | |
--- --- |
| | |
| | |
--- --- |
Level 2 3 | H | 5 | F | |
--- --- |
\ / | |
\ / | |
\ | |
/ \ | |
/ \ | |
--- --- |
Level 1 1 | J | 2 | I | |
--- --- |
\ / |
\ / |
--- v
Level 0 0 | K | (More Specialized)
---
0123456789A
KJIHGFEDABC
=cut
{
package Test::A;
sub x { 1 }
package Test::B;
sub x { 1 }
package Test::C;
sub x { 1 }
package Test::D;
use base qw/Test::A Test::B Test::C/;
package Test::E;
use base qw/Test::D/;
package Test::F;
use base qw/Test::E/;
package Test::G;
use base qw/Test::D/;
package Test::H;
use base qw/Test::G/;
package Test::I;
use base qw/Test::H Test::F/;
package Test::J;
use base qw/Test::F/;
package Test::K;
use base qw/Test::J Test::I/;
}
sub supers {
no strict 'refs';
@{$_[0] . '::ISA'};
}
my %cache;
is_deeply(
[ Algorithm::C3::merge('Test::J', \&supers, \%cache) ],
[ qw(Test::J Test::F Test::E Test::D Test::A Test::B Test::C) ],
'... got the right C3 merge order for Test::J');
is_deeply(
[ Algorithm::C3::merge('Test::G', \&supers, \%cache) ],
[ qw(Test::G Test::D Test::A Test::B Test::C) ],
'... got the right C3 merge order for Test::G');
is_deeply(
[ Algorithm::C3::merge('Test::B', \&supers, \%cache) ],
[ qw(Test::B) ],
'... got the right C3 merge order for Test::B');
is_deeply(
[ Algorithm::C3::merge('Test::D', \&supers, \%cache) ],
[ qw(Test::D Test::A Test::B Test::C) ],
'... got the right C3 merge order for Test::D');
is_deeply(
[ Algorithm::C3::merge('Test::C', \&supers, \%cache) ],
[ qw(Test::C) ],
'... got the right C3 merge order for Test::C');
is_deeply(
[ Algorithm::C3::merge('Test::I', \&supers, \%cache) ],
[ qw(Test::I Test::H Test::G Test::F Test::E Test::D Test::A Test::B Test::C) ],
'... got the right C3 merge order for Test::I');
is_deeply(
[ Algorithm::C3::merge('Test::K', \&supers, \%cache) ],
[ qw(Test::K Test::J Test::I Test::H Test::G Test::F Test::E Test::D Test::A Test::B Test::C) ],
'... got the right C3 merge order for Test::K');
is_deeply(
[ Algorithm::C3::merge('Test::E', \&supers, \%cache) ],
[ qw(Test::E Test::D Test::A Test::B Test::C) ],
'... got the right C3 merge order for Test::E');
is_deeply(
[ Algorithm::C3::merge('Test::F', \&supers, \%cache) ],
[ qw(Test::F Test::E Test::D Test::A Test::B Test::C) ],
'... got the right C3 merge order for Test::F');
is_deeply(
[ Algorithm::C3::merge('Test::A', \&supers, \%cache) ],
[ qw(Test::A) ],
'... got the right C3 merge order for Test::A');
is_deeply(
[ Algorithm::C3::merge('Test::H', \&supers, \%cache) ],
[ qw(Test::H Test::G Test::D Test::A Test::B Test::C) ],
'... got the right C3 merge order for Test::H');