From c5000dfc4098f8547461e790a91536a923124261 Mon Sep 17 00:00:00 2001
From: Tim Peters <tim.peters@gmail.com>
Date: Sun, 2 Jun 2002 21:42:01 +0000
Subject: regrtest has a new    -f/--fromfile <filename> option.  This runs all
 and only the tests named in the file, in the order given (although -x may
 weed that list, and -r may shuffle it). Lines starting with '#' are ignored.

This goes a long way toward helping to automate the binary-search-like
procedure I keep reinventing by hand when a test fails due to interaction
among tests (no failure in isolation, and some unknown number of
predecessor tests need to run first -- now you can stick all the test
names in a file, and comment/uncomment blocks of lines until finding a
minimal set of predecessors).
---
 Lib/test/regrtest.py | 41 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index cd2442d..9358d5f 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -14,6 +14,7 @@ Command line options:
 -x: exclude   -- arguments are tests to *exclude*
 -s: single    -- run only a single test (see below)
 -r: random    -- randomize test execution order
+-f: fromfile  -- read names of tests to run from a file (see below)
 -l: findleaks -- if GC is available detect tests that leak memory
 -u: use       -- specify which special resource intensive tests to run
 -h: help      -- print this text and exit
@@ -31,6 +32,11 @@ find the next test to run.  If this file is missing, the first test_*.py file
 in testdir or on the command line is used.  (actually tempfile.gettempdir() is
 used instead of /tmp).
 
+-f reads the names of tests from the file given as f's argument, one or more
+test names per line.  Whitespace is ignored.  Blank lines and lines beginning
+with '#' are ignored.  This is especially useful for whittling down failures
+involving interactions among tests.
+
 -u is used to specify which special resource intensive tests to run, such as
 those requiring large file support or network connectivity.  The argument is a
 comma-separated list of words indicating the resources to test.  Currently
@@ -69,7 +75,7 @@ def usage(code, msg=''):
 
 
 def main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
-         exclude=0, single=0, randomize=0, findleaks=0,
+         exclude=0, single=0, randomize=0, fromfile=None, findleaks=0,
          use_resources=None):
     """Execute a test suite.
 
@@ -96,9 +102,9 @@ def main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
 
     test_support.record_original_stdout(sys.stdout)
     try:
-        opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrlu:',
+        opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:',
                                    ['help', 'verbose', 'quiet', 'generate',
-                                    'exclude', 'single', 'random',
+                                    'exclude', 'single', 'random', 'fromfile',
                                     'findleaks', 'use='])
     except getopt.error, msg:
         usage(2, msg)
@@ -122,6 +128,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
             single = 1
         elif o in ('-r', '--randomize'):
             randomize = 1
+        elif o in ('-f', '--fromfile'):
+            fromfile = a
         elif o in ('-l', '--findleaks'):
             findleaks = 1
         elif o in ('-u', '--use'):
@@ -136,6 +144,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
                     use_resources.append(r)
     if generate and verbose:
         usage(2, "-g and -v don't go together!")
+    if single and fromfile:
+        usage(2, "-s and -f don't go together!")
 
     good = []
     bad = []
@@ -164,10 +174,22 @@ def main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
             fp.close()
         except IOError:
             pass
-    for i in range(len(args)):
-        # Strip trailing ".py" from arguments
-        if args[i][-3:] == os.extsep+'py':
-            args[i] = args[i][:-3]
+
+    if fromfile:
+        tests = []
+        fp = open(fromfile)
+        for line in fp:
+            guts = line.split() # assuming no test has whitespace in its name
+            if guts and not guts[0].startswith('#'):
+                tests.extend(guts)
+        fp.close()
+
+    # Strip .py extensions.
+    if args:
+        args = map(removepy, args)
+    if tests:
+        tests = map(removepy, tests)
+
     stdtests = STDTESTS[:]
     nottests = NOTTESTS[:]
     if exclude:
@@ -418,6 +440,11 @@ def findtestdir():
     testdir = os.path.dirname(file) or os.curdir
     return testdir
 
+def removepy(name):
+    if name.endswith(os.extsep + "py"):
+        name = name[:-3]
+    return name
+
 def count(n, word):
     if n == 1:
         return "%d %s" % (n, word)
-- 
cgit v0.12

