1 package autovivification::TestCases;
10 *{caller().'::testcase_ok'} = \&testcase_ok;
13 sub in_strict { (caller 0)[8] & (eval { strict::bits(@_) } || 0) };
16 my ($var, $init, $code, $exp, $use, $global) = @_;
17 my $decl = $global ? "our $var; local $var;" : "my $var;";
18 my $test = $var =~ /^[@%]/ ? "\\$var" : $var;
22 my \$strict = autovivification::TestCases::in_strict('refs');
25 local \$SIG{__WARN__} = sub { die join '', 'warn:', \@_ };
30 like \$@, \$exp[0], \$desc . ' [exception]';
32 is \$@, \$exp[0], \$desc . ' [exception]';
34 is_deeply \$res, \$exp[1], \$desc . ' [return]';
35 is_deeply $test, \$exp[2], \$desc . ' [variable]';
42 my @chunks = split /#+/, "$_ ";
43 s/^\s+//, s/\s+$// for @chunks;
44 my ($init, $code, $exp, $opts) = @chunks;
45 (my $var = $init) =~ s/[^\$@%\w].*//;
46 $init = $var eq $init ? '' : "$init;";
49 for (split ' ', $opts) {
51 $no = 0 if s/^([-+])// and $1 eq '-';
52 $use .= ($no ? 'no' : 'use') . " autovivification '$_';"
54 } elsif (defined $opts) {
56 $use = 'no autovivification;';
62 [ $var, $init, $code, $exp, $use, 0 ],
63 [ $var, "use strict; $init", $code, $exp, $use, 1 ],
64 [ $var, "no strict; $init", $code, $exp, $use, 1 ],
71 $new[0] =~ s/^\$/$sigil/;
72 for ($new[1], $new[2]) {
73 s/\Q$sigil$var\E/$new[0]/g;
76 my $simple = $new[2] !~ /->/;
77 my $plain_deref = $new[2] =~ /\Q$new[0]\E/;
78 my $empty = { '@' => '[ ]', '%' => '{ }' }->{$sigil};
80 and ( $new[3] =~ m!qr/\^Reference vivification forbidden.*?/!
81 or $new[3] =~ m!qr/\^Can't vivify reference.*?/!))
83 and $new[3] =~ m!qr/\^Can't use an undefined value as a.*?/!)) {
86 $new[3] = "'', 1, $empty";
88 $new[3] =~ s/,\s*undef\s*$/, $empty/;
92 push @testcases, @extra;
94 my $testcase = source(@$_);
95 my ($var, $init, $code) = @$_;
96 my $desc = do { (my $x = "$var | $init") =~ s,;\s+$,,; $x } . " | $code | $opts";
98 diag "== This testcase failed to compile ==\n$testcase\n## Reason: $@" if $@;