I've finally gotten around to making t/TEST  work properly on VMS. 
The patch is below and works with bleadperl on VMS and also works as 
before on Mac OS X.  If this is too ugly or too late for 5.8.0 I can 
live with that.  However, there are several advantages here for us.

1.) We could stop maintaining a separate test driver in vms/test.com 
(I'll submit a follow-on patch if this is accepted).

2.) We have been failing to pick up the following tests for some 
reason but we will run them if we start using t/TEST (sorry, 
case-leveled names):

      lib/class/isa/test
      lib/i18n/langtags/test
      lib/locale/maketext/test
      lib/term/ansicolor/test

3.) There were some tests we've been running twice (ext/lib/io...).

So, this does fix existing bugs as well as improving long-term maintainability.

--- t/TEST_ORIG Thu Apr 25 19:41:24 2002
+++ t/TEST      Thu Apr 25 23:39:15 2002
@@ -9,6 +9,9 @@
 # which live dual lives on CPAN.
 $ENV{PERL_CORE} = 1;
 
+# remove empty elements due to insertion of empty symbols via "''p1'" syntax
+@ARGV = grep($_,@ARGV) if $^O eq 'VMS';
+
 # Cheesy version of Getopt::Std.  Maybe we should replace it with that.
 @argv = ();
 if ($#ARGV >= 0) {
@@ -64,26 +67,40 @@
     foreach my $f (sort { $a cmp $b } readdir DIR) {
         next if $f eq $curdir or $f eq $updir;
 
-        my $fullpath = File::Spec->catdir($dir, $f);
+        my $fullpath = File::Spec->catfile($dir, $f);
 
         _find_tests($fullpath) if -d $fullpath;
+        $fullpath = VMS::Filespec::unixify($fullpath) if $^O eq 'VMS';
         push @ARGV, $fullpath if $f =~ /\.t$/;
     }
 }
 
+sub _quote_args {
+    my ($args) = @_;
+    my $argstring = '';
+
+    foreach (split(/\s+/,$args)) {
+       # In VMS protect with doublequotes because otherwise
+       # DCL will lowercase -- unless already doublequoted.
+       $_ = q(").$_.q(") if ($^O eq 'VMS') && !/^\"/ && length($_) > 0;
+       $argstring .= ' ' . $_;
+    }
+    return $argstring;
+}
+
 unless (@ARGV) {
     foreach my $dir (qw(base comp cmd run io op uni)) {
         _find_tests($dir);
     }
     _find_tests("lib") unless $core;
-    my $mani = File::Spec->catdir($updir, "MANIFEST");
+    my $mani = File::Spec->catfile($updir, "MANIFEST");
     if (open(MANI, $mani)) {
         while (<MANI>) { # similar code in t/harness
            if (m!^(ext/\S+/?([^/]+\.t|test\.pl)|lib/\S+?(\.t|test\.pl))\s!) {
                $t = $1;
                if (!$core || $t =~ m!^lib/[a-z]!)
                {
-                   $path = File::Spec->catdir($updir, $t);
+                   $path = File::Spec->catfile($updir, $t);
                    push @ARGV, $path;
                    $name{$path} = $t;
                }
@@ -139,8 +156,12 @@
     $files  = 0;
     $totmax = 0;
 
-    foreach (@tests) {
-        $name{$_} = File::Spec->catdir('t',$_) unless exists $name{$_};
+    foreach my $t (@tests) {
+      unless (exists $name{$t}) {
+        my $tname = File::Spec->catfile('t',$t);
+        $tname = VMS::Filespec::unixify($tname) if $^O eq 'VMS';
+        $name{$t} = $tname;
+      }
     }
     my $maxlen = 0;
     foreach (@name{@tests}) {
@@ -169,8 +190,12 @@
                next;
            }
        }
-       $te = $name{$test};
-       print "$te" . '.' x ($dotdotdot - length($te));
+       $te = $name{$test} . '.' x ($dotdotdot - length($name{$test}));
+
+       if ($^O ne 'VMS') {  # defer printing on VMS due to piping bug
+           print $te;
+           $te = '';
+       }
 
        $test = $OVER{$test} if exists $OVER{$test};
 
@@ -208,7 +233,8 @@
        }
        elsif ($type eq 'perl') {
            my $perl = $ENV{PERL} || './perl';
-           my $run = "$perl $testswitch $switch $utf $test |";
+           my $redir = ($^O eq 'VMS' ? '2>&1' : '');
+           my $run = "$perl" . _quote_args("$testswitch $switch $utf") . " $test 
+$redir|";
            open(RESULTS,$run) or print "can't run '$run': $!.\n";
        }
        else {
@@ -246,6 +272,7 @@
         $ok = 0;
         $next = 0;
        while (<RESULTS>) {
+           next if /^\s*$/; # skip blank lines
            if ($verbose) {
                print $_;
            }
@@ -304,17 +331,17 @@
         }
        if ($ok && $next == $max ) {
            if ($max) {
-               print "ok\n";
+               print "${te}ok\n";
                $good = $good + 1;
            }
            else {
-               print "skipping test on this platform\n";
+               print "${te}skipping test on this platform\n";
                $files -= 1;
            }
        }
        else {
            $next += 1;
-           print "FAILED at test $next\n";
+           print "${te}FAILED at test $next\n";
            $bad = $bad + 1;
            $_ = $test;
            if (/^base/) {
[end of patch]

-- 
________________________________________
Craig A. Berry
mailto:[EMAIL PROTECTED]

"... getting out of a sonnet is much more
 difficult than getting in."
                 Brad Leithauser

Reply via email to