regrtest.py revision d703057752d52cef6082a920879a0b62cdeffaca
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
11a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-v: verbose   -- run tests in verbose mode with output to stdout
12a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-q: quiet     -- don't print anything except if a test fails
13a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-g: generate  -- write the output file for a test instead of comparing it
14a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-x: exclude   -- arguments are tests to *exclude*
15a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-s: single    -- run only a single test (see below)
16a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-r: random    -- randomize test execution order
178a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer-l: findleaks -- if GC is available detect tests that leak memory
1808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw-u: use       -- specify which special resource intensive tests to run
1908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw-h: help      -- print this text and exit
20152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
21152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumIf non-option arguments are present, they are names for tests to run,
22152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumunless -x is given, in which case they are names for tests not to run.
23152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumIf no test names are given, all tests are run.
24f58ed2596706b97c16174a839c1ed6f6b1f87fa6Guido van Rossum
25a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum-v is incompatible with -g and does not compare test output files.
26e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
2722e4182d6065b63532e7af8b14485ce0ab0075dbBarry Warsaw-s means to run only a single test and exit.  This is useful when doing memory
2822e4182d6065b63532e7af8b14485ce0ab0075dbBarry Warsawanalysis on the Python interpreter (which tend to consume to many resources to
2922e4182d6065b63532e7af8b14485ce0ab0075dbBarry Warsawrun the full regression test non-stop).  The file /tmp/pynexttest is read to
3022e4182d6065b63532e7af8b14485ce0ab0075dbBarry Warsawfind the next test to run.  If this file is missing, the first test_*.py file
3122e4182d6065b63532e7af8b14485ce0ab0075dbBarry Warsawin testdir or on the command line is used.  (actually tempfile.gettempdir() is
3222e4182d6065b63532e7af8b14485ce0ab0075dbBarry Warsawused instead of /tmp).
33e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
3408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw-u is used to specify which special resource intensive tests to run, such as
3508fca5212528e073600c27c70a34eeef445f393bBarry Warsawthose requiring large file support or network connectivity.  The argument is a
3608fca5212528e073600c27c70a34eeef445f393bBarry Warsawcomma-separated list of words indicating the resources to test.  Currently
3708fca5212528e073600c27c70a34eeef445f393bBarry Warsawonly the following are defined:
3808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
392158df0b4d8358b5efdcac3024e8cc6d6c92d981Andrew M. Kuchling    curses -    Tests that use curses and will modify the terminal's
402158df0b4d8358b5efdcac3024e8cc6d6c92d981Andrew M. Kuchling                state and output modes.
412158df0b4d8358b5efdcac3024e8cc6d6c92d981Andrew M. Kuchling
4208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    largefile - It is okay to run some test that may create huge files.  These
4308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                tests can take a long time and may consume >2GB of disk space
4408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                temporarily.
4508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
4608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    network -   It is okay to run tests that use external network resource,
4708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                e.g. testing SSL support for sockets.
48152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum"""
49152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
50152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport sys
51152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport os
52152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport getopt
539e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossumimport traceback
54ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaroimport random
55ae1bb176bea47b2123bba208733edb42692e9431Fred Drakeimport StringIO
56152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
57152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport test_support
58152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
5908fca5212528e073600c27c70a34eeef445f393bBarry Warsawdef usage(code, msg=''):
6008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    print __doc__
6108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if msg: print msg
6208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    sys.exit(code)
6308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
6408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
65ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanarodef main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
66d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer         exclude=0, single=0, randomize=0, findleaks=0,
6708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw         use_resources=None):
686fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Execute a test suite.
696fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
707e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters    This also parses command-line options and modifies its behavior
71004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    accordingly.
726fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
736fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    tests -- a list of strings containing test names (optional)
746fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- the directory in which to look for tests (optional)
756fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
766fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    Users other than the Python test suite will certainly want to
776fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    specify testdir; if it's omitted, the directory containing the
78004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    Python test suite is searched for.
796fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
806fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    If the tests argument is omitted, the tests listed on the
816fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    command-line will be used.  If that's empty, too, then all *.py
826fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    files beginning with test_ will be used.
83ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro
8408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    The other default arguments (verbose, quiet, generate, exclude, single,
8508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    randomize, findleaks, and use_resources) allow programmers calling main()
86a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw    directly to set the values that would normally be set by flags on the
87a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw    command line.
88a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw
896fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
90004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake
918dee809410e2d433bb0be5d8a1699736b90db0b5Tim Peters    test_support.record_original_stdout(sys.stdout)
92152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
9308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrlu:',
9408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                                   ['help', 'verbose', 'quiet', 'generate',
9508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                                    'exclude', 'single', 'random',
9608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                                    'findleaks', 'use='])
97152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except getopt.error, msg:
9808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        usage(2, msg)
9908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
10008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    # Defaults
10108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if use_resources is None:
10208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        use_resources = []
103152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for o, a in opts:
10408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        if o in ('-h', '--help'):
10508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            usage(0)
10608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-v', '--verbose'):
10708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose += 1
10808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-q', '--quiet'):
10908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            quiet = 1;
11008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose = 0
11108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-g', '--generate'):
11208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            generate = 1
11308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-x', '--exclude'):
11408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            exclude = 1
11508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-s', '--single'):
11608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            single = 1
11708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-r', '--randomize'):
11808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            randomize = 1
11908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-l', '--findleaks'):
12008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            findleaks = 1
12108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-u', '--use'):
122fe3f6969f54cfd3df24f54572a809e0deb47064fGuido van Rossum            u = [x.lower() for x in a.split(',')]
123fe3f6969f54cfd3df24f54572a809e0deb47064fGuido van Rossum            for r in u:
1242158df0b4d8358b5efdcac3024e8cc6d6c92d981Andrew M. Kuchling                if r not in ('curses', 'largefile', 'network'):
12508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                    usage(1, 'Invalid -u/--use option: %s' % a)
126fe3f6969f54cfd3df24f54572a809e0deb47064fGuido van Rossum            use_resources.extend(u)
127a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum    if generate and verbose:
12808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        usage(2, "-g and -v don't go together!")
12908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
130152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    good = []
131152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    bad = []
132152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    skipped = []
133e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
134d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer    if findleaks:
135a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        try:
136a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw            import gc
137a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        except ImportError:
1388a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            print 'No GC available, disabling findleaks.'
139d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            findleaks = 0
140a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        else:
1418a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # Uncomment the line below to report garbage that is not
1428a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # freeable by reference counting alone.  By default only
1438a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # garbage that is not collectable by the GC is reported.
1448a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            #gc.set_debug(gc.DEBUG_SAVEALL)
145d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            found_garbage = []
146a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw
147e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
148e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        from tempfile import gettempdir
149e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        filename = os.path.join(gettempdir(), 'pynexttest')
150e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        try:
151e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp = open(filename, 'r')
152fc170b1fd5db978f4e8d4c23c138a7b59df681ecEric S. Raymond            next = fp.read().strip()
153e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            tests = [next]
154e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp.close()
155e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        except IOError:
156e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            pass
157a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum    for i in range(len(args)):
15841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        # Strip trailing ".py" from arguments
15941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if args[i][-3:] == '.py':
16041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            args[i] = args[i][:-3]
1616c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    stdtests = STDTESTS[:]
1626c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    nottests = NOTTESTS[:]
163152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if exclude:
1646c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        for arg in args:
1656c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum            if arg in stdtests:
1666c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum                stdtests.remove(arg)
1676c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        nottests[:0] = args
16841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        args = []
169747e1cade657e1e15c0f51d898de901da723e6a2Guido van Rossum    tests = tests or args or findtests(testdir, stdtests, nottests)
170e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
171e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        tests = tests[:1]
172ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro    if randomize:
173ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro        random.shuffle(tests)
17441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum    test_support.verbose = verbose      # Tell tests to be moderately quiet
17508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    test_support.use_resources = use_resources
1765796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum    save_modules = sys.modules.keys()
177152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for test in tests:
17841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if not quiet:
17941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            print test
180f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick        ok = runtest(test, generate, verbose, quiet, testdir)
18141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if ok > 0:
18241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            good.append(test)
18341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        elif ok == 0:
18441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            bad.append(test)
18541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        else:
18641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            skipped.append(test)
187d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer        if findleaks:
188d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            gc.collect()
189d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            if gc.garbage:
1908a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                print "Warning: test created", len(gc.garbage),
1918a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                print "uncollectable object(s)."
1928a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                # move the uncollectable objects somewhere so we don't see
1938a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                # them again
194d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer                found_garbage.extend(gc.garbage)
195d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer                del gc.garbage[:]
1965796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum        # Unload the newly imported modules (best effort finalization)
1975796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum        for module in sys.modules.keys():
19851931144427faa001a6db3cfc37380526be256b6Guido van Rossum            if module not in save_modules and module.startswith("test."):
1995796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum                test_support.unload(module)
2007a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton
2017a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    # The lists won't be sorted if running with -r
2027a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    good.sort()
2037a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    bad.sort()
2047a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    skipped.sort()
205e0c446bb4ad67294f42d4cb53b4ff28413bd8ddeTim Peters
206152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if good and not quiet:
20741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if not bad and not skipped and len(good) > 1:
20841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            print "All",
20941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print count(len(good), "test"), "OK."
2101a4d77b2527ced1052b4faae3d176b125a764325Tim Peters        if verbose:
2111a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            print "CAUTION:  stdout isn't compared in verbose mode:  a test"
2121a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            print "that passes in verbose mode may fail without it."
213152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if bad:
214a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(bad), "test"), "failed:"
215a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(bad)
216152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if skipped and not quiet:
217a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(skipped), "test"), "skipped:"
218a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(skipped)
219e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
220b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        e = _ExpectedSkips()
221a2be2d624a47e420266606f0cb2a2e030797f650Tim Peters        plat = sys.platform
222b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        if e.isvalid():
223b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            surprise = _Set(skipped) - e.getexpected()
224b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            if surprise:
225b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print count(len(surprise), "skip"), \
226a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                      "unexpected on", plat + ":"
227a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                printlist(surprise)
228b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            else:
229b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print "Those skips are all expected on", plat + "."
230b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        else:
231b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "Ask someone to teach regrtest.py about which tests are"
232b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "expected to get skipped on", plat + "."
233b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
234e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
235e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        alltests = findtests(testdir, stdtests, nottests)
236e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        for i in range(len(alltests)):
237e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            if tests[0] == alltests[i]:
238e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                if i == len(alltests) - 1:
239e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    os.unlink(filename)
240e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                else:
241e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp = open(filename, 'w')
242e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.write(alltests[i+1] + '\n')
243e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.close()
244e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                break
245e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        else:
246e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            os.unlink(filename)
247e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
24808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    sys.exit(len(bad) > 0)
24908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
250152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
2516fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumSTDTESTS = [
252152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_grammar',
253152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_opcodes',
254152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_operations',
255152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_builtin',
256152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_exceptions',
257152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_types',
258152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum   ]
259152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
2606fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumNOTTESTS = [
261152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_support',
262152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_b1',
263152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_b2',
26462e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future1',
26562e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future2',
2668471a35febdbfbfab51b9d4b5fe51694fe6ca536Jeremy Hylton    'test_future3',
267152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    ]
268152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
2696fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossumdef findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
270152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    """Return a list of all applicable test modules."""
2716fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    if not testdir: testdir = findtestdir()
272152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    names = os.listdir(testdir)
273152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests = []
274152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for name in names:
27541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if name[:5] == "test_" and name[-3:] == ".py":
27641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            modname = name[:-3]
27741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            if modname not in stdtests and modname not in nottests:
27841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                tests.append(modname)
279152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests.sort()
280152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return stdtests + tests
281152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
282f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mickdef runtest(test, generate, verbose, quiet, testdir = None):
2836fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Run a single test.
2846fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    test -- the name of the test
2856fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    generate -- if true, generate output, instead of running the test
2866fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    and comparing it to a previously created output file
2876fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    verbose -- if true, print more messages
288f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick    quiet -- if true, don't print 'skipped' messages (probably redundant)
2896fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- test directory
2906fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
291152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    test_support.unload(test)
2926fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    if not testdir: testdir = findtestdir()
293152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    outputdir = os.path.join(testdir, "output")
294152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    outputfile = os.path.join(outputdir, test)
2959390cc15da5cd6920bd41bb4cd146d5d0601345fTim Peters    if verbose:
29641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        cfp = None
2970fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    else:
29888a56857f65d98e9d2b670eab6e048bda519340aFred Drake        cfp = StringIO.StringIO()
299152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
300342ca75d9552ff5c606c465d1392a32e44257fe5Tim Peters        save_stdout = sys.stdout
30141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        try:
30241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            if cfp:
30341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                sys.stdout = cfp
30441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                print test              # Output file starts with test name
305d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            the_module = __import__(test, globals(), locals(), [])
306d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # Most tests run to completion simply as a side-effect of
307d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # being imported.  For the benefit of tests that can't run
308d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # that way (like test_threaded_import), explicitly invoke
309d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # their test_main() function (if it exists).
310d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            indirect_test = getattr(the_module, "test_main", None)
311d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            if indirect_test is not None:
312d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters                indirect_test()
31341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        finally:
314342ca75d9552ff5c606c465d1392a32e44257fe5Tim Peters            sys.stdout = save_stdout
3153af826ebca80f8a6c782fb590c77ac210ae9e22dThomas Wouters    except (ImportError, test_support.TestSkipped), msg:
316f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick        if not quiet:
317eb9490526508dc643c2329771f95a925e5412049Guido van Rossum            print "test", test, "skipped --", msg
31841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return -1
319fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake    except KeyboardInterrupt:
320fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake        raise
321152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except test_support.TestFailed, msg:
32241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print "test", test, "failed --", msg
32341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 0
3249e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossum    except:
32541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        type, value = sys.exc_info()[:2]
32627c4b39025eb9e20f9d7a36b6aa0bb9c97f9bba5Fred Drake        print "test", test, "crashed --", str(type) + ":", value
32741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if verbose:
32841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            traceback.print_exc(file=sys.stdout)
32941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 0
330152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
3310fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if not cfp:
3320fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
3330fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        output = cfp.getvalue()
334e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake        if generate:
335e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake            if output == test + "\n":
336e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                if os.path.exists(outputfile):
337e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # Write it since it already exists (and the contents
338e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # may have changed), but let the user know it isn't
339e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # needed:
340e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    print "output file", outputfile, \
341e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                          "is no longer needed; consider removing it"
3420fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                else:
3430fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                    # We don't need it, so don't create it.
3440fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                    return 1
3450fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp = open(outputfile, "w")
3460fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.write(output)
3470fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.close()
3480fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
3490fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if os.path.exists(outputfile):
3500fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp = open(outputfile, "r")
3510fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            expected = fp.read()
3520fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.close()
3530fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        else:
3540fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            expected = test + "\n"
3550fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if output == expected:
3560fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
3570fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        print "test", test, "produced unexpected output:"
3580fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        reportdiff(expected, output)
3590fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        return 0
3600fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum
3610fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossumdef reportdiff(expected, output):
3620fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    import difflib
363c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    print "*" * 70
364c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    a = expected.splitlines(1)
365c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    b = output.splitlines(1)
366cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    sm = difflib.SequenceMatcher(a=a, b=b)
367cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    tuples = sm.get_opcodes()
368c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
369cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    def pair(x0, x1):
370c377b16d12ba325bb108eca575447d66f19294c0Tim Peters        # x0:x1 are 0-based slice indices; convert to 1-based line indices.
371cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        x0 += 1
372cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        if x0 >= x1:
373c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            return "line " + str(x0)
374cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        else:
375c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            return "lines %d-%d" % (x0, x1)
376c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
377cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    for op, a0, a1, b0, b1 in tuples:
378cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        if op == 'equal':
379cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            pass
380c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
381cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'delete':
382c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "***", pair(a0, a1), "of expected output missing:"
383cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            for line in a[a0:a1]:
384c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print "-", line,
385c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
386cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'replace':
387c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "*** mismatch between", pair(a0, a1), "of expected", \
388c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                  "output and", pair(b0, b1), "of actual output:"
389c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            for line in difflib.ndiff(a[a0:a1], b[b0:b1]):
390c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print line,
391c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
392cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'insert':
393c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "***", pair(b0, b1), "of actual output doesn't appear", \
394c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                  "in expected output after line", str(a1)+":"
395cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            for line in b[b0:b1]:
396c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print "+", line,
397c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
398cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        else:
399cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            print "get_opcodes() returned bad tuple?!?!", (op, a0, a1, b0, b1)
400c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
4010fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    print "*" * 70
402152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
403152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef findtestdir():
404152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if __name__ == '__main__':
40541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = sys.argv[0]
406152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
40741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = __file__
408152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    testdir = os.path.dirname(file) or os.curdir
409152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return testdir
410152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
411152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef count(n, word):
412152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if n == 1:
41341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %s" % (n, word)
414152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
41541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %ss" % (n, word)
416152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
417a45da92484ceececf1cf32b4dfb16004945b001eTim Petersdef printlist(x, width=70, indent=4):
418a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    """Print the elements of a sequence to stdout.
419a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
420a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg width (default 70) is the maximum line length.
421a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg indent (default 4) is the number of blanks with which to
422a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    begin each line.
423a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    """
424a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
425a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    line = ' ' * indent
426a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    for one in map(str, x):
427a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        w = len(line) + len(one)
428a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        if line[-1:] == ' ':
429a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            pad = ''
430a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        else:
431a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            pad = ' '
432a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            w += 1
433a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        if w > width:
434a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            print line
435a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            line = ' ' * indent + one
436a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        else:
437a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            line += pad + one
438a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    if len(line) > indent:
439a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print line
440a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
441b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Petersclass _Set:
442b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __init__(self, seq=[]):
443b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = self.data = {}
444b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        for x in seq:
445b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            data[x] = 1
446b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
447b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __len__(self):
448b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return len(self.data)
449b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
450b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __sub__(self, other):
451b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return set of all elements in self not in other."
452b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        result = _Set()
453b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = result.data = self.data.copy()
454b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        for x in other.data:
455b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            if x in data:
456b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                del data[x]
457b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return result
458b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
45939f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton    def __iter__(self):
46039f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton        return iter(self.data)
46139f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton
462b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def tolist(self, sorted=1):
463b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return _Set elements as a list."
464b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = self.data.keys()
465b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        if sorted:
466b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            data.sort()
467b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return data
468b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
469f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum_expectations = {
470f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'win32':
471f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
472f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_al
473f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cd
474f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cl
475f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_commands
476f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_crypt
477d703057752d52cef6082a920879a0b62cdeffacaTim Peters        test_curses
478f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dbm
479f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
480f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fcntl
481f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fork1
482f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gdbm
483f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gl
484f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_grp
485f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_imgfile
486f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
487f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_linuxaudiodev
488f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_mhlib
489f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_nis
490f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_openpty
491f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_poll
492f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pty
493f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pwd
494f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_signal
49508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        test_socket_ssl
496a86f0c17a1385c07710d894b93a1c13159c0b57fTim Peters        test_socketserver
497f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_sunaudiodev
498f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_timing
499f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
500f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'linux2':
501f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
502f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_al
503f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cd
504f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cl
505f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
506f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gl
507f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_imgfile
508f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
509f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_nis
510f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_ntpath
51108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        test_socket_ssl
512f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_socketserver
513f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_sunaudiodev
514f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_unicode_file
515f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_winreg
516f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_winsound
517f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
51849a806edbb298f2a5be3598bd80c21392cb6968dJack Jansen   'mac':
519aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """
520aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_al
521aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_bsddb
522aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_cd
523aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_cl
524aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_commands
525aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_crypt
526aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dbm
527aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dl
528aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fcntl
529aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fork1
530aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_gl
531aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_grp
532aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_imgfile
533aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_largefile
534aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_linuxaudiodev
535aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_locale
536aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_mmap
537aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_nis
538aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_ntpath
539aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_openpty
540aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_poll
541aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_popen2
542aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pty
543aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pwd
544aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_signal
545aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_socket_ssl
546aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_socketserver
547aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_sunaudiodev
548aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_sundry
549aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_timing
550aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_unicode_file
551aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_winreg
552aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_winsound
553aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """,
5540ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis    'unixware5':
5550ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """
5560ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_al
5570ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_bsddb
5580ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_cd
5590ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_cl
5600ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_dl
5610ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_gl
5620ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_imgfile
5630ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_largefile
5640ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_linuxaudiodev
5650ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_minidom
5660ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_nis
5670ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_ntpath
5680ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_openpty
5690ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_pyexpat
5700ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sax
5710ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_socketserver
5720ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sunaudiodev
5730ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sundry
5740ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_unicode_file
5750ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_winreg
5760ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_winsound
5770ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """,
578f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum}
579f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum
580b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Petersclass _ExpectedSkips:
581b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __init__(self):
582b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        self.valid = 0
583f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        if _expectations.has_key(sys.platform):
584f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum            s = _expectations[sys.platform]
585b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            self.expected = _Set(s.split())
586f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum            self.valid = 1
587b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
588b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def isvalid(self):
589b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return true iff _ExpectedSkips knows about the current platform."
590b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.valid
591b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
592b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def getexpected(self):
593b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """Return set of test names we expect to skip on current platform.
594b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
595b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        self.isvalid() must be true.
596b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """
597b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
598b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        assert self.isvalid()
599b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.expected
600b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
601152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumif __name__ == '__main__':
60208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    main()
603