Share common code in t/TEST and t/harness, by having harness require ./TEST
Nicholas Clark [Thu, 27 Aug 2009 12:23:38 +0000 (13:23 +0100)]
The logical way to do this would be to have the common code in a file both
require or use. However, t/TEST needs to still work, to generate test results,
even if require isn't working, so we cannot do that. t/harness has no such
restriction, so it is quite acceptable to have it require t/TEST.

t/TEST
t/harness

diff --git a/t/TEST b/t/TEST
index 58f1da5..6589ee2 100755 (executable)
--- a/t/TEST
+++ b/t/TEST
@@ -5,6 +5,19 @@
 # probably obsolete on the avoidance side, though still currrent
 # on the peculiarity side.)
 
+# t/TEST and t/harness need to share code. The logical way to do this would be
+# to have the common code in a file both require or use. However, t/TEST needs
+# to still work, to generate test results, even if require isn't working, so
+# we cannot do that. t/harness has no such restriction, so it is quite
+# acceptable to have it require t/TEST.
+
+# In which case, we need to stop t/TEST actually running tests, as all
+# t/harness needs are its subroutines.
+
+if ($::do_nothing) {
+    return 1;
+}
+
 # Location to put the Valgrind log.
 my $Valgrind_Log = 'current.valgrind';
 
index 662afb6..11c1741 100644 (file)
--- a/t/harness
+++ b/t/harness
@@ -7,6 +7,7 @@ BEGIN {
     chdir 't' if -d 't';
     @INC = '../lib';              # pick up only this build's lib
 }
+
 delete $ENV{PERL5LIB};
 
 my $torture; # torture testing?
@@ -14,6 +15,9 @@ my $torture; # torture testing?
 use TAP::Harness 3.13;
 use strict;
 
+$::do_nothing = $::do_nothing = 1;
+require './TEST';
+
 my $Verbose = 0;
 $Verbose++ while @ARGV && $ARGV[0] eq '-v' && shift;
 
@@ -51,10 +55,6 @@ my (@tests, $re);
 # [.VMS]TEST.COM calls harness with empty arguments, so clean-up @ARGV
 @ARGV = grep $_ && length( $_ ) => @ARGV;
 
-sub _populate_hash {
-    return map {$_, 1} split /\s+/, $_[0];
-}
-
 sub _extract_tests;
 sub _extract_tests {
     # This can probably be done more tersely with a map, but I doubt that it
@@ -103,40 +103,6 @@ if ($ENV{HARNESS_OPTIONS}) {
     }
 }
 
-sub _tests_from_manifest {
-    my ($extensions, $known_extensions) = @_;
-    my %skip;
-    my %extensions = _populate_hash($extensions);
-    my %known_extensions = _populate_hash($known_extensions);
-
-    foreach (keys %known_extensions) {
-       $skip{$_}++ unless $extensions{$_};
-    }
-
-    my @results;
-    my $mani  = '../MANIFEST';
-    if (open(MANI, $mani)) {
-       while (<MANI>) { # similar code in t/TEST
-           if (m!^(ext/(\S+)/+(?:[^/\s]+\.t|test\.pl)|lib/\S+?(?:\.t|test\.pl))\s!) {
-               my ($test, $extension) = ($1, $2);
-               if (defined $extension) {
-                   $extension =~ s!/t$!!;
-                   # XXX Do I want to warn that I'm skipping these?
-                   next if $skip{$extension};
-                   my $flat_extension = $extension;
-                   $flat_extension =~ s!-!/!g;
-                   next if $skip{$flat_extension}; # Foo/Bar may live in Foo-Bar
-               }
-               push @results, "../$test";
-           }
-       }
-       close MANI;
-    } else {
-       warn "$0: cannot open $mani: $!\n";
-    }
-    return @results;
-}
-
 if (@ARGV) {
     # If you want these run in speed order, just use prove
     if ($^O eq 'MSWin32') {