The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 5;

BEGIN {
    use_ok('Algorithm::C3');          
}

{
    package My::A;
    package My::C;
    our @ISA = ('My::A');
    package My::B;
    our @ISA = ('My::A');    
    package My::D;       
    our @ISA = ('My::B', 'My::C');         
}

{
    my @merged = Algorithm::C3::merge(
        'My::D',
        sub {
            no strict 'refs';
            @{$_[0] . '::ISA'};
        }
    );
            
    is_deeply(
        \@merged,
        [ qw/My::D My::B My::C My::A/ ],
        '... merged the lists correctly');
}

{
    package My::E;
    
    sub supers {
        no strict 'refs';
        @{$_[0] . '::ISA'};
    }    
    
    package My::F;
    our @ISA = ('My::E');
    package My::G;
    our @ISA = ('My::E');    
    package My::H;       
    our @ISA = ('My::G', 'My::F');
    sub method_exists_only_in_H { @ISA }
}

{
    my @merged = Algorithm::C3::merge('My::H', 'supers');

    is_deeply(
        \@merged,
        [ qw/My::H My::G My::F My::E/ ],
        '... merged the lists correctly');    
}

eval {
    Algorithm::C3::merge(
        'My::H',
        'this_method_does_not_exist'
    );
};
ok($@, '... this died as we expected');

eval {
    Algorithm::C3::merge(
        'My::H',
        'method_exists_only_in_H'
    );
};
ok($@, '... this died as we expected');