Files
Mini-Nav/mini-nav/tests/test_topdown_map.py

127 lines
3.7 KiB
Python

from types import SimpleNamespace
import pytest
from simulator import (
TopDownRenderStyle,
TopDownSceneElements,
render_topdown_scene_map,
)
class _FakeMaps:
def __init__(self):
self.to_grid_calls: list[tuple[float, float]] = []
def get_topdown_map(self, pathfinder, height, meters_per_pixel):
return [[0, 0], [0, 0]]
def to_grid(self, z, x, shape, pathfinder):
self.to_grid_calls.append((z, x))
return (int(z), int(x))
class _FakePlt:
def __init__(self):
self.scatter_calls: list[tuple[int, int]] = []
self.text_calls: list[str] = []
self.shown = False
def figure(self, figsize):
return None
def imshow(self, image, cmap):
return None
def scatter(self, x, y, c, s):
self.scatter_calls.append((x, y))
def text(self, x, y, text, color, fontsize):
self.text_calls.append(text)
def title(self, title):
return None
def axis(self, mode):
return None
def show(self):
self.shown = True
def test_render_topdown_scene_map_renders_room_nodes_only():
fake_maps = _FakeMaps()
fake_plt = _FakePlt()
room_nodes = [
SimpleNamespace(room_id="room_00", center=[1.0, 2.0, 3.0]),
SimpleNamespace(room_id="room_01", center=[4.0, 2.0, 5.0]),
]
elements = TopDownSceneElements(room_nodes=room_nodes)
top_down_map = render_topdown_scene_map(
pathfinder=SimpleNamespace(),
elements=elements,
meters_per_pixel=0.05,
style=TopDownRenderStyle(),
maps_module=fake_maps,
plt_module=fake_plt,
)
assert top_down_map == [[0, 0], [0, 0]]
assert fake_maps.to_grid_calls == [(3.0, 1.0), (5.0, 4.0)]
assert fake_plt.scatter_calls == [(1, 3), (4, 5)]
assert fake_plt.text_calls == ["room_00", "room_01"]
assert fake_plt.shown is True
def test_render_topdown_scene_map_validates_room_nodes():
with pytest.raises(ValueError, match="room_nodes"):
render_topdown_scene_map(
pathfinder=SimpleNamespace(),
elements=TopDownSceneElements(room_nodes=[]),
meters_per_pixel=0.05,
maps_module=_FakeMaps(),
plt_module=_FakePlt(),
)
def test_render_topdown_scene_map_validates_meters_per_pixel():
with pytest.raises(ValueError, match="meters_per_pixel"):
render_topdown_scene_map(
pathfinder=SimpleNamespace(),
elements=TopDownSceneElements(
room_nodes=[SimpleNamespace(room_id="room_00", center=[0.0, 1.0, 0.0])]
),
meters_per_pixel=0,
maps_module=_FakeMaps(),
plt_module=_FakePlt(),
)
def test_render_topdown_scene_map_rejects_object_nodes_before_implementation():
with pytest.raises(NotImplementedError, match="object_nodes"):
render_topdown_scene_map(
pathfinder=SimpleNamespace(),
elements=TopDownSceneElements(
room_nodes=[SimpleNamespace(room_id="room_00", center=[0.0, 1.0, 0.0])],
object_nodes=[SimpleNamespace(obj_id="obj_00")],
),
meters_per_pixel=0.05,
maps_module=_FakeMaps(),
plt_module=_FakePlt(),
)
def test_render_topdown_scene_map_rejects_edges_before_implementation():
with pytest.raises(NotImplementedError, match="edge"):
render_topdown_scene_map(
pathfinder=SimpleNamespace(),
elements=TopDownSceneElements(
room_nodes=[SimpleNamespace(room_id="room_00", center=[0.0, 1.0, 0.0])],
edges=[("room_00", "obj_00")],
),
meters_per_pixel=0.05,
maps_module=_FakeMaps(),
plt_module=_FakePlt(),
)