blob: 34b1809d05ad4210d45221330104a4c3739e5ffd [file] [log] [blame]
Fred Drake1790dd42000-07-24 06:55:00 +00001"""Supporting definitions for the Python regression test."""
Guido van Rossum3bead091992-01-27 17:00:37 +00002
Fred Drake1790dd42000-07-24 06:55:00 +00003
4class Error(Exception):
Fred Drake004d5e62000-10-23 17:22:08 +00005 """Base class for regression test exceptions."""
Fred Drake1790dd42000-07-24 06:55:00 +00006
7class TestFailed(Error):
Fred Drake004d5e62000-10-23 17:22:08 +00008 """Test failed."""
Fred Drake1790dd42000-07-24 06:55:00 +00009
10class TestSkipped(Error):
Fred Drake004d5e62000-10-23 17:22:08 +000011 """Test skipped.
Fred Drake1790dd42000-07-24 06:55:00 +000012
Fred Drake004d5e62000-10-23 17:22:08 +000013 This can be raised to indicate that a test was deliberatly
14 skipped, but not because a feature wasn't available. For
15 example, if some resource can't be used, such as the network
16 appears to be unavailable, this should be raised instead of
17 TestFailed.
Fred Drake004d5e62000-10-23 17:22:08 +000018 """
Fred Drake1790dd42000-07-24 06:55:00 +000019
Fred Drake004d5e62000-10-23 17:22:08 +000020verbose = 1 # Flag set to 0 by regrtest.py
Fred Drake1790dd42000-07-24 06:55:00 +000021use_large_resources = 1 # Flag set to 0 by regrtest.py
Guido van Rossum531661c1996-12-20 02:58:22 +000022
Guido van Rossum3bead091992-01-27 17:00:37 +000023def unload(name):
Fred Drake004d5e62000-10-23 17:22:08 +000024 import sys
25 try:
26 del sys.modules[name]
27 except KeyError:
28 pass
Guido van Rossum3bead091992-01-27 17:00:37 +000029
30def forget(modname):
Fred Drake004d5e62000-10-23 17:22:08 +000031 unload(modname)
32 import sys, os
33 for dirname in sys.path:
34 try:
35 os.unlink(os.path.join(dirname, modname + '.pyc'))
36 except os.error:
37 pass
Guido van Rossum3bead091992-01-27 17:00:37 +000038
Guido van Rossum35fb82a1993-01-26 13:04:43 +000039FUZZ = 1e-6
40
41def fcmp(x, y): # fuzzy comparison function
Fred Drake004d5e62000-10-23 17:22:08 +000042 if type(x) == type(0.0) or type(y) == type(0.0):
43 try:
44 x, y = coerce(x, y)
45 fuzz = (abs(x) + abs(y)) * FUZZ
46 if abs(x-y) <= fuzz:
47 return 0
48 except:
49 pass
50 elif type(x) == type(y) and type(x) in (type(()), type([])):
51 for i in range(min(len(x), len(y))):
52 outcome = fcmp(x[i], y[i])
Fred Drake132dce22000-12-12 23:11:42 +000053 if outcome != 0:
Fred Drake004d5e62000-10-23 17:22:08 +000054 return outcome
55 return cmp(len(x), len(y))
56 return cmp(x, y)
Guido van Rossum35fb82a1993-01-26 13:04:43 +000057
Guido van Rossuma8f7e592001-03-13 09:31:07 +000058import os
59if os.name !='riscos':
60 TESTFN = '@test' # Filename used for testing
61else:
62 TESTFN = 'test' # Filename used for testing
63del os
64
Guido van Rossum3bead091992-01-27 17:00:37 +000065from os import unlink
Guido van Rossume26132c1998-04-23 20:13:30 +000066
67def findfile(file, here=__file__):
Fred Drake004d5e62000-10-23 17:22:08 +000068 import os
69 if os.path.isabs(file):
70 return file
71 import sys
72 path = sys.path
73 path = [os.path.dirname(here)] + path
74 for dn in path:
75 fn = os.path.join(dn, file)
76 if os.path.exists(fn): return fn
77 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +000078
79def verify(condition, reason='test failed'):
Guido van Rossuma1374e42001-01-19 19:01:56 +000080 """Verify that condition is true. If not, raise TestFailed.
Marc-André Lemburg36619082001-01-17 19:11:13 +000081
Skip Montanaroc955f892001-01-20 19:12:54 +000082 The optional argument reason can be given to provide
Tim Peters983874d2001-01-19 05:59:21 +000083 a better error text.
Tim Petersd2bf3b72001-01-18 02:22:22 +000084 """
Tim Peters983874d2001-01-19 05:59:21 +000085
Tim Petersd2bf3b72001-01-18 02:22:22 +000086 if not condition:
Guido van Rossuma1374e42001-01-19 19:01:56 +000087 raise TestFailed(reason)
Jeremy Hylton47793992001-02-19 15:35:26 +000088
89def check_syntax(statement):
90 try:
91 compile(statement, '<string>', 'exec')
92 except SyntaxError:
93 pass
94 else:
95 print 'Missing SyntaxError: "%s"' % statement