Mi2dRPGamEng/tests/test_dev_tools.py

119 lines
3.7 KiB
Python

from pathlib import Path
import pytest
from engine.character import Character
from engine.defs import DefRegistry
from engine.dev_config import DevConfig
from engine.dev_tools import DevSpawnMenu, DevTurretMenu
from engine.inventory import Inventory
DEFS_DIR = Path(__file__).resolve().parent.parent / "resources" / "defs"
@pytest.fixture()
def registry():
return DefRegistry.load(DEFS_DIR)
def make_human(registry, **kwargs) -> Character:
return Character(species_id="human", default_body_parts=registry.new_default_body_parts("human"), **kwargs)
# --- DevSpawnMenu -------------------------------------------------------------------------------
def test_menu_defaults_to_every_loaded_non_secret_item_def_sorted(registry):
menu = DevSpawnMenu(registry)
expected = sorted(def_id for def_id, item_def in registry.item_defs.items() if not item_def.secret)
assert menu.item_ids == expected
assert menu.selected_item_id() == menu.item_ids[0]
def test_menu_excludes_secret_items(registry):
menu = DevSpawnMenu(registry)
assert "cyberdeck_the_miro_model_3a" not in menu.item_ids
def test_cycle_wraps_around(registry):
menu = DevSpawnMenu(registry)
menu.cycle(-1)
assert menu.selected_item_id() == menu.item_ids[-1]
def test_spawn_into_places_the_item_when_inventory_has_room(registry):
menu = DevSpawnMenu(registry)
character = make_human(registry)
character.inventory = Inventory(4, 4)
assert menu.spawn_into(character) is True
assert len(character.inventory.items()) == 1
def test_spawn_into_fails_without_an_inventory(registry):
menu = DevSpawnMenu(registry)
character = make_human(registry)
assert menu.spawn_into(character) is False
def test_spawn_into_fails_when_inventory_is_full(registry):
menu = DevSpawnMenu(registry)
character = make_human(registry)
character.inventory = Inventory(1, 1)
item_def = registry.get_item_def(menu.selected_item_id())
if item_def.width > 1 or item_def.height > 1:
pytest.skip("first item def doesn't fit a 1x1 inventory to begin with")
assert menu.spawn_into(character) is True
assert menu.spawn_into(character) is False
# --- DevTurretMenu --------------------------------------------------------------------------------
def test_turret_menu_defaults_to_every_turret_entity_def_sorted(registry):
menu = DevTurretMenu(registry)
assert menu.entity_def_ids == ["turret_autocannon", "turret_pistol"]
assert menu.selected_entity_def_id() == "turret_autocannon"
def test_turret_menu_excludes_non_turret_entity_defs(registry):
menu = DevTurretMenu(registry)
assert "player" not in menu.entity_def_ids
assert "npc_reptilian" not in menu.entity_def_ids
assert "companion_dog" not in menu.entity_def_ids
def test_turret_menu_cycle_wraps_around(registry):
menu = DevTurretMenu(registry)
menu.cycle(-1)
assert menu.selected_entity_def_id() == menu.entity_def_ids[-1]
def test_turret_menu_selected_entity_def_id_is_none_when_empty(registry):
menu = DevTurretMenu(registry)
menu.entity_def_ids = []
assert menu.selected_entity_def_id() is None
# --- DevConfig ------------------------------------------------------------------------------------
def test_dev_config_defaults_to_disabled_when_file_missing(tmp_path):
config = DevConfig.load(tmp_path / "does_not_exist.conf")
assert config.enabled is False
def test_dev_config_toggle_flips_the_flag():
config = DevConfig()
config.toggle()
assert config.enabled is True
config.toggle()
assert config.enabled is False
def test_dev_config_save_and_reload_round_trips(tmp_path):
path = tmp_path / "dev.conf"
config = DevConfig(enabled=True)
config.save(path)
reloaded = DevConfig.load(path)
assert reloaded.enabled is True