regrtest.py revision 0ace326ed2ec73dfa515c89ad06fcddd6fafa4ce
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
3908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    largefile - It is okay to run some test that may create huge files.  These
4008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                tests can take a long time and may consume >2GB of disk space
4108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                temporarily.
4208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
4308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    network -   It is okay to run tests that use external network resource,
4408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                e.g. testing SSL support for sockets.
45152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum"""
46152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
47152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport sys
48152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport os
49152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport getopt
509e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossumimport traceback
51ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaroimport random
52ae1bb176bea47b2123bba208733edb42692e9431Fred Drakeimport StringIO
53152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
54152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport test_support
55152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
5608fca5212528e073600c27c70a34eeef445f393bBarry Warsawdef usage(code, msg=''):
5708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    print __doc__
5808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if msg: print msg
5908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    sys.exit(code)
6008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
6108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
62ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanarodef main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
63d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer         exclude=0, single=0, randomize=0, findleaks=0,
6408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw         use_resources=None):
656fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Execute a test suite.
666fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
677e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters    This also parses command-line options and modifies its behavior
68004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    accordingly.
696fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
706fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    tests -- a list of strings containing test names (optional)
716fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- the directory in which to look for tests (optional)
726fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
736fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    Users other than the Python test suite will certainly want to
746fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    specify testdir; if it's omitted, the directory containing the
75004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    Python test suite is searched for.
766fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
776fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    If the tests argument is omitted, the tests listed on the
786fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    command-line will be used.  If that's empty, too, then all *.py
796fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    files beginning with test_ will be used.
80ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro
8108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    The other default arguments (verbose, quiet, generate, exclude, single,
8208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    randomize, findleaks, and use_resources) allow programmers calling main()
83a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw    directly to set the values that would normally be set by flags on the
84a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw    command line.
85a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw
866fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
87004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake
88152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
8908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrlu:',
9008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                                   ['help', 'verbose', 'quiet', 'generate',
9108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                                    'exclude', 'single', 'random',
9208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                                    'findleaks', 'use='])
93152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except getopt.error, msg:
9408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        usage(2, msg)
9508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
9608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    # Defaults
9708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if use_resources is None:
9808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        use_resources = []
99152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for o, a in opts:
10008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        if o in ('-h', '--help'):
10108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            usage(0)
10208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-v', '--verbose'):
10308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose += 1
10408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-q', '--quiet'):
10508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            quiet = 1;
10608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose = 0
10708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-g', '--generate'):
10808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            generate = 1
10908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-x', '--exclude'):
11008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            exclude = 1
11108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-s', '--single'):
11208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            single = 1
11308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-r', '--randomize'):
11408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            randomize = 1
11508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-l', '--findleaks'):
11608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            findleaks = 1
11708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-u', '--use'):
11808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            use_resources = [x.lower() for x in a.split(',')]
11908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            for r in use_resources:
12008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                if r not in ('largefile', 'network'):
12108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                    usage(1, 'Invalid -u/--use option: %s' % a)
122a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum    if generate and verbose:
12308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        usage(2, "-g and -v don't go together!")
12408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
125152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    good = []
126152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    bad = []
127152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    skipped = []
128e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
129d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer    if findleaks:
130a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        try:
131a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw            import gc
132a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        except ImportError:
1338a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            print 'No GC available, disabling findleaks.'
134d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            findleaks = 0
135a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        else:
1368a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # Uncomment the line below to report garbage that is not
1378a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # freeable by reference counting alone.  By default only
1388a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # garbage that is not collectable by the GC is reported.
1398a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            #gc.set_debug(gc.DEBUG_SAVEALL)
140d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            found_garbage = []
141a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw
142e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
143e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        from tempfile import gettempdir
144e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        filename = os.path.join(gettempdir(), 'pynexttest')
145e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        try:
146e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp = open(filename, 'r')
147fc170b1fd5db978f4e8d4c23c138a7b59df681ecEric S. Raymond            next = fp.read().strip()
148e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            tests = [next]
149e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp.close()
150e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        except IOError:
151e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            pass
152a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum    for i in range(len(args)):
15341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        # Strip trailing ".py" from arguments
15441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if args[i][-3:] == '.py':
15541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            args[i] = args[i][:-3]
1566c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    stdtests = STDTESTS[:]
1576c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    nottests = NOTTESTS[:]
158152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if exclude:
1596c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        for arg in args:
1606c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum            if arg in stdtests:
1616c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum                stdtests.remove(arg)
1626c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        nottests[:0] = args
16341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        args = []
164747e1cade657e1e15c0f51d898de901da723e6a2Guido van Rossum    tests = tests or args or findtests(testdir, stdtests, nottests)
165e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
166e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        tests = tests[:1]
167ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro    if randomize:
168ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro        random.shuffle(tests)
16941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum    test_support.verbose = verbose      # Tell tests to be moderately quiet
17008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    test_support.use_resources = use_resources
1715796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum    save_modules = sys.modules.keys()
172152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for test in tests:
17341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if not quiet:
17441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            print test
175f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick        ok = runtest(test, generate, verbose, quiet, testdir)
17641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if ok > 0:
17741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            good.append(test)
17841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        elif ok == 0:
17941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            bad.append(test)
18041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        else:
18141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            skipped.append(test)
182d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer        if findleaks:
183d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            gc.collect()
184d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            if gc.garbage:
1858a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                print "Warning: test created", len(gc.garbage),
1868a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                print "uncollectable object(s)."
1878a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                # move the uncollectable objects somewhere so we don't see
1888a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                # them again
189d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer                found_garbage.extend(gc.garbage)
190d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer                del gc.garbage[:]
1915796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum        # Unload the newly imported modules (best effort finalization)
1925796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum        for module in sys.modules.keys():
19351931144427faa001a6db3cfc37380526be256b6Guido van Rossum            if module not in save_modules and module.startswith("test."):
1945796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum                test_support.unload(module)
195152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if good and not quiet:
19641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if not bad and not skipped and len(good) > 1:
19741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            print "All",
19841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print count(len(good), "test"), "OK."
1991a4d77b2527ced1052b4faae3d176b125a764325Tim Peters        if verbose:
2001a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            print "CAUTION:  stdout isn't compared in verbose mode:  a test"
2011a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            print "that passes in verbose mode may fail without it."
202152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if bad:
203a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(bad), "test"), "failed:"
204a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(bad)
205152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if skipped and not quiet:
206a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(skipped), "test"), "skipped:"
207a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(skipped)
208e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
209b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        e = _ExpectedSkips()
210a2be2d624a47e420266606f0cb2a2e030797f650Tim Peters        plat = sys.platform
211b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        if e.isvalid():
212b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            surprise = _Set(skipped) - e.getexpected()
213b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            if surprise:
214b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print count(len(surprise), "skip"), \
215a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                      "unexpected on", plat + ":"
216a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                printlist(surprise)
217b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            else:
218b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print "Those skips are all expected on", plat + "."
219b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        else:
220b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "Ask someone to teach regrtest.py about which tests are"
221b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "expected to get skipped on", plat + "."
222b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
223e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
224e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        alltests = findtests(testdir, stdtests, nottests)
225e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        for i in range(len(alltests)):
226e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            if tests[0] == alltests[i]:
227e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                if i == len(alltests) - 1:
228e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    os.unlink(filename)
229e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                else:
230e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp = open(filename, 'w')
231e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.write(alltests[i+1] + '\n')
232e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.close()
233e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                break
234e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        else:
235e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            os.unlink(filename)
236e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
23708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    sys.exit(len(bad) > 0)
23808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
239152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
2406fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumSTDTESTS = [
241152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_grammar',
242152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_opcodes',
243152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_operations',
244152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_builtin',
245152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_exceptions',
246152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_types',
247152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum   ]
248152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
2496fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumNOTTESTS = [
250152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_support',
251152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_b1',
252152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_b2',
25362e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future1',
25462e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future2',
2558471a35febdbfbfab51b9d4b5fe51694fe6ca536Jeremy Hylton    'test_future3',
256152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    ]
257152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
2586fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossumdef findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
259152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    """Return a list of all applicable test modules."""
2606fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    if not testdir: testdir = findtestdir()
261152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    names = os.listdir(testdir)
262152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests = []
263152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for name in names:
26441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if name[:5] == "test_" and name[-3:] == ".py":
26541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            modname = name[:-3]
26641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            if modname not in stdtests and modname not in nottests:
26741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                tests.append(modname)
268152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests.sort()
269152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return stdtests + tests
270152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
271f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mickdef runtest(test, generate, verbose, quiet, testdir = None):
2726fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Run a single test.
2736fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    test -- the name of the test
2746fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    generate -- if true, generate output, instead of running the test
2756fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    and comparing it to a previously created output file
2766fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    verbose -- if true, print more messages
277f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick    quiet -- if true, don't print 'skipped' messages (probably redundant)
2786fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- test directory
2796fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
280152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    test_support.unload(test)
2816fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    if not testdir: testdir = findtestdir()
282152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    outputdir = os.path.join(testdir, "output")
283152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    outputfile = os.path.join(outputdir, test)
284152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
28541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if generate:
286e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake            cfp = StringIO.StringIO()
28741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        elif verbose:
28841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            cfp = sys.stdout
28941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        else:
29041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            cfp = Compare(outputfile)
291152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except IOError:
29241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        cfp = None
29341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print "Warning: can't open", outputfile
294152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
29541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        save_stdout = sys.stdout
29641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        try:
29741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            if cfp:
29841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                sys.stdout = cfp
29941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                print test              # Output file starts with test name
300d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            the_module = __import__(test, globals(), locals(), [])
301d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # Most tests run to completion simply as a side-effect of
302d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # being imported.  For the benefit of tests that can't run
303d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # that way (like test_threaded_import), explicitly invoke
304d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # their test_main() function (if it exists).
305d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            indirect_test = getattr(the_module, "test_main", None)
306d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            if indirect_test is not None:
307d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters                indirect_test()
308fff9e2094393dffe89720d59aba9427ca3b18d0bJeremy Hylton            if cfp and not (generate or verbose):
309fff9e2094393dffe89720d59aba9427ca3b18d0bJeremy Hylton                cfp.close()
31041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        finally:
31141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            sys.stdout = save_stdout
3123af826ebca80f8a6c782fb590c77ac210ae9e22dThomas Wouters    except (ImportError, test_support.TestSkipped), msg:
313f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick        if not quiet:
314f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick            print "test", test,
315f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick            print "skipped -- ", msg
31641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return -1
317fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake    except KeyboardInterrupt:
318fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake        raise
319152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except test_support.TestFailed, msg:
32041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print "test", test, "failed --", msg
32141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 0
3229e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossum    except:
32341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        type, value = sys.exc_info()[:2]
32427c4b39025eb9e20f9d7a36b6aa0bb9c97f9bba5Fred Drake        print "test", test, "crashed --", str(type) + ":", value
32541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if verbose:
32641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            traceback.print_exc(file=sys.stdout)
32741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 0
328152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
329e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake        if generate:
330e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake            output = cfp.getvalue()
331e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake            if output == test + "\n":
332e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                if os.path.exists(outputfile):
333e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # Write it since it already exists (and the contents
334e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # may have changed), but let the user know it isn't
335e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # needed:
336e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    fp = open(outputfile, "w")
337e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    fp.write(output)
338e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    fp.close()
339e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    print "output file", outputfile, \
340e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                          "is no longer needed; consider removing it"
341e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                # else:
342e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                #     We don't need it, so don't create it.
343e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake            else:
344e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                fp = open(outputfile, "w")
345e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                fp.write(output)
346e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                fp.close()
34741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 1
348152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
349152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef findtestdir():
350152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if __name__ == '__main__':
35141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = sys.argv[0]
352152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
35341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = __file__
354152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    testdir = os.path.dirname(file) or os.curdir
355152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return testdir
356152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
357152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef count(n, word):
358152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if n == 1:
35941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %s" % (n, word)
360152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
36141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %ss" % (n, word)
362152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
363a45da92484ceececf1cf32b4dfb16004945b001eTim Petersdef printlist(x, width=70, indent=4):
364a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    """Print the elements of a sequence to stdout.
365a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
366a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg width (default 70) is the maximum line length.
367a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg indent (default 4) is the number of blanks with which to
368a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    begin each line.
369a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    """
370a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
371a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    line = ' ' * indent
372a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    for one in map(str, x):
373a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        w = len(line) + len(one)
374a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        if line[-1:] == ' ':
375a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            pad = ''
376a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        else:
377a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            pad = ' '
378a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            w += 1
379a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        if w > width:
380a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            print line
381a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            line = ' ' * indent + one
382a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        else:
383a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            line += pad + one
384a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    if len(line) > indent:
385a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print line
386a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
387152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumclass Compare:
388152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    def __init__(self, filename):
389ae1bb176bea47b2123bba208733edb42692e9431Fred Drake        if os.path.exists(filename):
390ae1bb176bea47b2123bba208733edb42692e9431Fred Drake            self.fp = open(filename, 'r')
391ae1bb176bea47b2123bba208733edb42692e9431Fred Drake        else:
392ae1bb176bea47b2123bba208733edb42692e9431Fred Drake            self.fp = StringIO.StringIO(
393ae1bb176bea47b2123bba208733edb42692e9431Fred Drake                os.path.basename(filename) + "\n")
3941a4d77b2527ced1052b4faae3d176b125a764325Tim Peters        self.stuffthatmatched = []
395152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
396152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    def write(self, data):
39741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        expected = self.fp.read(len(data))
3981a4d77b2527ced1052b4faae3d176b125a764325Tim Peters        if data == expected:
3991a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            self.stuffthatmatched.append(expected)
4001a4d77b2527ced1052b4faae3d176b125a764325Tim Peters        else:
4011a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            # This Compare instance is spoofing stdout, so we need to write
4021a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            # to stderr instead.
4031a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            from sys import stderr as e
4041a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            print >> e, "The actual stdout doesn't match the expected stdout."
4051a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            if self.stuffthatmatched:
4061a4d77b2527ced1052b4faae3d176b125a764325Tim Peters                print >> e, "This much did match (between asterisk lines):"
4071a4d77b2527ced1052b4faae3d176b125a764325Tim Peters                print >> e, "*" * 70
4081a4d77b2527ced1052b4faae3d176b125a764325Tim Peters                good = "".join(self.stuffthatmatched)
4091a4d77b2527ced1052b4faae3d176b125a764325Tim Peters                e.write(good)
4101a4d77b2527ced1052b4faae3d176b125a764325Tim Peters                if not good.endswith("\n"):
4111a4d77b2527ced1052b4faae3d176b125a764325Tim Peters                    e.write("\n")
4121a4d77b2527ced1052b4faae3d176b125a764325Tim Peters                print >> e, "*" * 70
4131a4d77b2527ced1052b4faae3d176b125a764325Tim Peters                print >> e, "Then ..."
4141a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            else:
4151a4d77b2527ced1052b4faae3d176b125a764325Tim Peters                print >> e, "The first write to stdout clashed:"
4161a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            # Note that the prompts are the same length in next two lines.
4171a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            # This is so what we expected and what we got line up.
4181a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            print >> e, "We expected (repr):", `expected`
4191a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            print >> e, "But instead we got:", `data`
4201a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            raise test_support.TestFailed('Writing: ' + `data`+
4211a4d77b2527ced1052b4faae3d176b125a764325Tim Peters                                          ', expected: ' + `expected`)
422152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
423e87ed5f6d4ba0d468e1b8620c9b8e785ed1f31a2Guido van Rossum    def writelines(self, listoflines):
424e87ed5f6d4ba0d468e1b8620c9b8e785ed1f31a2Guido van Rossum        map(self.write, listoflines)
425e87ed5f6d4ba0d468e1b8620c9b8e785ed1f31a2Guido van Rossum
42675fce308bc79ab1f0774e9b3f61031121994e5dfGuido van Rossum    def flush(self):
42741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        pass
42875fce308bc79ab1f0774e9b3f61031121994e5dfGuido van Rossum
429152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    def close(self):
43041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        leftover = self.fp.read()
43141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if leftover:
4321a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            raise test_support.TestFailed('Tail of expected stdout unseen: ' +
4331a4d77b2527ced1052b4faae3d176b125a764325Tim Peters                                          `leftover`)
43441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        self.fp.close()
435152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
436152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    def isatty(self):
43741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 0
438152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
439b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Petersclass _Set:
440b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __init__(self, seq=[]):
441b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = self.data = {}
442b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        for x in seq:
443b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            data[x] = 1
444b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
445b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __len__(self):
446b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return len(self.data)
447b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
448b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __sub__(self, other):
449b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return set of all elements in self not in other."
450b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        result = _Set()
451b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = result.data = self.data.copy()
452b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        for x in other.data:
453b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            if x in data:
454b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                del data[x]
455b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return result
456b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
45739f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton    def __iter__(self):
45839f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton        return iter(self.data)
45939f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton
460b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def tolist(self, sorted=1):
461b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return _Set elements as a list."
462b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = self.data.keys()
463b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        if sorted:
464b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            data.sort()
465b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return data
466b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
467f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum_expectations = {
468f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'win32':
469f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
470f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_al
471f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cd
472f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cl
473f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_commands
474f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_crypt
475f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dbm
476f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
477f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fcntl
478f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fork1
479f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gdbm
480f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gl
481f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_grp
482f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_imgfile
483f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
484f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_linuxaudiodev
485f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_mhlib
486f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_nis
487f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_openpty
488f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_poll
489f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pty
490f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pwd
491f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_signal
49208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        test_socket_ssl
493f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_socketserver
494f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_sunaudiodev
495f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_timing
496f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
497f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'linux2':
498f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
499f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_al
500f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cd
501f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cl
502f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
503f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gl
504f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_imgfile
505f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
506f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_nis
507f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_ntpath
50808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        test_socket_ssl
509f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_socketserver
510f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_sunaudiodev
511f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_unicode_file
512f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_winreg
513f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_winsound
514f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
51549a806edbb298f2a5be3598bd80c21392cb6968dJack Jansen   'mac':
516aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """
517aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_al
518aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_bsddb
519aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_cd
520aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_cl
521aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_commands
522aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_crypt
523aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dbm
524aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dl
525aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fcntl
526aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fork1
527aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_gl
528aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_grp
529aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_imgfile
530aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_largefile
531aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_linuxaudiodev
532aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_locale
533aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_mmap
534aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_nis
535aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_ntpath
536aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_openpty
537aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_poll
538aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_popen2
539aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pty
540aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pwd
541aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_signal
542aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_socket_ssl
543aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_socketserver
544aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_sunaudiodev
545aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_sundry
546aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_timing
547aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_unicode_file
548aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_winreg
549aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_winsound
550aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """,
5510ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis    'unixware5':
5520ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """
5530ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_al
5540ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_bsddb
5550ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_cd
5560ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_cl
5570ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_dl
5580ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_gl
5590ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_imgfile
5600ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_largefile
5610ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_linuxaudiodev
5620ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_minidom
5630ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_nis
5640ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_ntpath
5650ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_openpty
5660ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_pyexpat
5670ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sax
5680ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_socketserver
5690ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sunaudiodev
5700ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sundry
5710ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_unicode_file
5720ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_winreg
5730ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_winsound
5740ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """,
575f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum}
576f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum
577b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Petersclass _ExpectedSkips:
578b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __init__(self):
579b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        self.valid = 0
580f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        if _expectations.has_key(sys.platform):
581f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum            s = _expectations[sys.platform]
582b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            self.expected = _Set(s.split())
583f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum            self.valid = 1
584b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
585b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def isvalid(self):
586b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return true iff _ExpectedSkips knows about the current platform."
587b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.valid
588b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
589b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def getexpected(self):
590b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """Return set of test names we expect to skip on current platform.
591b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
592b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        self.isvalid() must be true.
593b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """
594b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
595b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        assert self.isvalid()
596b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.expected
597b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
598152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumif __name__ == '__main__':
59908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    main()
600