Get the Damm module tested

This commit is contained in:
Reid 'arrdem' McKenzie 2021-08-03 20:03:16 -06:00
parent 4e35261dd1
commit 1f3854317c
5 changed files with 41 additions and 24 deletions

View file

@ -1,20 +1,6 @@
py_library(
py_project(
name = "damm",
srcs = [
"damm.py",
test_deps = [
py_requirement("hypothesis"),
],
imports = [
"."
],
visibility = [
"//visibility:public",
]
)
py_pytest(
name = "test_damm",
srcs = glob(["test_*.py"]),
deps = [
":damm",
]
)

View file

@ -45,12 +45,20 @@ class Damm(NamedTuple):
return f"{self.__class__.__name__}({self.value}, {self.encode(self.value)})"
@classmethod
def encode(cls, value):
def checkdigit(cls, value: int) -> int:
"""Compute a check digit for a given value."""
state = 0
for digit in str(value):
state = cls.MATRIX[state][int(digit)]
return state
@classmethod
def encode(cls, value: int) -> str:
"""'encode' a value with a check digit."""
return f"{value}-{cls.checkdigit(value)}"
@classmethod
def verify(cls, value: str) -> bool:
"""Verify a Damm encoded number, returning its value if valid.
@ -59,11 +67,13 @@ class Damm(NamedTuple):
the string is correctly Damm encoded, the Damm of the entire string will be 0.
"""
return cls.encode(int(value.replace("-", ""))) == 0
return cls.checkdigit(int(value.replace("-", ""))) == 0
@classmethod
def from_str(cls, value: str) -> "Damm":
"""Verify a Damm coded string, and return its decoding."""
if match := re.fullmatch(cls.DAMM_PATTERN, value):
given_value = match.group("value")
computed_code = cls.encode(given_value)

View file

@ -0,0 +1,15 @@
from damm import Damm
import pytest
@pytest.mark.parametrize('num', [
"0", # 0 itself is the start Damm state
"37", # [0, 3] => 7
"92", # [0, 9] => 2
"1234", # Amusingly, this is a 0-product.
])
def test_num_verifies(num):
"""Assert that known-good Damm checks pass."""
assert Damm.verify(num)

View file

@ -0,0 +1,11 @@
from damm import Damm
from hypothesis import given
from hypothesis.strategies import integers
@given(integers(0, 1<<512))
def test_num_checks_verify(num):
"""Assert the generated Damm check for number verifies."""
assert Damm.verify(Damm.encode(num))

View file

@ -1,5 +0,0 @@
"""
"""
from damm import Damm