37_mro_warn.t   [plain text]


use strict;
use Test::More;

BEGIN
{
    if ($] < 5.009_005) {
        plan(skip_all => "This test is only applicable for perl >= 5.9.5");
    } elsif ( ! eval { require MRO::Compat } || $@) {
        plan(skip_all => "MRO::Compat not available");
    } elsif ( ! eval { require Class::C3 } || $@) {
        plan(skip_all => "Class::C3 not available");
    } else {
        plan(tests => 2);
    }
}

{
    # If the bug still exists, I should get a few warnings
    my @warnings;
    local $SIG{__WARN__} = sub {
        push @warnings, $_[0];
    };

    # Remove symbols from respective tables, and
    # remove from INC, so we force re-evaluation
    foreach my $class qw(Class::C3 MRO::Compat) {
        my $file = $class;
        $file =~ s/::/\//g;
        $file .= '.pm';

        delete $INC{$file};

        { # Don't do this at home, kids!
            no strict 'refs';
            foreach my $key (keys %{ "${class}::" }) {
                delete ${"${class}::"}{$key};
            }
        }
    }

    eval {
        require MRO::Compat;
        require Class::C3;
    };
    ok( ! $@, "Class::C3 loaded ok");
    if (! ok( ! @warnings, "loading Class::C3 did not generate warnings" )) {
        diag("Generated warnings are (expecting 'subroutine redefined...')");
        diag("   $_") for @warnings;
    }
}