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