Files
orisys-app/apps/autocal/tests/test_finger_source_panel.py
T
ykcheungab 32dcecb270 接入 Autocal 实时相机及帧时间显示
视频和相机共用 Finger worker,并保留采集时间、源帧编号及媒体时间。通过界面、采集链和真实视频验证。
2026-10-11 12:50:52 +08:00

116 lines
3.7 KiB
Python

"""The Autocal sensor tab drives the shared finger acquisition interface."""
from __future__ import annotations
from types import SimpleNamespace
import numpy as np
class FakeFingerWorker:
def __init__(self, *, on_error):
self.on_error = on_error
self.is_running = False
self.started = None
self.stopped = []
self.packet = None
def start(self, video, *, config_ref):
self.started = (video, config_ref)
self.is_running = True
def stop(self, *, wait=False):
self.stopped.append(wait)
self.is_running = False
def latest(self):
return self.packet
def consume_end_reason(self):
return "stopped"
def test_video_controls_use_shared_worker_and_show_processed_frame(
qt_app, tmp_dir, monkeypatch
):
from orisys_autocal.ui import finger_source_panel
monkeypatch.setattr(
finger_source_panel, "FingerAcquisitionWorker", FakeFingerWorker
)
video = tmp_dir / "input.mp4"
config = tmp_dir / "sensor.json"
video.write_bytes(b"video")
config.write_text("{}", encoding="utf-8")
panel = finger_source_panel.FingerSourcePanel(str(video), str(config))
panel.start_button.click()
assert panel.worker.started == (str(video), str(config))
assert not panel.start_button.isEnabled()
panel.worker.packet = SimpleNamespace(
session_id=1,
frame_id=7,
timestamp=123.5,
processed_frame=np.full((20, 30, 3), (10, 20, 30), dtype=np.uint8),
)
panel._poll()
assert panel._last_image.size().width() == 30
assert panel.frame_label.text().find("7") >= 0
assert not panel.preview.pixmap().isNull()
panel.stop_button.click()
panel._poll()
assert panel.worker.stopped == [False]
assert panel.start_button.isEnabled()
panel.shutdown()
def test_sensor_tab_is_live_panel_and_paths_are_saved(make_window, tmp_dir):
window = make_window()
assert window.workspace.page("sensor") is window.finger_source_panel
window.finger_source_panel.video_path.setText(str(tmp_dir / "input.mp4"))
window.finger_source_panel.config_ref.setText(str(tmp_dir / "sensor.json"))
window.finger_source_panel.source_kind.setCurrentIndex(1)
window.finger_source_panel.camera_index.setValue(3)
window._persist_prefs()
assert window.prefs["finger_video_path"].endswith("input.mp4")
assert window.prefs["finger_config_ref"].endswith("sensor.json")
assert window.prefs["finger_source_kind"] == "camera"
assert window.prefs["finger_camera_index"] == 3
def test_live_camera_uses_integer_source_and_same_worker(qt_app, tmp_dir, monkeypatch):
from orisys_autocal.ui import finger_source_panel
monkeypatch.setattr(
finger_source_panel, "FingerAcquisitionWorker", FakeFingerWorker
)
config = tmp_dir / "sensor.json"
config.write_text("{}", encoding="utf-8")
panel = finger_source_panel.FingerSourcePanel(
config_ref=str(config), source_kind="camera", camera_index=3
)
panel.start_button.click()
assert panel.worker.started == (3, str(config))
assert not panel.camera_index.isEnabled()
panel.stop_button.click()
panel._poll()
assert panel.camera_index.isEnabled()
panel.shutdown()
def test_missing_input_is_visible_and_does_not_start_worker(qt_app, monkeypatch):
from orisys_autocal.ui import finger_source_panel
monkeypatch.setattr(
finger_source_panel, "FingerAcquisitionWorker", FakeFingerWorker
)
panel = finger_source_panel.FingerSourcePanel()
panel.start_button.click()
assert panel.worker.started is None
assert panel.start_button.isEnabled()
assert panel._error
assert panel._error in panel.status_label.text()
panel.shutdown()