blob: e842e81b72fef68889b7dab8a327bd621ae1564a [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:
Guido van Rossum41360a41998-03-26 19:42:58 +000033 opts, args = getopt.getopt(sys.argv[1:], 'vgqx')
Guido van Rossum152494a1996-12-20 03:12:20 +000034 except getopt.error, msg:
Guido van Rossum41360a41998-03-26 19:42:58 +000035 print msg
36 print __doc__
37 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 Rossum41360a41998-03-26 19:42:58 +000043 if o == '-v': verbose = verbose+1
44 if o == '-q': quiet = 1; verbose = 0
45 if o == '-g': generate = 1
46 if o == '-x': exclude = 1
Guido van Rossuma4122201997-08-18 20:08:24 +000047 if generate and verbose:
Guido van Rossum41360a41998-03-26 19:42:58 +000048 print "-g and -v don't go together!"
49 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)):
Guido van Rossum41360a41998-03-26 19:42:58 +000054 # 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:
Guido van Rossum41360a41998-03-26 19:42:58 +000058 nottests[:0] = args
59 args = []
Guido van Rossum152494a1996-12-20 03:12:20 +000060 tests = args or findtests()
Guido van Rossum41360a41998-03-26 19:42:58 +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 Rossum41360a41998-03-26 19:42:58 +000063 if not quiet:
64 print test
65 ok = runtest(test, generate, verbose)
66 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)
Guido van Rossum152494a1996-12-20 03:12:20 +000075 if good and not quiet:
Guido van Rossum41360a41998-03-26 19:42:58 +000076 if not bad and not skipped and len(good) > 1:
77 print "All",
78 print count(len(good), "test"), "OK."
Guido van Rossum152494a1996-12-20 03:12:20 +000079 if bad:
Guido van Rossum41360a41998-03-26 19:42:58 +000080 print count(len(bad), "test"), "failed:",
81 print string.join(bad)
Guido van Rossum152494a1996-12-20 03:12:20 +000082 if skipped and not quiet:
Guido van Rossum41360a41998-03-26 19:42:58 +000083 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:
Guido van Rossum41360a41998-03-26 19:42:58 +0000108 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)
Guido van Rossum152494a1996-12-20 03:12:20 +0000112 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:
Guido van Rossum41360a41998-03-26 19:42:58 +0000121 if generate:
122 cfp = open(outputfile, "w")
123 elif verbose:
124 cfp = sys.stdout
125 else:
126 cfp = Compare(outputfile)
Guido van Rossum152494a1996-12-20 03:12:20 +0000127 except IOError:
Guido van Rossum41360a41998-03-26 19:42:58 +0000128 cfp = None
129 print "Warning: can't open", outputfile
Guido van Rossum152494a1996-12-20 03:12:20 +0000130 try:
Guido van Rossum41360a41998-03-26 19:42:58 +0000131 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, globals(), locals(), [])
137 finally:
138 sys.stdout = save_stdout
Guido van Rossum152494a1996-12-20 03:12:20 +0000139 except ImportError, msg:
Guido van Rossum41360a41998-03-26 19:42:58 +0000140 return -1
Guido van Rossum4e8ef5f1997-10-20 23:46:54 +0000141 except KeyboardInterrupt, v:
Guido van Rossum41360a41998-03-26 19:42:58 +0000142 raise KeyboardInterrupt, v, sys.exc_info()[2]
Guido van Rossum152494a1996-12-20 03:12:20 +0000143 except test_support.TestFailed, msg:
Guido van Rossum41360a41998-03-26 19:42:58 +0000144 print "test", test, "failed --", msg
145 return 0
Guido van Rossum9e48b271997-07-16 01:56:13 +0000146 except:
Guido van Rossum41360a41998-03-26 19:42:58 +0000147 type, value = sys.exc_info()[:2]
148 print "test", test, "crashed --", type, ":", value
149 if verbose:
150 traceback.print_exc(file=sys.stdout)
151 return 0
Guido van Rossum152494a1996-12-20 03:12:20 +0000152 else:
Guido van Rossum41360a41998-03-26 19:42:58 +0000153 return 1
Guido van Rossum152494a1996-12-20 03:12:20 +0000154
155def findtestdir():
156 if __name__ == '__main__':
Guido van Rossum41360a41998-03-26 19:42:58 +0000157 file = sys.argv[0]
Guido van Rossum152494a1996-12-20 03:12:20 +0000158 else:
Guido van Rossum41360a41998-03-26 19:42:58 +0000159 file = __file__
Guido van Rossum152494a1996-12-20 03:12:20 +0000160 testdir = os.path.dirname(file) or os.curdir
161 return testdir
162
163def count(n, word):
164 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +0000165 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +0000166 else:
Guido van Rossum41360a41998-03-26 19:42:58 +0000167 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +0000168
169class Compare:
170
171 def __init__(self, filename):
Guido van Rossum41360a41998-03-26 19:42:58 +0000172 self.fp = open(filename, 'r')
Guido van Rossum152494a1996-12-20 03:12:20 +0000173
174 def write(self, data):
Guido van Rossum41360a41998-03-26 19:42:58 +0000175 expected = self.fp.read(len(data))
176 if data <> expected:
177 raise test_support.TestFailed, \
178 'Writing: '+`data`+', expected: '+`expected`
Guido van Rossum152494a1996-12-20 03:12:20 +0000179
Guido van Rossume87ed5f1998-04-23 13:33:21 +0000180 def writelines(self, listoflines):
181 map(self.write, listoflines)
182
Guido van Rossum75fce301997-07-17 14:51:37 +0000183 def flush(self):
Guido van Rossum41360a41998-03-26 19:42:58 +0000184 pass
Guido van Rossum75fce301997-07-17 14:51:37 +0000185
Guido van Rossum152494a1996-12-20 03:12:20 +0000186 def close(self):
Guido van Rossum41360a41998-03-26 19:42:58 +0000187 leftover = self.fp.read()
188 if leftover:
189 raise test_support.TestFailed, 'Unread: '+`leftover`
190 self.fp.close()
Guido van Rossum152494a1996-12-20 03:12:20 +0000191
192 def isatty(self):
Guido van Rossum41360a41998-03-26 19:42:58 +0000193 return 0
Guido van Rossum152494a1996-12-20 03:12:20 +0000194
195if __name__ == '__main__':
Guido van Rossume8387011997-08-14 19:40:34 +0000196 sys.exit(main())