| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- # 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
|