regrtest.py revision 7e47402264cf87b9bbb61fc9ff610af08add7c7b
1152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum#! /usr/bin/env python 2152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 3152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum"""Regression test. 4152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 5152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumThis will find all modules whose name is "test_*" in the test 6152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdirectory, and run them. Various command line options provide 7152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumadditional facilities. 8152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 9152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumCommand line options: 10152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 11e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw-v: verbose -- run tests in verbose mode with output to stdout 12e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw-q: quiet -- don't print anything except if a test fails 13152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum-g: generate -- write the output file for a test instead of comparing it 14e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw-x: exclude -- arguments are tests to *exclude* 15e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw-s: single -- run only a single test (see below) 16ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro-r: random -- randomize test execution order 17152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 18152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumIf non-option arguments are present, they are names for tests to run, 19152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumunless -x is given, in which case they are names for tests not to run. 20152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumIf no test names are given, all tests are run. 21f58ed2596706b97c16174a839c1ed6f6b1f87fa6Guido van Rossum 22a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum-v is incompatible with -g and does not compare test output files. 23e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw 24e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw-s means to run only a single test and exit. This is useful when Purifying 25e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsawthe Python interpreter. The file /tmp/pynexttest is read to find the next 26e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsawtest to run. If this file is missing, the first test_*.py file in testdir or 27e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsawon the command line is used. (actually tempfile.gettempdir() is used instead 28e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsawof /tmp). 29e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw 30152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum""" 31152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 32152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport sys 33152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport string 34152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport os 35152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport getopt 369e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossumimport traceback 37ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaroimport random 38152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 39152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport test_support 40152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 41ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanarodef main(tests=None, testdir=None, verbose=0, quiet=0, generate=0, 42ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro exclude=0, single=0, randomize=0): 436fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum """Execute a test suite. 446fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum 457e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters This also parses command-line options and modifies its behavior 466fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum accordingly. 476fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum 486fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum tests -- a list of strings containing test names (optional) 496fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum testdir -- the directory in which to look for tests (optional) 506fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum 516fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum Users other than the Python test suite will certainly want to 526fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum specify testdir; if it's omitted, the directory containing the 536fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum Python test suite is searched for. 546fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum 556fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum If the tests argument is omitted, the tests listed on the 566fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum command-line will be used. If that's empty, too, then all *.py 576fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum files beginning with test_ will be used. 58ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro 59ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro The other six default arguments (verbose, quiet, generate, exclude, 60ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro single, and randomize) allow programmers calling main() directly to 61ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro set the values that would normally be set by flags on the command 62ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro line. 636fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum """ 646fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum 65152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum try: 66ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro opts, args = getopt.getopt(sys.argv[1:], 'vgqxsr') 67152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum except getopt.error, msg: 6841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print msg 6941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print __doc__ 7041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum return 2 71152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum for o, a in opts: 7241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if o == '-v': verbose = verbose+1 7341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if o == '-q': quiet = 1; verbose = 0 7441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if o == '-g': generate = 1 7541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if o == '-x': exclude = 1 76e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw if o == '-s': single = 1 77ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro if o == '-r': randomize = 1 78a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum if generate and verbose: 7941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print "-g and -v don't go together!" 8041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum return 2 81152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum good = [] 82152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum bad = [] 83152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum skipped = [] 84e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw 85e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw if single: 86e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw from tempfile import gettempdir 87e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw filename = os.path.join(gettempdir(), 'pynexttest') 88e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw try: 89e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw fp = open(filename, 'r') 90e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw next = string.strip(fp.read()) 91e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw tests = [next] 92e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw fp.close() 93e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw except IOError: 94e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw pass 95a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum for i in range(len(args)): 9641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum # Strip trailing ".py" from arguments 9741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if args[i][-3:] == '.py': 9841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum args[i] = args[i][:-3] 996c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum stdtests = STDTESTS[:] 1006c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum nottests = NOTTESTS[:] 101152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum if exclude: 1026c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum for arg in args: 1036c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum if arg in stdtests: 1046c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum stdtests.remove(arg) 1056c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum nottests[:0] = args 10641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum args = [] 107747e1cade657e1e15c0f51d898de901da723e6a2Guido van Rossum tests = tests or args or findtests(testdir, stdtests, nottests) 108e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw if single: 109e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw tests = tests[:1] 110ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro if randomize: 111ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro random.shuffle(tests) 11241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum test_support.verbose = verbose # Tell tests to be moderately quiet 1135796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum save_modules = sys.modules.keys() 114152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum for test in tests: 11541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if not quiet: 11641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print test 1176fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum ok = runtest(test, generate, verbose, testdir) 11841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if ok > 0: 11941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum good.append(test) 12041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum elif ok == 0: 12141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum bad.append(test) 12241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum else: 12341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if not quiet: 12441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print "test", test, 12541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print "skipped -- an optional feature could not be imported" 12641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum skipped.append(test) 1275796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum # Unload the newly imported modules (best effort finalization) 1285796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum for module in sys.modules.keys(): 12951931144427faa001a6db3cfc37380526be256b6Guido van Rossum if module not in save_modules and module.startswith("test."): 1305796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum test_support.unload(module) 131152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum if good and not quiet: 13241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if not bad and not skipped and len(good) > 1: 13341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print "All", 13441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print count(len(good), "test"), "OK." 135152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum if bad: 13641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print count(len(bad), "test"), "failed:", 13741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print string.join(bad) 138152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum if skipped and not quiet: 13941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print count(len(skipped), "test"), "skipped:", 14041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print string.join(skipped) 141e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw 142e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw if single: 143e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw alltests = findtests(testdir, stdtests, nottests) 144e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw for i in range(len(alltests)): 145e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw if tests[0] == alltests[i]: 146e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw if i == len(alltests) - 1: 147e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw os.unlink(filename) 148e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw else: 149e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw fp = open(filename, 'w') 150e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw fp.write(alltests[i+1] + '\n') 151e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw fp.close() 152e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw break 153e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw else: 154e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw os.unlink(filename) 155e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw 156e83870131b87ea6b343e71d9dc48e7702dce128fGuido van Rossum return len(bad) > 0 157152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 1586fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumSTDTESTS = [ 159152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 'test_grammar', 160152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 'test_opcodes', 161152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 'test_operations', 162152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 'test_builtin', 163152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 'test_exceptions', 164152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 'test_types', 165152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum ] 166152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 1676fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumNOTTESTS = [ 168152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 'test_support', 169152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 'test_b1', 170152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 'test_b2', 171152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum ] 172152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 1736fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossumdef findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS): 174152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum """Return a list of all applicable test modules.""" 1756fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum if not testdir: testdir = findtestdir() 176152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum names = os.listdir(testdir) 177152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum tests = [] 178152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum for name in names: 17941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if name[:5] == "test_" and name[-3:] == ".py": 18041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum modname = name[:-3] 18141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if modname not in stdtests and modname not in nottests: 18241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum tests.append(modname) 183152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum tests.sort() 184152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum return stdtests + tests 185152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 1866fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossumdef runtest(test, generate, verbose, testdir = None): 1876fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum """Run a single test. 1886fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum test -- the name of the test 1896fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum generate -- if true, generate output, instead of running the test 1906fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum and comparing it to a previously created output file 1916fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum verbose -- if true, print more messages 1926fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum testdir -- test directory 1936fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum """ 194152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum test_support.unload(test) 1956fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum if not testdir: testdir = findtestdir() 196152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum outputdir = os.path.join(testdir, "output") 197152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum outputfile = os.path.join(outputdir, test) 198152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum try: 19941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if generate: 20041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum cfp = open(outputfile, "w") 20141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum elif verbose: 20241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum cfp = sys.stdout 20341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum else: 20441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum cfp = Compare(outputfile) 205152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum except IOError: 20641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum cfp = None 20741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print "Warning: can't open", outputfile 208152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum try: 20941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum save_stdout = sys.stdout 21041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum try: 21141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if cfp: 21241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum sys.stdout = cfp 21341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print test # Output file starts with test name 21441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum __import__(test, globals(), locals(), []) 215fff9e2094393dffe89720d59aba9427ca3b18d0bJeremy Hylton if cfp and not (generate or verbose): 216fff9e2094393dffe89720d59aba9427ca3b18d0bJeremy Hylton cfp.close() 21741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum finally: 21841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum sys.stdout = save_stdout 219152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum except ImportError, msg: 22041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum return -1 2214e8ef5fcd3e44b848710beac4e9211d4892bdf0fGuido van Rossum except KeyboardInterrupt, v: 22241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum raise KeyboardInterrupt, v, sys.exc_info()[2] 223152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum except test_support.TestFailed, msg: 22441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print "test", test, "failed --", msg 22541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum return 0 2269e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossum except: 22741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum type, value = sys.exc_info()[:2] 22841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum print "test", test, "crashed --", type, ":", value 22941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if verbose: 23041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum traceback.print_exc(file=sys.stdout) 23141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum return 0 232152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum else: 23341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum return 1 234152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 235152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef findtestdir(): 236152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum if __name__ == '__main__': 23741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum file = sys.argv[0] 238152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum else: 23941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum file = __file__ 240152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum testdir = os.path.dirname(file) or os.curdir 241152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum return testdir 242152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 243152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef count(n, word): 244152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum if n == 1: 24541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum return "%d %s" % (n, word) 246152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum else: 24741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum return "%d %ss" % (n, word) 248152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 249152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumclass Compare: 250152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 251152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum def __init__(self, filename): 25241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum self.fp = open(filename, 'r') 253152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 254152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum def write(self, data): 25541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum expected = self.fp.read(len(data)) 25641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if data <> expected: 25741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum raise test_support.TestFailed, \ 25841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum 'Writing: '+`data`+', expected: '+`expected` 259152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 260e87ed5f6d4ba0d468e1b8620c9b8e785ed1f31a2Guido van Rossum def writelines(self, listoflines): 261e87ed5f6d4ba0d468e1b8620c9b8e785ed1f31a2Guido van Rossum map(self.write, listoflines) 262e87ed5f6d4ba0d468e1b8620c9b8e785ed1f31a2Guido van Rossum 26375fce308bc79ab1f0774e9b3f61031121994e5dfGuido van Rossum def flush(self): 26441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum pass 26575fce308bc79ab1f0774e9b3f61031121994e5dfGuido van Rossum 266152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum def close(self): 26741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum leftover = self.fp.read() 26841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum if leftover: 26941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum raise test_support.TestFailed, 'Unread: '+`leftover` 27041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum self.fp.close() 271152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 272152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum def isatty(self): 27341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum return 0 274152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum 275152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumif __name__ == '__main__': 276e83870131b87ea6b343e71d9dc48e7702dce128fGuido van Rossum sys.exit(main()) 277