The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use FindBin qw/$Bin/;
use lib "$Bin/lib";

# Test the behavior used by Catalyst::Engine::HTTP::Restarter::Watcher
use Test::More tests => 2;

use B::Hooks::OP::Check::StashChange;

my @stashes;
my $expected_stashes = [
    [ 'main' => undef ],
    [ 'Foo' => 'main' ],
    [ 'Foo::Bar' => 'Foo' ],
    [ 'Foo::Bar::Baz' => 'Foo::Bar'],
    [ 'main' => 'Foo::Bar::Baz' ],
];
my $fn = "$Bin/lib/Foo.pm";

stash_changes_loading_foo();
is_deeply \@stashes, $expected_stashes, 'runtime require in eval';

@stashes = ();
delete $INC{$fn};
stash_changes_loading_foo();
shift(@$expected_stashes); # We no longer see the undef => main transition
is_deeply \@stashes, $expected_stashes,
    'runtime require in eval after delete from %INC';

sub stash_changes_loading_foo {
    my $id = B::Hooks::OP::Check::StashChange::register(sub {
        push @stashes, [@_];
    });

    eval "require '$fn';";

    B::Hooks::OP::Check::StashChange::unregister($id);
}