162 lines
5.1 KiB
Python
162 lines
5.1 KiB
Python
#!/usr/bin/env python
|
|
|
|
"""
|
|
python runtests.py -py
|
|
Use py.test to run tests (more useful for debugging)
|
|
|
|
python runtests.py -coverage
|
|
Generate test coverage report. Statistics are written to /tmp
|
|
|
|
python runtests.py -profile
|
|
Generate profile stats (this is much slower)
|
|
|
|
python runtests.py -nogmpy
|
|
Run tests without using GMPY even if it exists
|
|
|
|
python runtests.py -strict
|
|
Enforce extra tests in normalize()
|
|
|
|
python runtests.py -local
|
|
Insert '../..' at the beginning of sys.path to use local mpmath
|
|
|
|
python runtests.py -skip ...
|
|
Skip tests from the listed modules
|
|
|
|
Additional arguments are used to filter the tests to run. Only files that have
|
|
one of the arguments in their name are executed.
|
|
|
|
"""
|
|
|
|
import sys, os, traceback
|
|
|
|
profile = False
|
|
if "-profile" in sys.argv:
|
|
sys.argv.remove('-profile')
|
|
profile = True
|
|
|
|
coverage = False
|
|
if "-coverage" in sys.argv:
|
|
sys.argv.remove('-coverage')
|
|
coverage = True
|
|
|
|
if "-nogmpy" in sys.argv:
|
|
sys.argv.remove('-nogmpy')
|
|
os.environ['MPMATH_NOGMPY'] = 'Y'
|
|
|
|
if "-strict" in sys.argv:
|
|
sys.argv.remove('-strict')
|
|
os.environ['MPMATH_STRICT'] = 'Y'
|
|
|
|
if "-local" in sys.argv:
|
|
sys.argv.remove('-local')
|
|
importdir = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]),
|
|
'../..'))
|
|
else:
|
|
importdir = ''
|
|
|
|
# TODO: add a flag for this
|
|
testdir = ''
|
|
|
|
def testit(importdir='', testdir='', exit_on_fail=False):
|
|
"""Run all tests in testdir while importing from importdir."""
|
|
if importdir:
|
|
sys.path.insert(1, importdir)
|
|
if testdir:
|
|
sys.path.insert(1, testdir)
|
|
import os.path
|
|
import mpmath
|
|
print("mpmath imported from %s" % os.path.dirname(mpmath.__file__))
|
|
print("mpmath backend: %s" % mpmath.libmp.backend.BACKEND)
|
|
print("mpmath mp class: %s" % repr(mpmath.mp))
|
|
print("mpmath version: %s" % mpmath.__version__)
|
|
print("Python version: %s" % sys.version)
|
|
print("")
|
|
if "-py" in sys.argv:
|
|
sys.argv.remove('-py')
|
|
import py
|
|
py.test.cmdline.main()
|
|
else:
|
|
import glob
|
|
from timeit import default_timer as clock
|
|
modules = []
|
|
args = sys.argv[1:]
|
|
excluded = []
|
|
if '-skip' in args:
|
|
excluded = args[args.index('-skip')+1:]
|
|
args = args[:args.index('-skip')]
|
|
# search for tests in directory of this file if not otherwise specified
|
|
if not testdir:
|
|
pattern = os.path.dirname(sys.argv[0])
|
|
else:
|
|
pattern = testdir
|
|
if pattern:
|
|
pattern += '/'
|
|
pattern += 'test*.py'
|
|
# look for tests (respecting specified filter)
|
|
for f in glob.glob(pattern):
|
|
name = os.path.splitext(os.path.basename(f))[0]
|
|
# If run as a script, only run tests given as args, if any are given
|
|
if args and __name__ == "__main__":
|
|
ok = False
|
|
for arg in args:
|
|
if arg in name:
|
|
ok = True
|
|
break
|
|
if not ok:
|
|
continue
|
|
elif name in excluded:
|
|
continue
|
|
module = __import__(name)
|
|
priority = module.__dict__.get('priority', 100)
|
|
if priority == 666:
|
|
modules = [[priority, name, module]]
|
|
break
|
|
modules.append([priority, name, module])
|
|
# execute tests
|
|
modules.sort()
|
|
tstart = clock()
|
|
for priority, name, module in modules:
|
|
print(name)
|
|
for f in sorted(module.__dict__.keys()):
|
|
if f.startswith('test_'):
|
|
if coverage and ('numpy' in f):
|
|
continue
|
|
sys.stdout.write(" " + f[5:].ljust(25) + " ")
|
|
t1 = clock()
|
|
try:
|
|
module.__dict__[f]()
|
|
except:
|
|
etype, evalue, trb = sys.exc_info()
|
|
if etype in (KeyboardInterrupt, SystemExit):
|
|
raise
|
|
print("")
|
|
print("TEST FAILED!")
|
|
print("")
|
|
traceback.print_exc()
|
|
if exit_on_fail:
|
|
return
|
|
t2 = clock()
|
|
print("ok " + " " + ("%.7f" % (t2-t1)) + " s")
|
|
tend = clock()
|
|
print("")
|
|
print("finished tests in " + ("%.2f" % (tend-tstart)) + " seconds")
|
|
# clean sys.path
|
|
if importdir:
|
|
sys.path.remove(importdir)
|
|
if testdir:
|
|
sys.path.remove(testdir)
|
|
|
|
if __name__ == '__main__':
|
|
if profile:
|
|
import cProfile
|
|
cProfile.run("testit('%s', '%s')" % (importdir, testdir), sort=1)
|
|
elif coverage:
|
|
import trace
|
|
tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix],
|
|
trace=0, count=1)
|
|
tracer.run('testit(importdir, testdir)')
|
|
r = tracer.results()
|
|
r.write_results(show_missing=True, summary=True, coverdir="/tmp")
|
|
else:
|
|
testit(importdir, testdir)
|