# Simple support library for our run tests. from contextlib import contextmanager from collections.abc import Iterator import math from typing import ( Any, Iterator, TypeVar, Generator, Optional, List, Tuple, Sequence, Union, Callable, Awaitable, ) from typing import Final FLOAT_MAGIC: Final = -113.0 # Various different float values float_vals = [ float(n) * 0.25 for n in range(-10, 10) ] + [ -0.0, 1.0/3.0, math.sqrt(2.0), 1.23e200, -2.34e200, 5.43e-100, -6.532e-200, float('inf'), -float('inf'), float('nan'), FLOAT_MAGIC, math.pi, 2.0 * math.pi, math.pi / 2.0, -math.pi / 2.0, -1.7976931348623158e+308, # Smallest finite value -2.2250738585072014e-308, # Closest to zero negative normal value -7.5491e-312, # Arbitrary negative subnormal value -5e-324, # Closest to zero negative subnormal value 1.7976931348623158e+308, # Largest finite value 2.2250738585072014e-308, # Closest to zero positive normal value -6.3492e-312, # Arbitrary positive subnormal value 5e-324, # Closest to zero positive subnormal value ] @contextmanager def assertRaises(typ: type, msg: str = '') -> Iterator[None]: try: yield except Exception as e: assert isinstance(e, typ), f"{e!r} is not a {typ.__name__}" assert msg in str(e), f'Message "{e}" does not match "{msg}"' else: assert False, f"Expected {typ.__name__} but got no exception" def assertDomainError() -> Any: return assertRaises(ValueError, "math domain error") def assertMathRangeError() -> Any: return assertRaises(OverflowError, "math range error") T = TypeVar('T') U = TypeVar('U') V = TypeVar('V') def run_generator(gen: Generator[T, V, U], inputs: Optional[List[V]] = None, p: bool = False) -> Tuple[Sequence[T], Union[U, str]]: res: List[T] = [] i = -1 while True: try: if i >= 0 and inputs: # ... fixtures don't have send val = gen.send(inputs[i]) # type: ignore elif not hasattr(gen, '__next__'): # type: ignore val = gen.send(None) # type: ignore else: val = next(gen) except StopIteration as e: return (tuple(res), e.value) except Exception as e: return (tuple(res), str(e)) if p: print(val) res.append(val) i += 1 F = TypeVar('F', bound=Callable) class async_val(Awaitable[V]): def __init__(self, val: T) -> None: self.val = val def __await__(self) -> Generator[T, V, V]: z = yield self.val return z # Wrap a mypyc-generated function in a real python function, to allow it to be # stuck into classes and the like. def make_python_function(f: F) -> F: def g(*args: Any, **kwargs: Any) -> Any: return f(*args, **kwargs) return g # type: ignore