mud/tests/test_effects.py
Jared Miller 9844749edd
Add fly command with cloud trail effects
fly <direction> moves the player 5 tiles, ignoring terrain. Leaves
a trail of bright white ~ clouds that fade after 2 seconds. Effects
system supports arbitrary timed visual overlays on the viewport.
TinTin aliases: fn/fs/fe/fw/fne/fnw/fse/fsw.
2026-02-07 14:48:42 -05:00

84 lines
2.1 KiB
Python

"""Tests for the temporary visual effects system."""
import time
import pytest
from mudlib.effects import (
Effect,
active_effects,
add_effect,
clear_expired,
get_effects_at,
)
@pytest.fixture(autouse=True)
def clean_effects():
"""Clear effects before and after each test."""
active_effects.clear()
yield
active_effects.clear()
def test_add_effect_creates_entry():
add_effect(10, 20, "~", "\033[1;97m", ttl=2.0)
assert len(active_effects) == 1
e = active_effects[0]
assert e.x == 10
assert e.y == 20
assert e.char == "~"
assert e.color == "\033[1;97m"
def test_add_effect_sets_expiry_from_ttl():
before = time.monotonic()
add_effect(0, 0, "~", "", ttl=2.0)
after = time.monotonic()
e = active_effects[0]
assert before + 2.0 <= e.expires_at <= after + 2.0
def test_get_effects_at_returns_matching():
add_effect(5, 5, "~", "c1", ttl=2.0)
add_effect(5, 5, "~", "c2", ttl=2.0)
add_effect(6, 5, "~", "c3", ttl=2.0)
at_5_5 = get_effects_at(5, 5)
assert len(at_5_5) == 2
assert {e.color for e in at_5_5} == {"c1", "c2"}
def test_get_effects_at_excludes_expired():
add_effect(5, 5, "~", "alive", ttl=10.0)
# manually insert an expired effect
active_effects.append(
Effect(x=5, y=5, char="~", color="dead", expires_at=time.monotonic() - 1.0)
)
at_5_5 = get_effects_at(5, 5)
assert len(at_5_5) == 1
assert at_5_5[0].color == "alive"
def test_clear_expired_removes_old_effects():
add_effect(1, 1, "~", "alive", ttl=10.0)
active_effects.append(
Effect(x=2, y=2, char="~", color="dead", expires_at=time.monotonic() - 1.0)
)
clear_expired()
assert len(active_effects) == 1
assert active_effects[0].color == "alive"
def test_multiple_effects_along_path():
"""Simulates adding a cloud trail along a flight path."""
for i in range(5):
add_effect(10 + i, 20, "~", "\033[1;97m", ttl=2.0)
assert len(active_effects) == 5
# all at y=20, x from 10-14
for i, e in enumerate(active_effects):
assert e.x == 10 + i
assert e.y == 20