from pathlib import Path import pytest from engine.defs import DefRegistry from engine.map_loader import MapLoader from engine.world_creation import ( AVAILABLE_WORLD_TEMPLATES, GENERATED_WORLD_SIZE, WorldCreationMenu, build_world_from_template, find_spawn_position, ) DEFS_DIR = Path(__file__).resolve().parent.parent / "resources" / "defs" @pytest.fixture() def registry(): return DefRegistry.load(DEFS_DIR) @pytest.fixture() def map_loader(): return MapLoader(DEFS_DIR / "maps") # --- WorldCreationMenu ----------------------------------------------------------------------- def test_menu_starts_with_the_available_templates(): menu = WorldCreationMenu() assert [t.id for t in menu.templates] == [t.id for t in AVAILABLE_WORLD_TEMPLATES] assert menu.selected_index is None def test_available_templates_are_test_map_and_generated(): assert [t.id for t in AVAILABLE_WORLD_TEMPLATES] == ["test_map", "generated"] def test_select_sets_selected_index(): menu = WorldCreationMenu() menu.select(0) assert menu.selected_index == 0 def test_select_out_of_range_is_ignored(): menu = WorldCreationMenu() menu.select(99) assert menu.selected_index is None def test_selected_template_reads_back_the_right_one(): menu = WorldCreationMenu() menu.select(0) assert menu.selected_template() is AVAILABLE_WORLD_TEMPLATES[0] def test_selected_template_none_before_any_selection(): menu = WorldCreationMenu() assert menu.selected_template() is None # --- build_world_from_template ------------------------------------------------------------------ def test_build_world_from_template_loads_the_map_and_its_embeddings(registry, map_loader): template = AVAILABLE_WORLD_TEMPLATES[0] world = build_world_from_template(template, registry, map_loader) assert "harbor_world" in world.maps assert "ship_test" in world.maps # embedded child map also gets added assert world.entities == {} # world creation alone spawns no one def test_build_world_from_template_generates_a_procedural_map_for_the_generated_template(registry, map_loader): generated_template = next(t for t in AVAILABLE_WORLD_TEMPLATES if t.id == "generated") world = build_world_from_template(generated_template, registry, map_loader, seed=42) assert "generated" in world.maps generated_map = world.maps["generated"] assert (generated_map.width, generated_map.height) == (GENERATED_WORLD_SIZE, GENERATED_WORLD_SIZE) assert world.entities == {} def test_build_world_from_template_generation_is_deterministic_for_the_same_seed(registry, map_loader): generated_template = next(t for t in AVAILABLE_WORLD_TEMPLATES if t.id == "generated") world_a = build_world_from_template(generated_template, registry, map_loader, seed=7) world_b = build_world_from_template(generated_template, registry, map_loader, seed=7) map_a, map_b = world_a.maps["generated"], world_b.maps["generated"] for y in range(map_a.height): for x in range(map_a.width): assert map_a.get_tile(x, y, 0).layer_id("flooring") == map_b.get_tile(x, y, 0).layer_id("flooring") # --- find_spawn_position ------------------------------------------------------------------------- def test_find_spawn_position_lands_on_a_walkable_dry_tile(registry, map_loader): template = AVAILABLE_WORLD_TEMPLATES[0] world = build_world_from_template(template, registry, map_loader) position = find_spawn_position(world.maps["harbor_world"], registry) assert position is not None tile = world.maps["harbor_world"].get_tile(position.x, position.y, position.z) assert tile.is_walkable(registry) is True assert tile.roof is None assert tile.layer_id("flooring") != "water" def test_find_spawn_position_works_on_a_generated_map(registry, map_loader): generated_template = next(t for t in AVAILABLE_WORLD_TEMPLATES if t.id == "generated") world = build_world_from_template(generated_template, registry, map_loader, seed=42) position = find_spawn_position(world.maps["generated"], registry) assert position is not None assert position.map_id == "generated"