blob: 0b342226780182c50f50d16d708595caf021ad39 [file] [edit]
[case testRandom_librt]
from typing import Any
from librt.random import Random, random, randint, randrange, seed
from mypy_extensions import i64
from testutil import assertRaises
#
# Random object basics
#
def test_random_construct() -> None:
r = Random()
assert isinstance(r, Random)
def test_randint_basic() -> None:
r = Random()
for i in range(100):
val = r.randint(0, 10)
assert 0 <= val <= 10
def test_randint_single_value() -> None:
r = Random()
for i in range(10):
assert r.randint(5, 5) == 5
def test_randint_negative_range() -> None:
r = Random()
for i in range(100):
val = r.randint(-10, -1)
assert -10 <= val <= -1
def test_randint_mixed_range() -> None:
r = Random()
for i in range(100):
val = r.randint(-5, 5)
assert -5 <= val <= 5
def test_randint_large_range() -> None:
r = Random()
for i in range(100):
val = r.randint(0, 1000000)
assert 0 <= val <= 1000000
def test_randint_produces_different_values() -> None:
r = Random()
values = set()
for i in range(100):
values.add(r.randint(0, 1000000))
# With range 0-1000000 and 100 samples, we should get at least 2 distinct values
assert len(values) > 1
def test_random_basic() -> None:
r = Random()
for i in range(100):
val = r.random()
assert 0.0 <= val < 1.0
def test_random_returns_float() -> None:
r = Random()
val = r.random()
assert isinstance(val, float)
def test_random_produces_different_values() -> None:
r = Random()
values = set()
for i in range(100):
values.add(r.random())
assert len(values) > 1
def test_randrange_one_arg() -> None:
r = Random()
for i in range(100):
val = r.randrange(10)
assert 0 <= val < 10
def test_randrange_two_args() -> None:
r = Random()
for i in range(100):
val = r.randrange(5, 15)
assert 5 <= val < 15
def test_randrange_negative() -> None:
r = Random()
for i in range(100):
val = r.randrange(-10, 0)
assert -10 <= val < 0
def test_randrange_single_value() -> None:
r = Random()
for i in range(10):
assert r.randrange(7, 8) == 7
def test_randrange_produces_different_values() -> None:
r = Random()
values = set()
for i in range(100):
values.add(r.randrange(1000000))
assert len(values) > 1
def test_constructor_seed() -> None:
r1 = Random(42)
r2 = Random(42)
vals1 = [r1.randint(0, 1000000) for _ in range(20)]
vals2 = [r2.randint(0, 1000000) for _ in range(20)]
assert vals1 == vals2
def test_constructor_seed_different() -> None:
r1 = Random(42)
r2 = Random(43)
vals1 = [r1.randint(0, 1000000) for _ in range(20)]
vals2 = [r2.randint(0, 1000000) for _ in range(20)]
assert vals1 != vals2
def test_constructor_none_seed() -> None:
r = Random(None)
val = r.random()
assert 0.0 <= val < 1.0
def test_seed_method() -> None:
r = Random(0)
r.seed(42)
vals1 = [r.randint(0, 1000000) for _ in range(20)]
r.seed(42)
vals2 = [r.randint(0, 1000000) for _ in range(20)]
assert vals1 == vals2
def test_seed_method_resets_state() -> None:
r = Random(42)
expected = [r.randint(0, 1000000) for _ in range(20)]
# Consume some values, then reseed
r.seed(42)
actual = [r.randint(0, 1000000) for _ in range(20)]
assert expected == actual
#
# Module-level functions
#
def test_module_random_basic() -> None:
for i in range(100):
val = random()
assert 0.0 <= val < 1.0
def test_module_random_returns_float() -> None:
assert isinstance(random(), float)
def test_module_random_produces_different_values() -> None:
values = set()
for i in range(100):
values.add(random())
assert len(values) > 1
def test_module_randint_basic() -> None:
for i in range(100):
val = randint(0, 10)
assert 0 <= val <= 10
def test_module_randint_single_value() -> None:
for i in range(10):
assert randint(5, 5) == 5
def test_module_randint_produces_different_values() -> None:
values = set()
for i in range(100):
values.add(randint(0, 1000000))
assert len(values) > 1
def test_module_randrange_one_arg() -> None:
for i in range(100):
val = randrange(10)
assert 0 <= val < 10
def test_module_randrange_two_args() -> None:
for i in range(100):
val = randrange(5, 15)
assert 5 <= val < 15
def test_module_randrange_produces_different_values() -> None:
values = set()
for i in range(100):
values.add(randrange(1000000))
assert len(values) > 1
def test_module_seed_reproducible() -> None:
seed(42)
vals1 = [randint(0, 1000000) for _ in range(20)]
seed(42)
vals2 = [randint(0, 1000000) for _ in range(20)]
assert vals1 == vals2
def test_module_seed_different() -> None:
seed(42)
vals1 = [randint(0, 1000000) for _ in range(20)]
seed(43)
vals2 = [randint(0, 1000000) for _ in range(20)]
assert vals1 != vals2
#
# Wrapper function calling convention (via Any)
#
def test_method_random_via_wrapper() -> None:
r: Any = Random(42)
val = r.random()
assert isinstance(val, float)
assert 0.0 <= val < 1.0
def test_method_seed_via_wrapper() -> None:
r: Any = Random(0)
r.seed(42)
val = r.random()
assert 0.0 <= val < 1.0
def test_module_random_via_wrapper() -> None:
random_any: Any = random
val = random_any()
assert isinstance(val, float)
assert 0.0 <= val < 1.0
def test_module_randint_via_wrapper() -> None:
randint_any: Any = randint
val = randint_any(0, 10)
assert 0 <= val <= 10
def test_module_seed_via_wrapper() -> None:
seed_any: Any = seed
seed_any(42)
#
# Wide i64 ranges
#
def method_randint(r: Random, a: i64, b: i64) -> i64:
return r.randint(a, b)
def method_randrange(r: Random, a: i64, b: i64) -> i64:
return r.randrange(a, b)
def module_randint(a: i64, b: i64) -> i64:
return randint(a, b)
def module_randrange(a: i64, b: i64) -> i64:
return randrange(a, b)
def test_full_i64_randint_native() -> None:
lo: i64 = -9223372036854775808
hi: i64 = 9223372036854775807
r = Random(42)
saw_non_min = False
for i in range(20):
val = method_randint(r, lo, hi)
assert lo <= val <= hi
if val != lo:
saw_non_min = True
assert saw_non_min
def test_full_i64_randint_module_native() -> None:
lo: i64 = -9223372036854775808
hi: i64 = 9223372036854775807
saw_non_min = False
for i in range(20):
val = module_randint(lo, hi)
assert lo <= val <= hi
if val != lo:
saw_non_min = True
assert saw_non_min
def test_wide_i64_randrange_native() -> None:
lo: i64 = -9223372036854775808
hi: i64 = 9223372036854775807
r = Random(43)
for i in range(20):
val = method_randrange(r, lo, hi)
assert lo <= val < hi
val = module_randrange(lo, hi)
assert lo <= val < hi
def test_full_i64_randint_python_api() -> None:
r: Any = Random(42)
lo = -9223372036854775808
hi = 9223372036854775807
saw_non_min = False
for i in range(20):
val = r.randint(lo, hi)
assert lo <= val <= hi
if val != lo:
saw_non_min = True
assert saw_non_min
def test_wide_i64_randrange_python_api() -> None:
r: Any = Random(43)
randrange_any: Any = randrange
lo = -9223372036854775808
hi = 9223372036854775807
for i in range(20):
val = r.randrange(lo, hi)
assert lo <= val < hi
val = randrange_any(lo, hi)
assert lo <= val < hi
#
# Error handling
#
def test_randint_empty_range() -> None:
r = Random()
with assertRaises(ValueError, "empty range"):
r.randint(10, 5)
def test_randint_wrong_arg_count() -> None:
r = Random()
with assertRaises(TypeError):
r.randint(1) # type: ignore[call-arg]
with assertRaises(TypeError):
r.randint(1, 2, 3) # type: ignore[call-arg]
def test_module_randint_empty_range() -> None:
with assertRaises(ValueError, "empty range"):
randint(10, 5)
def test_randrange_empty_range() -> None:
r = Random()
with assertRaises(ValueError, "empty range"):
r.randrange(0)
with assertRaises(ValueError, "empty range"):
r.randrange(-5)
with assertRaises(ValueError, "empty range"):
r.randrange(10, 10)
with assertRaises(ValueError, "empty range"):
r.randrange(10, 5)
def test_randrange_wrong_arg_count() -> None:
r = Random()
with assertRaises(TypeError):
r.randrange() # type: ignore[call-overload]
with assertRaises(TypeError):
r.randrange(1, 2, 3) # type: ignore[call-overload]
def test_module_randrange_empty_range() -> None:
with assertRaises(ValueError, "empty range"):
randrange(0)
with assertRaises(ValueError, "empty range"):
randrange(10, 5)