Make lalib.elements.galois.to_gf2()
a detail
- `to_gf2()` is only to be used within `GF2Element.__new__()` => rename it into `_to_gf2()` - the test cases in `TestGF2ConstructorWithCastedValue` cover everything in `TestGF2Casting` => retire the redundant test cases and make the test suite run faster
This commit is contained in:
parent
917c217ca0
commit
348cd53767
2 changed files with 3 additions and 74 deletions
|
@ -46,7 +46,7 @@ except ImportError: # pragma: no cover to support Python 3.9 & 3.10
|
||||||
THRESHOLD = 1e-12
|
THRESHOLD = 1e-12
|
||||||
|
|
||||||
|
|
||||||
def to_gf2(
|
def _to_gf2(
|
||||||
value: complex, # `mypy` reads `complex | float | int`
|
value: complex, # `mypy` reads `complex | float | int`
|
||||||
*,
|
*,
|
||||||
strict: bool = True,
|
strict: bool = True,
|
||||||
|
@ -148,7 +148,7 @@ class GF2Element(metaclass=GF2Meta):
|
||||||
msg = "Must create `one` and `zero` first (internal error)"
|
msg = "Must create `one` and `zero` first (internal error)"
|
||||||
raise RuntimeError(msg) from None
|
raise RuntimeError(msg) from None
|
||||||
else:
|
else:
|
||||||
value = to_gf2(value, strict=strict, threshold=threshold) # type: ignore[arg-type]
|
value = _to_gf2(value, strict=strict, threshold=threshold) # type: ignore[arg-type]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return cls._instances[value]
|
return cls._instances[value]
|
||||||
|
|
|
@ -19,8 +19,6 @@ one, zero = (
|
||||||
galois.zero,
|
galois.zero,
|
||||||
)
|
)
|
||||||
|
|
||||||
to_gf2 = galois.to_gf2
|
|
||||||
|
|
||||||
gf2, GF2One, GF2Zero = (
|
gf2, GF2One, GF2Zero = (
|
||||||
galois.gf2,
|
galois.gf2,
|
||||||
galois.GF2One,
|
galois.GF2One,
|
||||||
|
@ -89,77 +87,8 @@ def test_thresholds():
|
||||||
assert within_threshold < default_threshold < not_within_threshold
|
assert within_threshold < default_threshold < not_within_threshold
|
||||||
|
|
||||||
|
|
||||||
class TestGF2Casting:
|
|
||||||
"""Test the `to_gf2()` function.
|
|
||||||
|
|
||||||
`to_gf2(...)` casts numbers into either `1` or `0`.
|
|
||||||
"""
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("value", strict_one_like_values)
|
|
||||||
def test_cast_ones_strictly(self, value):
|
|
||||||
"""`to_gf2(value, strict=True)` returns `1`."""
|
|
||||||
result1 = to_gf2(value) # `strict=True` by default
|
|
||||||
assert result1 == 1
|
|
||||||
|
|
||||||
result2 = to_gf2(value, strict=True)
|
|
||||||
assert result2 == 1
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("value", one_like_values)
|
|
||||||
def test_cast_ones_not_strictly(self, value):
|
|
||||||
"""`to_gf2(value, strict=False)` returns `1`."""
|
|
||||||
result = to_gf2(value, strict=False)
|
|
||||||
assert result == 1
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("value", non_strict_one_like_values)
|
|
||||||
def test_cannot_cast_ones_strictly(self, value):
|
|
||||||
"""`to_gf2(value, strict=False)` returns `1`."""
|
|
||||||
with pytest.raises(ValueError, match="`1`-like or `0`-like"):
|
|
||||||
to_gf2(value)
|
|
||||||
|
|
||||||
with pytest.raises(ValueError, match="`1`-like or `0`-like"):
|
|
||||||
to_gf2(value, strict=True)
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("value", zero_like_values)
|
|
||||||
def test_cast_zeros(self, value):
|
|
||||||
"""`to_gf2(value, strict=...)` returns `0`."""
|
|
||||||
result1 = to_gf2(value) # `strict=True` by default
|
|
||||||
assert result1 == 0
|
|
||||||
|
|
||||||
result2 = to_gf2(value, strict=True)
|
|
||||||
assert result2 == 0
|
|
||||||
|
|
||||||
result3 = to_gf2(value, strict=False)
|
|
||||||
assert result3 == 0
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
|
||||||
"value",
|
|
||||||
[
|
|
||||||
complex(1, not_within_threshold),
|
|
||||||
complex(0, not_within_threshold),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
@pytest.mark.parametrize("strict", [True, False])
|
|
||||||
def test_cannot_cast_with_non_zero_imag_part(self, value, strict):
|
|
||||||
"""Cannot create `1` or `0` if `.imag != 0`."""
|
|
||||||
with pytest.raises(ValueError, match="`1`-like or `0`-like"):
|
|
||||||
to_gf2(value, strict=strict)
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("value", ["abc", (1,), [1]])
|
|
||||||
@pytest.mark.parametrize("strict", [True, False])
|
|
||||||
def test_cannot_cast_from_wrong_type(self, value, strict):
|
|
||||||
"""Cannot create `1` or `0` from a non-numeric value."""
|
|
||||||
with pytest.raises(TypeError):
|
|
||||||
to_gf2(value, strict=strict)
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("strict", [True, False])
|
|
||||||
def test_cannot_cast_from_nan_value(self, strict):
|
|
||||||
"""Cannot create `1` or `0` from undefined value."""
|
|
||||||
with pytest.raises(ValueError, match="`1`-like or `0`-like"):
|
|
||||||
to_gf2(float("NaN"), strict=strict)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("cls", [gf2, GF2One, GF2Zero])
|
@pytest.mark.parametrize("cls", [gf2, GF2One, GF2Zero])
|
||||||
class TestGF2ConstructorWithCastedValue:
|
class TestGF2Casting:
|
||||||
"""Test the `gf2` class's constructor.
|
"""Test the `gf2` class's constructor.
|
||||||
|
|
||||||
`gf2(value, ...)` returns either `one` or `zero`.
|
`gf2(value, ...)` returns either `one` or `zero`.
|
||||||
|
|
Loading…
Reference in a new issue