Files
troupe-standup/wizard-work/beam/test_handle_resolve.py
T

67 lines
2.8 KiB
Python

"""Cells for handle_resolve.py (Q85): longest-roster-prefix handle resolution.
The module carried a `selftest()` of ten cases and no collected cell, so a
regression in `resolve_handle` moved nothing the gate reads. These cells assert
the ten cases through the entry point, then pin the two rules a reader has to
know: the boundary is a hyphen (not a string prefix), and the LONGEST match
wins when the roster nests one handle inside another.
"""
import unittest
import handle_resolve
from handle_resolve import resolve_handle
class TestResolveHandle(unittest.TestCase):
def test_documented_cases(self):
cases = [
(("volt", {"volt"}), "volt"),
(("volt-02", {"volt"}), "volt"),
(("voltmeter", {"volt"}), None),
(("volt", {"volt", "vol"}), "volt"),
(("cassian-q5-census", {"cassian"}), "cassian"),
(("gandalf", {"volt"}), None),
(("", {"volt"}), None),
(("volt-02", set()), None),
(("VOLT-02", {"volt"}), "volt"),
(("zephyrus-02", {"zephyrus", "zephyrus-0"}), "zephyrus"),
]
for args, expected in cases:
self.assertEqual(resolve_handle(*args), expected, args)
def test_boundary_is_a_hyphen_not_a_string_prefix(self):
for name in ("voltmeter", "volt2", "voltaire", "volts"):
self.assertIsNone(resolve_handle(name, {"volt"}), name)
self.assertEqual(resolve_handle("volt-2", {"volt"}), "volt")
def test_longest_handle_wins(self):
self.assertEqual(resolve_handle("zephyrus-0-02", {"zephyrus", "zephyrus-0"}), "zephyrus-0")
self.assertEqual(resolve_handle("a-b-c", {"a", "a-b", "a-b-c"}), "a-b-c")
def test_exact_match_beats_a_longer_non_match(self):
self.assertEqual(resolve_handle("volt-02", {"volt", "volt-03"}), "volt")
def test_case_insensitive_both_ways(self):
self.assertEqual(resolve_handle("Volt-02", {"VOLT"}), "volt")
self.assertEqual(resolve_handle("volt-02", {"VoLt"}), "volt")
def test_roster_noise_is_ignored(self):
# Empty handles and None rosters are tolerated, not crashed on.
self.assertEqual(resolve_handle("volt-02", {"", "volt"}), "volt")
self.assertIsNone(resolve_handle("volt", None))
self.assertIsNone(resolve_handle(None, {"volt"}))
def test_returns_the_roster_spelling_lowercased(self):
# The result is a roster handle, so it is a set member -- lowercased.
roster = {"Volt", "volt-0"}
self.assertEqual(resolve_handle("VOLT-0-02", roster), "volt-0")
self.assertIn(resolve_handle("VOLT-02", roster), {h.lower() for h in roster})
def test_module_selftest_exits_zero(self):
# The file's own __main__ contract, which nothing collected could see.
self.assertEqual(handle_resolve.selftest(), 0)
if __name__ == "__main__":
unittest.main()