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(), )