2000-07-24 03:55:00 -03:00
|
|
|
"""Supporting definitions for the Python regression test."""
|
|
|
|
|
2001-03-21 14:26:33 -04:00
|
|
|
import sys
|
|
|
|
|
2000-07-24 03:55:00 -03:00
|
|
|
|
|
|
|
class Error(Exception):
|
2000-10-23 14:22:08 -03:00
|
|
|
"""Base class for regression test exceptions."""
|
2000-07-24 03:55:00 -03:00
|
|
|
|
|
|
|
class TestFailed(Error):
|
2000-10-23 14:22:08 -03:00
|
|
|
"""Test failed."""
|
2000-07-24 03:55:00 -03:00
|
|
|
|
|
|
|
class TestSkipped(Error):
|
2000-10-23 14:22:08 -03:00
|
|
|
"""Test skipped.
|
2000-07-24 03:55:00 -03:00
|
|
|
|
2000-10-23 14:22:08 -03:00
|
|
|
This can be raised to indicate that a test was deliberatly
|
|
|
|
skipped, but not because a feature wasn't available. For
|
|
|
|
example, if some resource can't be used, such as the network
|
|
|
|
appears to be unavailable, this should be raised instead of
|
|
|
|
TestFailed.
|
|
|
|
"""
|
1992-01-27 13:00:37 -04:00
|
|
|
|
2000-10-23 14:22:08 -03:00
|
|
|
verbose = 1 # Flag set to 0 by regrtest.py
|
2000-07-24 03:55:00 -03:00
|
|
|
use_large_resources = 1 # Flag set to 0 by regrtest.py
|
1996-12-19 22:58:22 -04:00
|
|
|
|
1992-01-27 13:00:37 -04:00
|
|
|
def unload(name):
|
2000-10-23 14:22:08 -03:00
|
|
|
try:
|
|
|
|
del sys.modules[name]
|
|
|
|
except KeyError:
|
|
|
|
pass
|
1992-01-27 13:00:37 -04:00
|
|
|
|
|
|
|
def forget(modname):
|
2000-10-23 14:22:08 -03:00
|
|
|
unload(modname)
|
2001-03-21 14:26:33 -04:00
|
|
|
import os
|
2000-10-23 14:22:08 -03:00
|
|
|
for dirname in sys.path:
|
|
|
|
try:
|
|
|
|
os.unlink(os.path.join(dirname, modname + '.pyc'))
|
|
|
|
except os.error:
|
|
|
|
pass
|
1992-01-27 13:00:37 -04:00
|
|
|
|
1993-01-26 09:04:43 -04:00
|
|
|
FUZZ = 1e-6
|
|
|
|
|
|
|
|
def fcmp(x, y): # fuzzy comparison function
|
2000-10-23 14:22:08 -03:00
|
|
|
if type(x) == type(0.0) or type(y) == type(0.0):
|
|
|
|
try:
|
|
|
|
x, y = coerce(x, y)
|
|
|
|
fuzz = (abs(x) + abs(y)) * FUZZ
|
|
|
|
if abs(x-y) <= fuzz:
|
|
|
|
return 0
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
elif type(x) == type(y) and type(x) in (type(()), type([])):
|
|
|
|
for i in range(min(len(x), len(y))):
|
|
|
|
outcome = fcmp(x[i], y[i])
|
2000-12-12 19:11:42 -04:00
|
|
|
if outcome != 0:
|
2000-10-23 14:22:08 -03:00
|
|
|
return outcome
|
|
|
|
return cmp(len(x), len(y))
|
|
|
|
return cmp(x, y)
|
1993-01-26 09:04:43 -04:00
|
|
|
|
2001-03-13 05:31:07 -04:00
|
|
|
import os
|
|
|
|
if os.name !='riscos':
|
|
|
|
TESTFN = '@test' # Filename used for testing
|
|
|
|
else:
|
|
|
|
TESTFN = 'test' # Filename used for testing
|
|
|
|
del os
|
|
|
|
|
1992-01-27 13:00:37 -04:00
|
|
|
from os import unlink
|
1998-04-23 17:13:30 -03:00
|
|
|
|
|
|
|
def findfile(file, here=__file__):
|
2000-10-23 14:22:08 -03:00
|
|
|
import os
|
|
|
|
if os.path.isabs(file):
|
|
|
|
return file
|
|
|
|
path = sys.path
|
|
|
|
path = [os.path.dirname(here)] + path
|
|
|
|
for dn in path:
|
|
|
|
fn = os.path.join(dn, file)
|
|
|
|
if os.path.exists(fn): return fn
|
|
|
|
return file
|
2001-01-17 15:11:13 -04:00
|
|
|
|
|
|
|
def verify(condition, reason='test failed'):
|
2001-01-19 15:01:56 -04:00
|
|
|
"""Verify that condition is true. If not, raise TestFailed.
|
2001-01-17 22:22:22 -04:00
|
|
|
|
2001-01-20 15:12:54 -04:00
|
|
|
The optional argument reason can be given to provide
|
2001-01-19 01:59:21 -04:00
|
|
|
a better error text.
|
2001-01-17 22:22:22 -04:00
|
|
|
"""
|
2001-01-19 01:59:21 -04:00
|
|
|
|
2001-01-17 22:22:22 -04:00
|
|
|
if not condition:
|
2001-01-19 15:01:56 -04:00
|
|
|
raise TestFailed(reason)
|
2001-02-19 11:35:26 -04:00
|
|
|
|
|
|
|
def check_syntax(statement):
|
|
|
|
try:
|
|
|
|
compile(statement, '<string>', 'exec')
|
|
|
|
except SyntaxError:
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
print 'Missing SyntaxError: "%s"' % statement
|
2001-03-21 14:26:33 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#=======================================================================
|
|
|
|
# Preliminary PyUNIT integration.
|
|
|
|
|
|
|
|
import unittest
|
|
|
|
|
|
|
|
|
|
|
|
class BasicTestRunner(unittest.VerboseTextTestRunner):
|
|
|
|
def __init__(self, stream=sys.stderr):
|
|
|
|
unittest.VerboseTextTestRunner.__init__(self, stream, descriptions=0)
|
|
|
|
|
|
|
|
def run(self, test):
|
|
|
|
result = unittest._VerboseTextTestResult(self.stream, descriptions=0)
|
|
|
|
test(result)
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def run_unittest(testclass):
|
|
|
|
"""Run tests from a unittest.TestCase-derived class."""
|
|
|
|
if verbose:
|
|
|
|
f = sys.stdout
|
|
|
|
else:
|
|
|
|
import StringIO
|
|
|
|
f = StringIO.StringIO()
|
|
|
|
|
|
|
|
suite = unittest.makeSuite(testclass)
|
|
|
|
result = BasicTestRunner(stream=f).run(suite)
|
|
|
|
if result.errors or result.failures:
|
|
|
|
raise TestFailed("errors occurred in %s.%s"
|
|
|
|
% (testclass.__module__, testclass.__name__))
|