"""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()