]> git.vpit.fr Git - perl/modules/autovivification.git/blobdiff - t/lib/autovivification/TestCases.pm
Document and test vivification of function arguments
[perl/modules/autovivification.git] / t / lib / autovivification / TestCases.pm
index 99d6672a2984d6cc51494108e7998371cd2da4a1..82b9b68c085f183bd9f3db211a5be65fabe54891 100644 (file)
@@ -12,6 +12,10 @@ sub import {
 
 sub in_strict { (caller 0)[8] & (eval { strict::bits(@_) } || 0) };
 
+sub do_nothing { }
+
+sub set_arg { $_[0] = 1 }
+
 sub generate {
  my ($var, $init, $code, $exp, $use, $opts, $global) = @_;
  my $decl = $global ? "our $var; local $var;" : "my $var;";
@@ -41,9 +45,11 @@ TESTCASE
 sub testcase_ok {
  local $_  = shift;
  my $sigil = shift;
+
  my @chunks = split /#+/, "$_ ";
  s/^\s+//, s/\s+$// for @chunks;
  my ($init, $code, $exp, $opts) = @chunks;
+
  (my $var = $init) =~ s/[^\$@%\w].*//;
  $init = $var eq $init ? '' : "$init;";
  my $use;
@@ -60,15 +66,19 @@ sub testcase_ok {
   $opts = 'default';
   $use  = '';
  }
+
  my @base = ([ $var, $init, $code, $exp, $use ]);
  if ($var =~ /\$/) {
+  my ($name) = $var =~ /^\$(.*)/;
+
   my @oldderef = @{$base[0]};
   $oldderef[2] =~ s/\Q$var\E\->/\$$var/g;
   push @base, \@oldderef;
 
   my @nonref = @{$base[0]};
-  $nonref[0] =~ s/^\$/$sigil/;
+  $nonref[0] = $sigil . $name;
   for ($nonref[1], $nonref[2]) {
+   s/\@\Q$var\E([\[\{])/\@$name$1/g;
    s/\Q$sigil$var\E/$nonref[0]/g;
    s/\Q$var\E\->/$var/g;
   }
@@ -87,12 +97,14 @@ sub testcase_ok {
   $nonref[3] =~ s/,\s*undef\s*$/, $empty/;
   push @base, \@nonref;
  }
+
  my @testcases = map {
   my ($var, $init, $code, $exp, $use) = @$_;
   [ $var, $init,               $code, $exp, $use, $opts, 0 ],
   [ $var, "use strict; $init", $code, $exp, $use, $opts, 1 ],
   [ $var, "no strict;  $init", $code, $exp, $use, $opts, 1 ],
  } @base;
+
  for (@testcases) {
   my ($testcase, $desc) = generate(@$_);
   my @N = (0 .. 9);