from __future__ import annotations import importlib.util from pathlib import Path import sys import pytest MODULE_PATH = ( Path(__file__).resolve().parents[1] / "tools" / "realsense_multi_camera_test.py" ) SPEC = importlib.util.spec_from_file_location("realsense_multi_camera_test", MODULE_PATH) assert SPEC is not None and SPEC.loader is not None camera_test = importlib.util.module_from_spec(SPEC) sys.modules[SPEC.name] = camera_test SPEC.loader.exec_module(camera_test) def devices() -> list[camera_test.DeviceInfo]: return [ camera_test.DeviceInfo("Intel RealSense D405", "D405", "412622272532", "3.2"), camera_test.DeviceInfo("Intel RealSense D455", "D455", "234222303366", "3.2"), camera_test.DeviceInfo("Intel RealSense D405", "D405", "260322272273", "3.2"), ] def test_assigns_camera_roles_with_and_without_left_serial() -> None: unidentified = camera_test.assign_camera_roles(devices(), None) assert [camera.role for camera in unidentified] == ["GLOBAL", "D405-A", "D405-B"] assert [camera.serial for camera in unidentified[1:]] == ["260322272273", "412622272532"] identified = camera_test.assign_camera_roles(devices(), "412622272532") assert {camera.role: camera.serial for camera in identified} == { "GLOBAL": "234222303366", "LEFT": "412622272532", "RIGHT": "260322272273", } def test_rejects_invalid_camera_selection() -> None: with pytest.raises(ValueError, match="左臂序列号"): camera_test.assign_camera_roles(devices(), "missing") with pytest.raises(ValueError, match="2 台 D405 和 1 台 D455"): camera_test.assign_camera_roles(devices()[:-1], None) def test_counts_frame_number_gaps() -> None: stats = camera_test.FrameStats(target_fps=30, start_time=0.0) stats.update(10, 0.0) stats.update(11, 1.0 / 30.0) stats.update(14, 2.0 / 30.0) assert stats.received == 3 assert stats.dropped == 2 assert stats.drop_rate == pytest.approx(0.4) assert stats.average_fps(2.0 / 30.0) == pytest.approx(30.0) def test_snapshot_names_follow_camera_roles() -> None: identified = camera_test.assign_camera_roles(devices(), "412622272532") assert camera_test.snapshot_filenames(identified) == { "234222303366": "global.png", "412622272532": "left.png", "260322272273": "right.png", } unidentified = camera_test.assign_camera_roles(devices(), None) assert camera_test.snapshot_filenames(unidentified) == { "234222303366": "global.png", "260322272273": "d405_260322272273.png", "412622272532": "d405_412622272532.png", }