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