mirror of
https://github.com/SikongJueluo/Mini-Nav.git
synced 2026-07-13 04:25:32 +08:00
127 lines
3.7 KiB
Python
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(),
|
|
)
|