From 1a122b85e5c0502e598b2130ba19275a393ce955 Mon Sep 17 00:00:00 2001 From: Jared Miller Date: Sun, 8 Feb 2026 13:32:49 -0500 Subject: [PATCH] Add collision detection tests --- tests/test_collision_detection.py | 124 ++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 tests/test_collision_detection.py diff --git a/tests/test_collision_detection.py b/tests/test_collision_detection.py new file mode 100644 index 0000000..1e8156c --- /dev/null +++ b/tests/test_collision_detection.py @@ -0,0 +1,124 @@ +"""Test collision detection when registering commands.""" + +import logging + +import pytest + +from mudlib.commands import CommandDefinition, _registry, register + + +@pytest.fixture(autouse=True) +def clean_registry(): + """Save and restore registry around each test.""" + saved = dict(_registry) + _registry.clear() + yield + _registry.clear() + _registry.update(saved) + + +async def dummy_handler(player, args): + """Placeholder command handler.""" + pass + + +async def other_handler(player, args): + """Another placeholder command handler.""" + pass + + +def test_registering_command_adds_to_registry(): + """Baseline: registering a command adds it to registry.""" + defn = CommandDefinition(name="test", handler=dummy_handler) + register(defn) + assert "test" in _registry + assert _registry["test"] is defn + + +def test_registering_same_command_again_does_not_warn(caplog): + """Registering same command definition again does not warn.""" + defn = CommandDefinition(name="test", handler=dummy_handler) + + with caplog.at_level(logging.WARNING): + register(defn) + register(defn) + + assert len(caplog.records) == 0 + + +def test_registering_different_command_with_same_name_warns(caplog): + """Registering different command with same name warns.""" + defn1 = CommandDefinition(name="test", handler=dummy_handler) + defn2 = CommandDefinition(name="test", handler=other_handler) + + with caplog.at_level(logging.WARNING): + register(defn1) + register(defn2) + + assert len(caplog.records) == 1 + assert "collision" in caplog.records[0].message.lower() + assert "test" in caplog.records[0].message + assert _registry["test"] is defn2 # last-registered wins + + +def test_command_alias_collides_with_existing_command_name(caplog): + """Registering command whose alias collides with existing name warns.""" + defn1 = CommandDefinition(name="north", handler=dummy_handler) + defn2 = CommandDefinition(name="navigate", handler=other_handler, aliases=["north"]) + + with caplog.at_level(logging.WARNING): + register(defn1) + register(defn2) + + assert len(caplog.records) == 1 + assert "collision" in caplog.records[0].message.lower() + assert "north" in caplog.records[0].message + + +def test_command_alias_collides_with_different_command_alias(caplog): + """Registering command whose alias collides with different command's alias warns.""" + defn1 = CommandDefinition(name="southwest", handler=dummy_handler, aliases=["sw"]) + defn2 = CommandDefinition(name="sweep", handler=other_handler, aliases=["sw"]) + + with caplog.at_level(logging.WARNING): + register(defn1) + register(defn2) + + assert len(caplog.records) == 1 + assert "collision" in caplog.records[0].message.lower() + assert "sw" in caplog.records[0].message + + +def test_warning_message_includes_both_command_names(caplog): + """Warning message includes both the existing and new command names.""" + defn1 = CommandDefinition(name="existing", handler=dummy_handler) + defn2 = CommandDefinition(name="newcomer", handler=other_handler) + + with caplog.at_level(logging.WARNING): + register(defn1) + register(defn2) # both have name "newcomer" but defn2 overwrites + + # Re-register to trigger collision + defn3 = CommandDefinition(name="existing", handler=other_handler) + with caplog.at_level(logging.WARNING): + caplog.clear() + register(defn3) + + assert len(caplog.records) == 1 + record = caplog.records[0].message + assert "existing" in record + # Should show both the existing command name and the new one + assert "existing" in record + + +def test_same_definition_multiple_aliases_no_warning(caplog): + """Same definition registering multiple aliases to itself doesn't warn.""" + defn = CommandDefinition(name="test", handler=dummy_handler, aliases=["t", "tst"]) + + with caplog.at_level(logging.WARNING): + register(defn) + + assert len(caplog.records) == 0 + assert _registry["test"] is defn + assert _registry["t"] is defn + assert _registry["tst"] is defn