67 lines
2.8 KiB
Python
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()
|