The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use lib 't/lib/runtime';

use Module::Runtime 'require_module';

sub warnings_ok {
    my ($class, @conflicts) = @_;
    local $Test::Builder::Level = $Test::Builder::Level + 1;
    @conflicts = sort map { "Conflict detected for $_->[0]:\n  $_->[1] is version $_->[2], but must be greater than version $_->[3]\n" } @conflicts;

    my @warnings;
    {
        local $SIG{__WARN__} = sub { push @warnings, $_[0] };
        require_module($class);
    }
    @warnings = sort @warnings;

    is_deeply(\@warnings, \@conflicts, "correct runtime warnings for $class");
}

warnings_ok(
    'Foo',
    ['Foo::Conflicts', 'Foo::Foo', '0.01', '0.01'],
    ['Foo::Conflicts', 'Foo::Bar', '0.01', '0.01'],
);
warnings_ok(
    'Bar',
    ['Bar::Conflicts', 'Bar::Baz::Bad',  '0.01', '0.01'],
    ['Bar::Conflicts', 'Bar::Foo::Bad',  '0.01', '0.01'],
    ['Bar::Conflicts', 'Bar::Foo',       '0.01', '0.01'],
    ['Bar::Conflicts', 'Bar::Bar::Bad',  '0.01', '0.01'],
    ['Bar::Conflicts', 'Bar::Bar',       '0.01', '0.01'],
    ['Bar::Conflicts', 'Bar::Quux::Bad', '0.01', '0.01'],
);

is(Bar::Foo->contents, "__DATA__ for Bar::Foo\n", "__DATA__ sections intact");
is(Bar::Bar->contents, "__DATA__ for Bar::Bar\n", "__DATA__ sections intact");
is(Bar::Baz->contents, "__DATA__ for Bar::Baz\n", "__DATA__ sections intact");
is(Bar::Quux->contents, "__DATA__ for Bar::Quux\n", "__DATA__ sections intact");

is(scalar(grep { ref($_) eq 'ARRAY' && @$_ > 1 && ref($_->[1]) eq 'HASH' }
               @INC),
   1,
   "only installed one \@INC hook");

done_testing;