mirror of
https://github.com/SikongJueluo/Mini-Nav.git
synced 2026-07-13 04:25:32 +08:00
refactor(simulator): extract habitat simulator and visualization modules
This commit is contained in:
126
mini-nav/tests/test_topdown_map.py
Normal file
126
mini-nav/tests/test_topdown_map.py
Normal file
@@ -0,0 +1,126 @@
|
||||
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(),
|
||||
)
|
||||
Reference in New Issue
Block a user