blob: abd40a63997818d0de457b603ce13fd4219743e8 [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
Guido van Rossumf9fa20b1997-09-07 16:42:34 +0000136 __import__(test, globals(), locals(), [])
Guido van Rossum152494a1996-12-20 03:12:20 +0000137 finally:
138 sys.stdout = save_stdout
139 except ImportError, msg:
140 return -1
Guido van Rossum4e8ef5f1997-10-20 23:46:54 +0000141 except KeyboardInterrupt, v:
142 raise KeyboardInterrupt, v, sys.exc_info()[2]
Guido van Rossum152494a1996-12-20 03:12:20 +0000143 except test_support.TestFailed, msg:
144 print "test", test, "failed --", msg
145 return 0
Guido van Rossum9e48b271997-07-16 01:56:13 +0000146 except:
Guido van Rossum4e8ef5f1997-10-20 23:46:54 +0000147 type, value = sys.exc_info()[:2]
148 print "test", test, "crashed --", type, ":", value
Guido van Rossuma4122201997-08-18 20:08:24 +0000149 if verbose:
Guido van Rossum9e48b271997-07-16 01:56:13 +0000150 traceback.print_exc(file=sys.stdout)
151 return 0
Guido van Rossum152494a1996-12-20 03:12:20 +0000152 else:
153 return 1
154
155def findtestdir():
156 if __name__ == '__main__':
157 file = sys.argv[0]
158 else:
159 file = __file__
160 testdir = os.path.dirname(file) or os.curdir
161 return testdir
162
163def count(n, word):
164 if n == 1:
165 return "%d %s" % (n, word)
166 else:
167 return "%d %ss" % (n, word)
168
169class Compare:
170
171 def __init__(self, filename):
172 self.fp = open(filename, 'r')
173
174 def write(self, data):
175 expected = self.fp.read(len(data))
176 if data <> expected:
177 raise test_support.TestFailed, \
178 'Writing: '+`data`+', expected: '+`expected`
179
Guido van Rossum75fce301997-07-17 14:51:37 +0000180 def flush(self):
181 pass
182
Guido van Rossum152494a1996-12-20 03:12:20 +0000183 def close(self):
184 leftover = self.fp.read()
185 if leftover:
186 raise test_support.TestFailed, 'Unread: '+`leftover`
187 self.fp.close()
188
189 def isatty(self):
190 return 0
191
192if __name__ == '__main__':
Guido van Rossume8387011997-08-14 19:40:34 +0000193 sys.exit(main())