blob: ce5e22d97a5ab7be4039c6d0f75bf60ce251af0a [file] [log] [blame]
Guido van Rossum152494a1996-12-20 03:12:20 +00001#! /usr/bin/env python
2
3"""Regression test.
4
5This will find all modules whose name is "test_*" in the test
6directory, and run them. Various command line options provide
7additional facilities.
8
9Command line options:
10
Guido van Rossuma4122201997-08-18 20:08:24 +000011-v: verbose -- run tests in verbose mode with output to stdout
Guido van Rossum152494a1996-12-20 03:12:20 +000012-q: quiet -- don't print anything except if a test fails
13-g: generate -- write the output file for a test instead of comparing it
14-x: exclude -- arguments are tests to *exclude*
15
16If non-option arguments are present, they are names for tests to run,
17unless -x is given, in which case they are names for tests not to run.
18If no test names are given, all tests are run.
Guido van Rossumf58ed251997-03-07 21:04:33 +000019
Guido van Rossuma4122201997-08-18 20:08:24 +000020-v is incompatible with -g and does not compare test output files.
Guido van Rossum152494a1996-12-20 03:12:20 +000021"""
22
23import sys
24import string
25import os
26import getopt
Guido van Rossum9e48b271997-07-16 01:56:13 +000027import traceback
Guido van Rossum152494a1996-12-20 03:12:20 +000028
29import test_support
30
31def main():
32 try:
33 opts, args = getopt.getopt(sys.argv[1:], 'vgqx')
34 except getopt.error, msg:
35 print msg
36 print __doc__
Guido van Rossume8387011997-08-14 19:40:34 +000037 return 2
Guido van Rossum152494a1996-12-20 03:12:20 +000038 verbose = 0
39 quiet = 0
40 generate = 0
41 exclude = 0
42 for o, a in opts:
Guido van Rossumf58ed251997-03-07 21:04:33 +000043 if o == '-v': verbose = verbose+1
Guido van Rossuma4122201997-08-18 20:08:24 +000044 if o == '-q': quiet = 1; verbose = 0
Guido van Rossum152494a1996-12-20 03:12:20 +000045 if o == '-g': generate = 1
46 if o == '-x': exclude = 1
Guido van Rossuma4122201997-08-18 20:08:24 +000047 if generate and verbose:
48 print "-g and -v don't go together!"
Guido van Rossume8387011997-08-14 19:40:34 +000049 return 2
Guido van Rossum152494a1996-12-20 03:12:20 +000050 good = []
51 bad = []
52 skipped = []
Guido van Rossuma4122201997-08-18 20:08:24 +000053 for i in range(len(args)):
54 # Strip trailing ".py" from arguments
55 if args[i][-3:] == '.py':
56 args[i] = args[i][:-3]
Guido van Rossum152494a1996-12-20 03:12:20 +000057 if exclude:
58 nottests[:0] = args
59 args = []
60 tests = args or findtests()
Guido van Rossuma4122201997-08-18 20:08:24 +000061 test_support.verbose = verbose # Tell tests to be moderately quiet
Guido van Rossum152494a1996-12-20 03:12:20 +000062 for test in tests:
Guido van Rossuma4122201997-08-18 20:08:24 +000063 if not quiet:
Guido van Rossum152494a1996-12-20 03:12:20 +000064 print test
Guido van Rossuma4122201997-08-18 20:08:24 +000065 ok = runtest(test, generate, verbose)
Guido van Rossum152494a1996-12-20 03:12:20 +000066 if ok > 0:
67 good.append(test)
68 elif ok == 0:
69 bad.append(test)
70 else:
71 if not quiet:
72 print "test", test,
73 print "skipped -- an optional feature could not be imported"
74 skipped.append(test)
75 if good and not quiet:
76 if not bad and not skipped and len(good) > 1:
77 print "All",
78 print count(len(good), "test"), "OK."
79 if bad:
80 print count(len(bad), "test"), "failed:",
81 print string.join(bad)
82 if skipped and not quiet:
83 print count(len(skipped), "test"), "skipped:",
84 print string.join(skipped)
Guido van Rossume8387011997-08-14 19:40:34 +000085 return len(bad) > 0
Guido van Rossum152494a1996-12-20 03:12:20 +000086
87stdtests = [
88 'test_grammar',
89 'test_opcodes',
90 'test_operations',
91 'test_builtin',
92 'test_exceptions',
93 'test_types',
94 ]
95
96nottests = [
97 'test_support',
98 'test_b1',
99 'test_b2',
100 ]
101
102def findtests():
103 """Return a list of all applicable test modules."""
104 testdir = findtestdir()
105 names = os.listdir(testdir)
106 tests = []
107 for name in names:
108 if name[:5] == "test_" and name[-3:] == ".py":
109 modname = name[:-3]
110 if modname not in stdtests and modname not in nottests:
111 tests.append(modname)
112 tests.sort()
113 return stdtests + tests
114
Guido van Rossuma4122201997-08-18 20:08:24 +0000115def runtest(test, generate, verbose):
Guido van Rossum152494a1996-12-20 03:12:20 +0000116 test_support.unload(test)
117 testdir = findtestdir()
118 outputdir = os.path.join(testdir, "output")
119 outputfile = os.path.join(outputdir, test)
120 try:
121 if generate:
122 cfp = open(outputfile, "w")
Guido van Rossuma4122201997-08-18 20:08:24 +0000123 elif verbose:
Guido van Rossumf58ed251997-03-07 21:04:33 +0000124 cfp = sys.stdout
Guido van Rossum152494a1996-12-20 03:12:20 +0000125 else:
126 cfp = Compare(outputfile)
127 except IOError:
128 cfp = None
129 print "Warning: can't open", outputfile
130 try:
131 save_stdout = sys.stdout
132 try:
133 if cfp:
134 sys.stdout = cfp
135 print test # Output file starts with test name
136 __import__(test)
137 finally:
138 sys.stdout = save_stdout
139 except ImportError, msg:
140 return -1
141 except test_support.TestFailed, msg:
142 print "test", test, "failed --", msg
143 return 0
Guido van Rossum9e48b271997-07-16 01:56:13 +0000144 except:
145 print "test", test, "crashed --", sys.exc_type, ":", sys.exc_value
Guido van Rossuma4122201997-08-18 20:08:24 +0000146 if verbose:
Guido van Rossum9e48b271997-07-16 01:56:13 +0000147 traceback.print_exc(file=sys.stdout)
148 return 0
Guido van Rossum152494a1996-12-20 03:12:20 +0000149 else:
150 return 1
151
152def findtestdir():
153 if __name__ == '__main__':
154 file = sys.argv[0]
155 else:
156 file = __file__
157 testdir = os.path.dirname(file) or os.curdir
158 return testdir
159
160def count(n, word):
161 if n == 1:
162 return "%d %s" % (n, word)
163 else:
164 return "%d %ss" % (n, word)
165
166class Compare:
167
168 def __init__(self, filename):
169 self.fp = open(filename, 'r')
170
171 def write(self, data):
172 expected = self.fp.read(len(data))
173 if data <> expected:
174 raise test_support.TestFailed, \
175 'Writing: '+`data`+', expected: '+`expected`
176
Guido van Rossum75fce301997-07-17 14:51:37 +0000177 def flush(self):
178 pass
179
Guido van Rossum152494a1996-12-20 03:12:20 +0000180 def close(self):
181 leftover = self.fp.read()
182 if leftover:
183 raise test_support.TestFailed, 'Unread: '+`leftover`
184 self.fp.close()
185
186 def isatty(self):
187 return 0
188
189if __name__ == '__main__':
Guido van Rossume8387011997-08-14 19:40:34 +0000190 sys.exit(main())