"""Tests for the map YAML schema (map.py).""" from __future__ import annotations from pathlib import Path import pytest from pf1e_simulator.map import MapValidationError, load_map, zone_cells MAPS_DIR = Path(__file__).resolve().parents[1] / "data" / "maps" def _write(tmp_path: Path, body: str) -> Path: target = tmp_path / "map.yaml" target.write_text(body, encoding="utf-8") return target def _minimal_map() -> str: return """ name: "Test" terrain: | ### #.# ### legend: "#": { type: wall, blocks_los: true } ".": { type: floor, move_cost: 1 } """ def test_sample_arena_loads() -> None: spec = load_map(MAPS_DIR / "sample_arena.yaml") assert spec.square_size_ft == 5 assert len(spec.terrain) == 8 assert all(len(row) == 20 for row in spec.terrain) assert spec.legend["#"].move_cost is None assert spec.legend["#"].blocks_los is True assert spec.legend["C"].cover is True assert spec.legend["T"].move_cost == 2 assert spec.deployment == {"players": "A", "monsters": "B"} assert spec.markers["autel"] == (1, 16) def test_sample_arena_zones_and_elevation() -> None: spec = load_map(MAPS_DIR / "sample_arena.yaml") assert spec.elevation is not None assert spec.elevation[1][2] == "1" cells_a = zone_cells(spec, "A") assert cells_a == [ (1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4), ] assert len(zone_cells(spec, "B")) == 8 def test_minimal_map_without_optional_layers(tmp_path: Path) -> None: spec = load_map(_write(tmp_path, _minimal_map())) assert spec.elevation is None assert spec.zones is None assert spec.markers == {} assert zone_cells(spec, "A") == [] def test_rejects_ragged_rows(tmp_path: Path) -> None: body = _minimal_map().replace(" #.#\n", " #.##\n") with pytest.raises(MapValidationError): load_map(_write(tmp_path, body)) def test_rejects_char_missing_from_legend(tmp_path: Path) -> None: body = _minimal_map().replace(" #.#\n", " #x#\n") with pytest.raises(MapValidationError): load_map(_write(tmp_path, body)) def test_rejects_elevation_dimension_mismatch(tmp_path: Path) -> None: body = _minimal_map() + "elevation: |\n 000\n 00\n" with pytest.raises(MapValidationError): load_map(_write(tmp_path, body)) def test_rejects_marker_out_of_bounds(tmp_path: Path) -> None: body = _minimal_map() + "markers:\n autel: [9, 1]\n" with pytest.raises(MapValidationError): load_map(_write(tmp_path, body)) def test_rejects_deployment_without_zone(tmp_path: Path) -> None: body = _minimal_map() + "zones: |\n ...\n .A.\n ...\ndeployment:\n players: B\n" with pytest.raises(MapValidationError): load_map(_write(tmp_path, body))