91 lines
2.8 KiB
Python
91 lines
2.8 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
|
|
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
|
|
|
|
|
|
# --- 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
|