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