40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
"""Tests for the independent physical-line alignment overlay."""
|
|
|
|
import pytest
|
|
|
|
from linkerhand_calibration.alignment_view import (
|
|
summarize_alignment_measurements,
|
|
)
|
|
|
|
|
|
def _measurement(angle: float, offset: float, y: float) -> dict:
|
|
return {
|
|
"line_xyxy_px": [0.0, y, 100.0, y - angle * 100.0],
|
|
"angle_rad": angle,
|
|
"vertical_offset_px": offset,
|
|
}
|
|
|
|
|
|
def test_line_summary_smooths_only_physical_line_measurements() -> None:
|
|
"""The overlay smooths scene lines without any Tag orientation input."""
|
|
result = summarize_alignment_measurements(
|
|
[
|
|
_measurement(-0.02, -4.0, 80.0),
|
|
None,
|
|
_measurement(0.00, 0.0, 82.0),
|
|
_measurement(0.02, 4.0, 84.0),
|
|
]
|
|
)
|
|
|
|
assert result is not None
|
|
assert result["angle_rad"] == pytest.approx(0.0)
|
|
assert result["vertical_offset_px"] == pytest.approx(0.0)
|
|
assert result["line_xyxy_px"] == pytest.approx([0.0, 82.0, 100.0, 82.0])
|
|
assert result["detected_frames"] == 3
|
|
assert result["window_frames"] == 4
|
|
|
|
|
|
def test_line_summary_returns_none_without_scene_line() -> None:
|
|
"""No blue line is fabricated when the scene has no valid long edge."""
|
|
assert summarize_alignment_measurements([None, None]) is None
|