import platform import sys def assert_raises(expected, *args, _msg=None, **kw): if args: f, f_args = args[0], args[1:] with AssertRaises(expected, _msg): f(*f_args, **kw) else: assert not kw return AssertRaises(expected, _msg) class AssertRaises: def __init__(self, expected, msg): self.expected = expected self.exception = None self.failmsg = msg def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): if exc_type is None: failmsg = self.failmsg or \ '{} was not raised'.format(self.expected.__name__) assert False, failmsg if not issubclass(exc_type, self.expected): return False self.exception = exc_val return True class TestFailingBool: def __bool__(self): raise RuntimeError class TestFailingIter: def __iter__(self): raise RuntimeError def _assert_print(f, args): raised = True try: assert f() raised = False finally: if raised: print('Assertion Failure:', *args) def _typed(obj): return '{}({})'.format(type(obj), obj) def assert_equal(a, b): _assert_print(lambda: a == b, [_typed(a), '==', _typed(b)]) def assert_true(e): _assert_print(lambda: e is True, [_typed(e), 'is True']) def assert_false(e): _assert_print(lambda: e is False, [_typed(e), 'is False']) def assert_isinstance(obj, klass): _assert_print(lambda: isinstance(obj, klass), ['isisntance(', _typed(obj), ',', klass, ')']) def assert_in(a, b): _assert_print(lambda: a in b, [a, 'in', b]) def skip_if_unsupported(req_maj_vers, req_min_vers, test_fct): def exec(): test_fct() if platform.python_implementation() == 'RustPython': exec() elif sys.version_info.major>=req_maj_vers and sys.version_info.minor>=req_min_vers: exec() else: print(f'Skipping test as a higher python version is required. Using {platform.python_implementation()} {platform.python_version()}') def fail_if_unsupported(req_maj_vers, req_min_vers, test_fct): def exec(): test_fct() if platform.python_implementation() == 'RustPython': exec() elif sys.version_info.major>=req_maj_vers and sys.version_info.minor>=req_min_vers: exec() else: assert False, f'Test cannot performed on this python version. {platform.python_implementation()} {platform.python_version()}'