1import os 2import sys 3import functools 4import unittest 5import traceback 6from fnmatch import fnmatch 7from os.path import join, isfile, relpath, normpath, splitext 8 9from .main import NumbaTestProgram, SerialSuite, make_tag_decorator 10from numba.core import config 11 12 13def load_testsuite(loader, dir): 14 """Find tests in 'dir'.""" 15 try: 16 suite = unittest.TestSuite() 17 files = [] 18 for f in os.listdir(dir): 19 path = join(dir, f) 20 if isfile(path) and fnmatch(f, 'test_*.py'): 21 files.append(f) 22 elif isfile(join(path, '__init__.py')): 23 suite.addTests(loader.discover(path)) 24 for f in files: 25 # turn 'f' into a filename relative to the toplevel dir... 26 f = relpath(join(dir, f), loader._top_level_dir) 27 # ...and translate it to a module name. 28 f = splitext(normpath(f.replace(os.path.sep, '.')))[0] 29 suite.addTests(loader.loadTestsFromName(f)) 30 return suite 31 except Exception: 32 traceback.print_exc(file=sys.stderr) 33 sys.exit(-1) 34 35 36def allow_interpreter_mode(fn): 37 """Temporarily re-enable interpreter mode 38 """ 39 @functools.wraps(fn) 40 def _core(*args, **kws): 41 config.COMPATIBILITY_MODE = True 42 try: 43 fn(*args, **kws) 44 finally: 45 config.COMPATIBILITY_MODE = False 46 return _core 47 48 49def run_tests(argv=None, defaultTest=None, topleveldir=None, 50 xmloutput=None, verbosity=1, nomultiproc=False): 51 """ 52 args 53 ---- 54 - xmloutput [str or None] 55 Path of XML output directory (optional) 56 - verbosity [int] 57 Verbosity level of tests output 58 59 Returns the TestResult object after running the test *suite*. 60 """ 61 62 if xmloutput is not None: 63 import xmlrunner 64 runner = xmlrunner.XMLTestRunner(output=xmloutput) 65 else: 66 runner = None 67 prog = NumbaTestProgram(argv=argv, 68 module=None, 69 defaultTest=defaultTest, 70 topleveldir=topleveldir, 71 testRunner=runner, exit=False, 72 verbosity=verbosity, 73 nomultiproc=nomultiproc) 74 return prog.result 75