def test_registering_a_Random_is_idempotent(): gc_on_pypy() n_registered = len(entropy.RANDOMS_TO_MANAGE) r = random.Random() register_random(r) register_random(r) assert len(entropy.RANDOMS_TO_MANAGE) == n_registered + 1 del r gc_on_pypy() assert len(entropy.RANDOMS_TO_MANAGE) == n_registered
def test_registered_Random_is_seeded_by_random_module_strategy(): r = random.Random() register_random(r) state = r.getstate() results = set() count = [0] @given(st.integers()) def inner(x): results.add(r.random()) count[0] += 1 inner() assert count[0] > len(results) * 0.9, "too few unique random numbers" assert state == r.getstate()
def test_manages_registered_Random_instance(): r = random.Random() register_random(r) state = r.getstate() result = [] @given(st.integers()) def inner(x): v = r.random() if result: assert v == result[0] else: result.append(v) inner() assert state == r.getstate()
def test_registered_Random_is_seeded_by_random_module_strategy(): r = random.Random() register_random(r) state = r.getstate() results = set() count = [0] @given(st.integers()) def inner(x): results.add(r.random()) count[0] += 1 inner() assert count[0] > len(results) * 0.9, "too few unique random numbers" assert state == r.getstate() entropy.RANDOMS_TO_MANAGE.remove(r) assert r not in entropy.RANDOMS_TO_MANAGE
def test_manages_registered_Random_instance(): r = random.Random() register_random(r) state = r.getstate() result = [] @given(st.integers()) def inner(x): v = r.random() if result: assert v == result[0] else: result.append(v) inner() assert state == r.getstate() entropy.RANDOMS_TO_MANAGE.remove(r) assert r not in entropy.RANDOMS_TO_MANAGE
def test_evil_prng_registration_nonsense(): gc_on_pypy() n_registered = len(entropy.RANDOMS_TO_MANAGE) r1, r2, r3 = random.Random(1), random.Random(2), random.Random(3) s2 = r2.getstate() # We're going to be totally evil here: register two randoms, then # drop one and add another, and finally check that we reset only # the states that we collected before we started register_random(r1) k = max(entropy.RANDOMS_TO_MANAGE) # get a handle to check if r1 still exists register_random(r2) assert len(entropy.RANDOMS_TO_MANAGE) == n_registered + 2 with deterministic_PRNG(0): del r1 gc_on_pypy() assert k not in entropy.RANDOMS_TO_MANAGE, "r1 has been garbage-collected" assert len(entropy.RANDOMS_TO_MANAGE) == n_registered + 1 r2.seed(4) register_random(r3) r3.seed(4) s4 = r3.getstate() # Implicit check, no exception was raised in __exit__ assert r2.getstate() == s2, "reset previously registered random state" assert r3.getstate() == s4, "retained state when registered within the context"
from pathlib import Path import hypothesis import numpy as np import torch class TorchRandomState: def getstate(self) -> np.ndarray: return torch.get_rng_state().numpy() def setstate(self, state: np.ndarray) -> None: return torch.set_rng_state(torch.from_numpy(state)) def seed(self, seed) -> None: torch.manual_seed(seed) hypothesis.register_random(TorchRandomState()) _here = Path(__file__).parent TEST_DATA_ROOT = _here / "data"
def test_registering_a_Random_is_idempotent(): r = random.Random() register_random(r) register_random(r) assert entropy.RANDOMS_TO_MANAGE.pop() is r assert r not in entropy.RANDOMS_TO_MANAGE
def test_cannot_register_non_Random(): with pytest.raises(InvalidArgument): register_random("not a Random instance")
if sys.version_info >= (3, 6): ORDERED_DICTS = True else: # Ordered dict (and **kwargs) not available with Python<3.6 ORDERED_DICTS = False try: from hypothesis import register_random except ImportError: # pragma: no cover pass else: # On recent versions of Hypothesis, make the Trio scheduler deterministic # even though it uses a module-scoped Random instance. This works # regardless of whether or not the random_module strategy is used. register_random(trio._core._run._r) # We also have to enable determinism, which is disabled by default # due to a small performance impact - but fine to enable in testing. # See https://github.com/python-trio/trio/pull/890/ for details. trio._core._run._ALLOW_DETERMINISTIC_SCHEDULING = True def pytest_addoption(parser): parser.addini( "trio_mode", "should pytest-trio handle all async functions?", type="bool", default=False, )