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

use warnings;
use strict;

use t::Utils;
use Class::DOES;

my $T;

my @warns;
$SIG{__WARN__} = sub { push @warns, $_[0] };

my $PKG = "TestAAAA";

sub doimport {
    my $warn = shift;
    my $args = join ",", map qq{"\Q$_\E"}, @_;
    my $B = Test::More->builder;

    $warn = $warn ? "" : "no warnings 'Class::DOES';";

    @warns = ();
    eval qq{
        package t::$PKG;
        $warn;
        Class::DOES->import($args);
    };
}

sub inherit {
    no strict "refs";
    @{"t\::$PKG\::ISA"} = @_;
}

sub got_warns {
    my ($warns, $name) = @_;
    my $B = Test::More->builder;
    $B->is_num(scalar @warns, $warns, $name)
        or $B->diag(join "\n", @warns);
}

BEGIN { $T += 2 }

doimport 1;
got_warns 0,                            "empty import doesn't warn";

doimport 1, "Foo::Bar";
got_warns 0,                            "correct import doesn't warn";

BEGIN { $T += 7 }

$PKG++;
doimport 1;
{
    no strict "refs";
    ${"t::$PKG\::DOES"}{"Foo::Bar"} = 0;
}
does_ok "t::$PKG", "Foo::Bar", 1,       "false value in \%DOES replaced";
got_warns 1,                            "...with warning";
like $warns[0], qr/\$t::$PKG\::DOES{Foo::Bar} is false/,
                                        "...correctly";

@warns = ();
{
    no warnings "Class::DOES";
    "t::$PKG"->DOES("Foo::Bar");
}
got_warns 0,                            "warning can be disabled";

{
    package t::False;
    # shut up with your 'used only once'
    no warnings;
    our %DOES = ("Foo::Bar" => 0);
}

$PKG++;
inherit "t::False";
doimport 1;
does_ok "t::$PKG", "Foo::Bar", 1,       "false value in inherited \%DOES";
got_warns 1,                            "...with warning";
like $warns[0], qr/\$t::False::DOES{Foo::Bar}/,
                                        "...correctly";

BEGIN { $T += 3 }

{
    package t::Does;
    sub DOES { 1 }
}

$PKG++;
inherit "t::Does";
doimport 1;
got_warns 1,                            "bad ->DOES warns";
like $warns[0], qr/t::$PKG.*incompatible ->DOES/,
                                        "...correctly";

$PKG++;
inherit "t::Does";
doimport 0;
got_warns 0,                            "warning can be disabled";

BEGIN { $T += 1 }

{
    package t::MyDoes;
    use Class::DOES;
}

$PKG++;
inherit "t::MyDoes";
doimport 1;
got_warns 0,                            "my ->DOES doesn't warn";

BEGIN { $T += 3 }

{
    package t::Isa;
    sub isa { 1 }
}

$PKG++;
inherit "t::Isa";
doimport 1;
got_warns 1,                            "bad ->isa warns";
like $warns[0], qr/t::$PKG doesn't use \@ISA/,
                                        "...correctly";

$PKG++;
inherit "t::Isa";
doimport 0;
got_warns 0,                            "warning can be disabled";

BEGIN { plan tests => $T }