test.pl tweaks from Rafael and Pudge (assuming I deciphered
[p5sagit/p5-mst-13.2.git] / t / test.pl
index 87cb51a..90e7ed5 100644 (file)
--- a/t/test.pl
+++ b/t/test.pl
@@ -72,12 +72,20 @@ sub ok {
     _ok($pass, _where(), $name, @mess);
 }
 
+sub _q {
+    my $x = shift;
+    return 'undef' unless defined $x;
+    my $q = $x;
+    $q =~ s/'/\\'/;
+    return "'$q'";
+}
+
 sub is {
     my ($got, $expected, $name, @mess) = @_;
     my $pass = $got eq $expected;
     unless ($pass) {
-       unshift(@mess, "#      got '$got'\n",
-                      "# expected '$expected'\n");
+       unshift(@mess, "#      got "._q($got)."\n",
+                      "# expected "._q($expected)."\n");
     }
     _ok($pass, _where(), $name, @mess);
 }
@@ -86,7 +94,7 @@ sub isnt {
     my ($got, $isnt, $name, @mess) = @_;
     my $pass = $got ne $isnt;
     unless( $pass ) {
-        unshift(@mess, "# it should not be $got\n",
+        unshift(@mess, "# it should not be "._q($got)."\n",
                        "# but it is.\n");
     }
     _ok($pass, _where(), $name, @mess);
@@ -129,7 +137,8 @@ sub skip {
     my $why = shift;
     my $n    = @_ ? shift : 1;
     for (1..$n) {
-       ok(1, "# skip:", $why);
+       print "ok $test # skip: $why\n";
+        $test++;
     }
     local $^W = 0;
     last SKIP;
@@ -160,4 +169,82 @@ USE_OK
     _ok(!$@, _where(), "use $use");
 }
 
+# runperl - Runs a separate perl interpreter.
+# Arguments :
+#   switches => [ command-line switches ]
+#   nolib    => 1 # don't use -I../lib (included by default)
+#   prog     => one-liner (avoid quotes)
+#   progfile => perl script
+#   stdin    => string to feed the stdin
+#   stderr   => redirect stderr to stdout
+#   args     => [ command-line arguments to the perl program ]
+#   verbose  => print the command line
+
+my $is_mswin    = $^O eq 'MSWin32';
+my $is_netware  = $^O eq 'NetWare';
+my $is_macos    = $^O eq 'MacOS';
+my $is_vms      = $^O eq 'VMS';
+
+sub _quote_args {
+    my ($runperl, $args) = @_;
+
+    foreach (@$args) {
+       # In VMS protect with doublequotes because otherwise
+       # DCL will lowercase -- unless already doublequoted.
+       $_ = q(").$_.q(") if $is_vms && !/^\"/;
+       $$runperl .= ' ' . $_;
+    }
+}
+
+sub runperl {
+    my %args = @_;
+    my $runperl = $^X;
+    if ($args{switches}) {
+       _quote_args(\$runperl, $args{switches});
+    }
+    unless ($args{nolib}) {
+       if ($is_macos) {
+           $runperl .= ' -I::lib';
+           # Use UNIX style error messages instead of MPW style.
+           $runperl .= ' -MMac::err=unix' if $args{stderr};
+       }
+       else {
+           $runperl .= ' "-I../lib"'; # doublequotes because of VMS
+       }
+    }
+    if (defined $args{prog}) {
+       if ($is_mswin || $is_netware || $is_vms) {
+           $runperl .= qq( -e ") . $args{prog} . qq(");
+       }
+       else {
+           $runperl .= qq( -e ') . $args{prog} . qq(');
+       }
+    } elsif (defined $args{progfile}) {
+       $runperl .= qq( "$args{progfile}");
+    }
+    if (defined $args{stdin}) {
+       if ($is_mswin || $is_netware || $is_vms) {
+           $runperl = qq{$^X -e "print qq(} .
+               $args{stdin} . q{)" | } . $runperl;
+       }
+       else {
+           $runperl = qq{$^X -e 'print qq(} .
+               $args{stdin} . q{)' | } . $runperl;
+       }
+    }
+    if (defined $args{args}) {
+       _quote_args(\$runperl, $args{args});
+    }
+    $runperl .= ' 2>&1'          if  $args{stderr} && !$is_macos;
+    $runperl .= " \xB3 Dev:Null" if !$args{stderr} &&  $is_macos;
+    if ($args{verbose}) {
+       my $runperldisplay = $runperl;
+       $runperldisplay =~ s/\n/\n\#/g;
+       print "# $runperldisplay\n";
+    }
+    my $result = `$runperl`;
+    $result =~ s/\n\n/\n/ if $is_vms; # XXX pipes sometimes double these
+    return $result;
+}
+
 1;