use strict;
use warnings;
-use blib 't/Sub-Op-Test';
+use blib 't/Sub-Op-LexicalSub';
-use Test::More tests => (4 + 2 * 4) + (2 * 5);
+use Test::More tests => 2 * ((1 + 2) * 4 + (1 + 1) * 5) + (2 + 2) + 4;
our $call_foo;
sub foo { ok $call_foo, 'the preexistent foo was called' }
+our $call_bar;
+sub bar () { ok $call_bar, 'the preexistent bar was called' }
+
+sub X () { 1 }
+
our $called;
{
local $/ = "####\n";
while (<DATA>) {
+ chomp;
+ s/\s*$//;
+
my ($code, $params) = split /----\s*/, $_;
my ($names, $ret, $exp, $seq) = split /\s*#\s*/, $params;
my $test = "{\n";
for my $name (@names) {
$test .= <<" INIT"
- use Sub::Op::Test $name => sub {
+ use Sub::Op::LexicalSub $name => sub {
++\$called;
my \$exp = shift \@exp;
is_deeply \\\@_, \$exp, '$name: arguments are correct';
is $called, $calls, "@names: the hook was called the right number of times";
if ($called < $calls) {
- fail for $called + 1 .. $calls;
+ fail, fail for $called + 1 .. $calls;
}
}
}
+is prototype('main::foo'), undef, "foo's prototype was preserved";
+is prototype('main::bar'), '', "bar's prototype was preserved";
+is prototype('main::X'), '', "X's prototype was preserved";
+ok Sub::Op::_constant_sub(do { no strict "refs"; \&{"main::X"} }),
+ 'X is still a constant';
+
__DATA__
foo();
----
&$foo;
----
foo # () #
+####
+bar();
+----
+bar # () # [ ]
+####
+bar;
+----
+bar # () # [ ]
+####
+bar(1);
+----
+bar # () # [ 1 ]
+####
+bar 2;
+----
+bar # () # [ 2 ]
+####
+local $call_bar = 1;
+&bar();
+----
+bar # () #
+####
+local $call_bar = 1;
+&bar;
+----
+bar # () #
+####
+local $call_bar = 1;
+&bar(3);
+----
+bar # () #
+####
+local $call_bar = 1;
+my $bar = \&bar;
+$bar->();
+----
+bar # () #
+####
+local $call_bar = 1;
+my $bar = \&bar;
+&$bar;
+----
+bar # () #
+####
+is X, 2, 'constant overriding';
+----
+X # 2 # [ ]