(retracted by #13597, #13593 does the job better)
[p5sagit/p5-mst-13.2.git] / t / test.pl
index 9a95de1..bd5d577 100644 (file)
--- a/t/test.pl
+++ b/t/test.pl
@@ -6,6 +6,7 @@ my $test = 1;
 my $planned;
 
 $TODO = 0;
+$NO_ENDING = 0;
 
 sub plan {
     my $n;
@@ -15,22 +16,22 @@ sub plan {
        my %plan = @_;
        $n = $plan{tests}; 
     }
-    print "1..$n\n";
+    print STDOUT "1..$n\n";
     $planned = $n;
 }
 
 END {
     my $ran = $test - 1;
-    if (defined $planned && $planned != $ran) {
-       print "# Looks like you planned $planned tests but ran $ran.\n";
+    if (!$NO_ENDING && defined $planned && $planned != $ran) {
+        print STDOUT "# Looks like you planned $planned tests but ran $ran.\n";
     }
 }
 
 sub skip_all {
     if (@_) {
-       print "1..0 - @_\n";
+       print STDOUT "1..0 - @_\n";
     } else {
-       print "1..0\n";
+       print STDOUT "1..0\n";
     }
     exit(0);
 }
@@ -41,21 +42,23 @@ sub _ok {
     # VMS will avenge.
     my $out;
     if ($name) {
+        # escape out '#' or it will interfere with '# skip' and such
+        $name =~ s/#/\\#/g;
        $out = $pass ? "ok $test - $name" : "not ok $test - $name";
     } else {
        $out = $pass ? "ok $test" : "not ok $test";
     }
 
     $out .= " # TODO $TODO" if $TODO;
-    print "$out\n";
+    print STDOUT "$out\n";
 
     unless ($pass) {
-       print "# Failed $where\n";
+       print STDOUT "# Failed $where\n";
     }
 
     # Ensure that the message is properly escaped.
-    print map { /^#/ ? "$_\n" : "# $_\n" } 
-          map { split /\n/ } @mess if @mess;
+    print STDOUT map { /^#/ ? "$_\n" : "# $_\n" } 
+                 map { split /\n/ } @mess if @mess;
 
     $test++;
 
@@ -127,6 +130,10 @@ sub fail {
     _ok(0, _where(), @_);
 }
 
+sub curr_test {
+    return $test;
+}
+
 sub next_test {
     $test++
 }
@@ -137,7 +144,7 @@ sub skip {
     my $why = shift;
     my $n    = @_ ? shift : 1;
     for (1..$n) {
-       print "ok $test # skip: $why\n";
+        print STDOUT "ok $test # skip: $why\n";
         $test++;
     }
     local $^W = 0;
@@ -199,13 +206,13 @@ sub _quote_args {
 sub runperl {
     my %args = @_;
     my $runperl = $^X;
-    if (defined $args{switches}) {
+    if ($args{switches}) {
        _quote_args(\$runperl, $args{switches});
     }
-    unless (defined $args{nolib}) {
-       if ($is_macos && $args{stderr}) {
+    unless ($args{nolib}) {
+       if ($is_macos) {
            $runperl .= ' -I::lib';
-           # Use UNIX style error message instead of MPW style.
+           # Use UNIX style error messages instead of MPW style.
            $runperl .= ' -MMac::err=unix' if $args{stderr};
        }
        else {
@@ -223,12 +230,17 @@ sub runperl {
        $runperl .= qq( "$args{progfile}");
     }
     if (defined $args{stdin}) {
+        # so we don't try to put literal newlines and crs onto the
+        # command line.
+        $args{stdin} =~ s/\n/\\n/g;
+        $args{stdin} =~ s/\r/\\r/g;
+
        if ($is_mswin || $is_netware || $is_vms) {
-           $runperl = qq{$^X -e "print q(} .
+           $runperl = qq{$^X -e "print qq(} .
                $args{stdin} . q{)" | } . $runperl;
        }
        else {
-           $runperl = qq{$^X -e 'print q(} .
+           $runperl = qq{$^X -e 'print qq(} .
                $args{stdin} . q{)' | } . $runperl;
        }
     }
@@ -240,11 +252,67 @@ sub runperl {
     if ($args{verbose}) {
        my $runperldisplay = $runperl;
        $runperldisplay =~ s/\n/\n\#/g;
-       print "# $runperldisplay\n";
+       print STDOUT "# $runperldisplay\n";
     }
     my $result = `$runperl`;
     $result =~ s/\n\n/\n/ if $is_vms; # XXX pipes sometimes double these
     return $result;
 }
 
+
+sub BAILOUT {
+    print STDOUT "Bail out! @_\n";
+    exit;
+}
+
+
+# A way to display scalars containing control characters and Unicode.
+sub display {
+    map { join("", map { $_ > 255 ? sprintf("\\x{%x}", $_) : chr($_) =~ /[[:cntrl:]]/ ? sprintf("\\%03o", $_) : chr($_) } unpack("U*", $_)) } @_;
+}
+
+
+# A somewhat safer version of the sometimes wrong $^X.
+my $Perl;
+sub which_perl {
+    unless (defined $Perl) {
+       $Perl = $^X;
+       
+       my $exe;
+       eval "require Config; Config->import";
+       if ($@) {
+           warn "test.pl had problems loading Config: $@";
+           $exe = '';
+       } else {
+           $exe = $Config{_exe};
+       }
+       
+       # This doesn't absolutize the path: beware of future chdirs().
+       # We could do File::Spec->abs2rel() but that does getcwd()s,
+       # which is a bit heavyweight to do here.
+       
+       if ($Perl =~ /^perl\Q$exe\E$/i) {
+           my $perl = "perl$exe";
+           eval "require File::Spec";
+           if ($@) {
+               warn "test.pl had problems loading File::Spec: $@";
+               $Perl = "./$perl";
+           } else {
+               $Perl = File::Spec->catfile(File::Spec->curdir(), $perl);
+           }
+       }
+       
+        # Its like this.  stat on Cygwin treats 'perl' to mean 'perl.exe'
+        # but open does not.  This can get confusing, so to be safe we
+        # always put the .exe on the end on Cygwin.
+        $Perl .= $exe if $^O eq 'cygwin' && $Perl !~ /\Q$exe\E$/;
+
+       warn "which_perl: cannot find $Perl from $^X" unless -f $Perl;
+       
+       # For subcommands to use.
+       $ENV{PERLEXE} = $Perl;
+    }
+    return $Perl;
+}
+
 1;