Tests for S_incpush_use_sep() splitting on : (or platform equivalent)
[p5sagit/p5-mst-13.2.git] / t / run / runenv.t
index 1e36c99..1d2a6a7 100644 (file)
@@ -12,33 +12,26 @@ BEGIN {
         print "1..0 # Skip: no fork\n";
            exit 0;
     }
+    require './test.pl'
 }
 
-use Test;
+plan tests => 75;
 
-plan tests => 17;
-
-my $STDOUT = './results-0';
-my $STDERR = './results-1';
-my $PERL = './perl';
+my $STDOUT = tempfile();
+my $STDERR = tempfile();
+my $PERL = $ENV{PERL} || './perl';
 my $FAILURE_CODE = 119;
 
 delete $ENV{PERLLIB};
 delete $ENV{PERL5LIB};
 delete $ENV{PERL5OPT};
 
-# Run perl with specified environment and arguments returns a list.
-# First element is true if Perl's stdout and stderr match the
-# supplied $stdout and $stderr argument strings exactly.
-# second element is an explanation of the failure
-sub runperl {
-  local *F;
-  my ($env, $args, $stdout, $stderr) = @_;
 
+sub runperl_and_capture {
+  local *F;
+  my ($env, $args) = @_;
   unshift @$args, '-I../lib';
 
-  $stdout = '' unless defined $stdout;
-  $stderr = '' unless defined $stderr;
   local %ENV = %ENV;
   delete $ENV{PERLLIB};
   delete $ENV{PERL5LIB};
@@ -55,13 +48,7 @@ sub runperl {
     open F, "< $STDERR" or return (0, "Couldn't read $STDERR file");
     { local $/; $actual_stderr = <F> }
 
-    if ($actual_stdout ne $stdout) {
-      return (0, "Stdout mismatch: expected [$stdout], saw [$actual_stdout]");
-    } elsif ($actual_stderr ne $stderr) {
-      return (0, "Stderr mismatch: expected [$stderr], saw [$actual_stderr]");
-    } else {
-      return 1;                 # success
-    }
+    return ($actual_stdout, $actual_stderr);
   } else {                      # child
     for my $k (keys %$env) {
       $ENV{$k} = $env->{$k};
@@ -73,6 +60,22 @@ sub runperl {
   }
 }
 
+# Run perl with specified environment and arguments returns a list.
+# First element is true if Perl's stdout and stderr match the
+# supplied $stdout and $stderr argument strings exactly.
+# second element is an explanation of the failure
+sub runperl {
+  local *F;
+  my ($env, $args, $stdout, $stderr) = @_;
+  my ($actual_stdout, $actual_stderr) = runperl_and_capture($env, $args);
+  if ($actual_stdout ne $stdout) {
+    return (0, "Stdout mismatch: expected [$stdout], saw [$actual_stdout]");
+  } elsif ($actual_stderr ne $stderr) {
+    return (0, "Stderr mismatch: expected [$stderr], saw [$actual_stderr]");
+  } else {
+    return 1;                 # success
+  }
+}
 
 sub it_didnt_work {
     print STDOUT "IWHCWJIHCI\cNHJWCJQWKJQJWCQW\n";
@@ -82,7 +85,8 @@ sub it_didnt_work {
 sub try {
   my ($success, $reason) = runperl(@_);
   $reason =~ s/\n/\\n/g if defined $reason;
-  ok( !!$success, 1, $reason );
+  local $::Level = $::Level + 1;
+  ok( $success, $reason );
 }
 
 #  PERL5OPT    Command-line options (switches).  Switches in
@@ -185,6 +189,52 @@ try({PERL5LIB => "foo",
     '',
     '');
 
+# Tests for S_incpush_use_sep():
+
+my @dump_inc = ('-e', 'print "$_\n" foreach @INC');
+
+my ($out, $err) = runperl_and_capture({}, [@dump_inc]);
+
+is ($err, '', 'No errors when determining @INC');
+
+my @default_inc = split /\n/, $out;
+
+is (shift @default_inc, '../lib', 'Our -I../lib is at the front');
+
+my $sep = $Config{path_sep};
+foreach (['nothing', ''],
+        ['something', 'zwapp', 'zwapp'],
+        ['two things', "zwapp${sep}bam", 'zwapp', 'bam'],
+        ['two things, ::', "zwapp${sep}${sep}bam", 'zwapp', 'bam'],
+        [': at start', "${sep}zwapp", 'zwapp'],
+        [': at end', "zwapp${sep}", 'zwapp'],
+        [':: sandwich ::', "${sep}${sep}zwapp${sep}${sep}", 'zwapp'],
+        [':', "${sep}"],
+        ['::', "${sep}${sep}"],
+        [':::', "${sep}${sep}${sep}"],
+        ['two things and :', "zwapp${sep}bam${sep}", 'zwapp', 'bam'],
+        [': and two things', "${sep}zwapp${sep}bam", 'zwapp', 'bam'],
+        [': two things :', "${sep}zwapp${sep}bam${sep}", 'zwapp', 'bam'],
+        ['three things', "zwapp${sep}bam${sep}${sep}owww",
+         'zwapp', 'bam', 'owww'],
+       ) {
+  my ($name, $lib, @expect) = @$_;
+  push @expect, @default_inc;
+
+  ($out, $err) = runperl_and_capture({PERL5LIB => $lib}, [@dump_inc]);
+
+  is ($err, '', "No errors when determining \@INC for $name");
+
+  my @inc = split /\n/, $out;
+
+  is (shift @inc, '../lib', 'Our -I../lib is at the front for $name');
+
+  is (scalar @inc, scalar @expect,
+      "expected number of elements in \@INC for $name");
+
+  is ("@inc", "@expect", "expected elements in \@INC for $name");
+}
+
 # PERL5LIB tests with included arch directories still missing
 
 END {