Spaces:
Paused
Paused
| #!/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) | |