"""Default driver for run tests (run-*.test). This imports the 'native' module (containing the compiled test cases) and calls each function starting with test_, and reports any exceptions as failures. Test cases can provide a custom driver.py that overrides this file. """ import sys import native failures = [] for name in dir(native): if name.startswith('test_'): test_func = getattr(native, name) try: test_func() except Exception as e: failures.append((name, sys.exc_info())) if failures: from traceback import print_exception, format_tb import re def extract_line(tb): formatted = '\n'.join(format_tb(tb)) m = re.search('File "(native|driver).py", line ([0-9]+), in (test_|)', formatted) if m is None: return "0" return m.group(1) # Sort failures by line number of test function. failures = sorted(failures, key=lambda e: extract_line(e[1][2])) # If there are multiple failures, print stack traces of all but the final failure. for name, e in failures[:-1]: print(f'<< {name} >>') sys.stdout.flush() print_exception(*e) print() sys.stdout.flush() # Raise exception for the last failure. Test runner will show the traceback. print(f'<< {failures[-1][0]} >>') sys.stdout.flush() raise failures[-1][1][1]