pylib_ai_arm_statements/tests/test_structure.py

107 lines
4.6 KiB
Python

from datetime import date
from arm_statements.evaluation import EvalLine
from arm_statements.loader import Rules
from arm_statements.model import DocumentType, Edition, FormVariant, LineStatus
from arm_statements.structure import choose_edition, confirm_codes
BAL = DocumentType.BALANCE
Q3_2025 = date(2025, 9, 30)
FULL_CONF = 100.0
def seq(*items: tuple[str, float]) -> list[EvalLine]:
return [EvalLine(f"r{i}", i, LineStatus.OK, code, conf, False, ()) for i, (code, conf) in enumerate(items)]
def unconfirmed(lines: list[EvalLine], rules: Rules, effective: date | None = Q3_2025) -> set[str]:
return set(confirm_codes(lines, BAL, FormVariant.FULL, effective, rules).unconfirmed)
def test_uncertain_code_in_place(rules: Rules) -> None:
assert unconfirmed(seq(("1220", 100.0), ("1230", 50.0), ("1240", 100.0)), rules) == set()
def test_swapped_uncertain_neighbours(rules: Rules) -> None:
lines = seq(("1210", 100.0), ("1230", 50.0), ("1220", 50.0), ("1240", 100.0))
assert unconfirmed(lines, rules) == {"r1", "r2"}
def test_conflicting_anchors(rules: Rules) -> None:
lines = seq(("1210", 100.0), ("1240", 100.0), ("1230", 100.0), ("1250", 50.0))
assert unconfirmed(lines, rules) == set()
def test_legal_repeat_1220_fsbu4(rules: Rules) -> None:
lines = seq(("1215", 100.0), ("1220", 100.0), ("1220", 50.0), ("1230", 100.0))
assert unconfirmed(lines, rules) == set()
def test_repeat_outside_orders(rules: Rules) -> None:
lines = seq(("1220", 100.0), ("1230", 100.0), ("1230", 50.0), ("1240", 100.0))
assert unconfirmed(lines, rules) == {"r2"}
def test_66n_blank_in_2025(rules: Rules) -> None:
lines = seq(("1110", 100.0), ("1120", 60.0), ("1130", 100.0))
result = confirm_codes(lines, BAL, FormVariant.FULL, Q3_2025, rules)
assert (result.edition, result.unconfirmed) == (Edition.RAS_66N, frozenset())
def test_tie_resolved_by_date(rules: Rules) -> None:
lines = seq(("1210", 100.0), ("1230", 100.0))
assert confirm_codes(lines, BAL, FormVariant.FULL, Q3_2025, rules).edition is Edition.FSBU4
assert confirm_codes(lines, BAL, FormVariant.FULL, date(2024, 12, 31), rules).edition is Edition.RAS_66N
def test_choose_edition_public(rules: Rules) -> None:
blank_66n = [("1110", True), ("1120", False), ("1130", True)]
assert choose_edition(BAL, blank_66n, Q3_2025, rules) is Edition.RAS_66N
tie = [("1210", True), ("1230", True)]
assert choose_edition(BAL, tie, Q3_2025, rules) is Edition.FSBU4
assert choose_edition(BAL, tie, date(2024, 12, 31), rules) is Edition.RAS_66N
assert choose_edition(BAL, tie, None, rules) is None
assert choose_edition(BAL, [], Q3_2025, rules) is Edition.FSBU4
assert choose_edition(DocumentType.DISCLOSURE, [("5101", True)], date(2024, 12, 31), rules) is Edition.RAS_66N
def test_choose_edition_equals_confirm_codes(rules: Rules) -> None:
lines = seq(("1110", 100.0), ("1120", 60.0), ("1130", 100.0))
pairs = [(ln.line_code or "", (ln.code_confidence or 0.0) >= FULL_CONF) for ln in lines]
expected = confirm_codes(lines, BAL, FormVariant.FULL, Q3_2025, rules).edition
assert choose_edition(BAL, pairs, Q3_2025, rules, variant=FormVariant.FULL) is expected
def test_confident_nonstandard_code_not_flagged(rules: Rules) -> None:
assert unconfirmed(seq(("1230", 100.0), ("1231", 100.0), ("11101", 100.0)), rules) == set()
def test_subline_follows_confirmed_parent(rules: Rules) -> None:
lines = seq(("1220", 100.0), ("1230", 50.0), ("12301", 60.0), ("1240", 100.0))
assert unconfirmed(lines, rules) == set()
orphan = seq(("1220", 100.0), ("12301", 60.0), ("1240", 100.0))
assert unconfirmed(orphan, rules) == {"r1"}
def test_tie_without_date_union_of_editions(rules: Rules) -> None:
lines = seq(("1210", 100.0), ("1230", 50.0))
result = confirm_codes(lines, BAL, FormVariant.FULL, None, rules)
assert result.edition is None
assert result.unconfirmed == frozenset()
def test_disclosure_has_no_unconfirmed(rules: Rules) -> None:
lines = seq(("5101", 50.0))
result = confirm_codes(lines, DocumentType.DISCLOSURE, None, Q3_2025, rules)
assert (result.edition, result.unconfirmed) == (Edition.FSBU4, frozenset())
def test_uncertain_code_outside_order_unconfirmed(rules: Rules) -> None:
assert unconfirmed(seq(("1230", 100.0), ("9999", 50.0), ("1240", 100.0)), rules) == {"r1"}
def test_performance_realistic_size(rules: Rules) -> None:
order = rules.code_orders.sequence(Edition.FSBU4, BAL, FormVariant.FULL)
lines = seq(*[(code, 50.0) for code in order] * 1)
assert confirm_codes(lines, BAL, FormVariant.FULL, Q3_2025, rules).unconfirmed == frozenset()