114 lines
4.1 KiB
Python
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"
|