Mi2dRPGamEng/tests/test_world_creation.py

114 lines
4.1 KiB
Python

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"