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

use strict;
use Test::More tests => 24;

use Acme::Perl::VM;
use Acme::Perl::VM qw(:perl_h);

sub Dump{
    require Data::Dumper;
    diag(Data::Dumper::Dumper(@_));
}

my $x = run_block{
    my %h;
};
ok !$x;

$x = run_block{
    my %h = (key => 10);
};
ok $x;

my %hash = run_block{
    my %h = (foo => 10, bar => 20);
};
is_deeply(\%hash, { foo => 10, bar => 20 }) or Dump(\%hash);

%hash = run_block{
    our %h = (foo => 10, bar => 20);
};
is_deeply(\%hash, { foo => 10, bar => 20 }) or Dump(\%hash);

%hash = run_block{
    my %h = (foo => 10, foo => 20, bar => 30);
};
is_deeply \%hash, { foo => 20, bar => 30 } or Dump($x);

%hash = run_block{
    my %h = (a => 1, foo => 10, b => 2, foo => 20, c => 3);
};
is_deeply \%hash, { a => 1, foo => 10, b => 2, foo => 20, c => 3 };

$x = run_block{
    my %h = (foo => 10, bar => 20);
    return \%h;
};
is_deeply $x, { foo => 10, bar => 20 } or Dump($x);

$x = run_block{
    my %h = (foo => 10, bar => 20);
    $h{foo} = $h{bar} + 1;
    return \%h;
};
is_deeply $x, { foo => 21, bar => 20 } or Dump($x);

$x = run_block{
    my %h = (foo => 10, bar => 20);
    return $h{foo};
};
is_deeply $x, 10;

$x = run_block{
    our %h = (foo => 10, bar => 20);
    return $h{foo};
};
is_deeply $x, 10;
$x = run_block{
    our %h = (foo => 10, bar => 20);
    return \$h{foo};
};
is_deeply $x, \10;

sub f{
    my %h;
    return \$h{foo};
}
$x = run_block(\&f);
is_deeply $x, \undef;
$$x++;
is_deeply run_block(\&f), \undef;

my %h = (foo => 10, bar => 20);
is_deeply [ run_block{        keys   %h } ], [        keys   %h ], 'keys';
is_deeply [ run_block{        values %h } ], [        values %h ], 'values';
is_deeply [ run_block{ scalar keys   %h } ], [ scalar keys   %h ];
is_deeply [ run_block{ scalar values %h } ], [ scalar values %h ];
is_deeply \%h, {foo => 10, bar => 20};

is_deeply \@PL_stack,      [], '@PL_stack is empty';
is_deeply \@PL_markstack,  [], '@PL_markstack is empty';
is_deeply \@PL_scopestack, [], '@PL_scopestack is empty';
is_deeply \@PL_cxstack,    [], '@PL_cxstack is empty';
is_deeply \@PL_savestack,  [], '@PL_savestack is empty';
is_deeply \@PL_tmps,       [], '@PL_tmps is empty';