Add collision detection tests
This commit is contained in:
parent
f1e4cfa4dd
commit
1a122b85e5
1 changed files with 124 additions and 0 deletions
124
tests/test_collision_detection.py
Normal file
124
tests/test_collision_detection.py
Normal file
|
|
@ -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
|
||||||
Loading…
Reference in a new issue