"""Tests for calibration transfer helpers."""
from __future__ import annotations
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from so101_hardware.calibration.transfer import (
compute_migrated_limits,
migrate_calibration_data,
)
from so101_hardware.calibration.validation import (
collect_validation_errors,
validate_calibration_data,
)
def test_compute_migrated_limits_applies_special_joint_offset():
range_min, range_max = compute_migrated_limits(
homing_offset=10,
range_min=1000,
range_max=3000,
drive_mode=0,
joint_name="2",
)
assert range_min == 14
assert range_max == 2014
def test_compute_migrated_limits_flips_drive_mode_and_clamps_to_zero():
range_min, range_max = compute_migrated_limits(
homing_offset=300,
range_min=200,
range_max=600,
drive_mode=1,
joint_name="1",
)
assert range_min == 100
assert range_max == 500
def test_migrate_calibration_data_updates_all_except_gripper():
template = {
"1": {"id": 1, "drive_mode": 0, "homing_offset": 0, "range_min": 200, "range_max": 600},
"2": {"id": 2, "drive_mode": 0, "homing_offset": 0, "range_min": 1000, "range_max": 3000},
"3": {"id": 3, "drive_mode": 0, "homing_offset": 0, "range_min": 1000, "range_max": 3000},
"4": {"id": 4, "drive_mode": 0, "homing_offset": 0, "range_min": 200, "range_max": 600},
"5": {"id": 5, "drive_mode": 0, "homing_offset": 0, "range_min": 0, "range_max": 4095},
"6": {"id": 6, "drive_mode": 0, "homing_offset": 0, "range_min": 0, "range_max": 100},
}
legacy = {
"homing_offset": [-100, 10, 20, -100, 0, 0],
"drive_mode": [0, 0, 0, 0, 0, 0],
}
migrated = migrate_calibration_data(template, legacy)
assert migrated["1"]["range_min"] == 0
assert migrated["1"]["range_max"] == 200
assert migrated["2"]["range_min"] == 14
assert migrated["2"]["range_max"] == 2014
assert migrated["3"]["range_min"] == 4
assert migrated["3"]["range_max"] == 2004
assert migrated["6"]["range_min"] == 0
assert migrated["6"]["range_max"] == 100
def test_validate_calibration_data_rejects_invalid_ranges():
invalid = {
"1": {"id": 1, "drive_mode": 0, "homing_offset": 0, "range_min": 500, "range_max": 100},
}
errors = collect_validation_errors(invalid)
assert errors
assert not validate_calibration_data(invalid)
assert "range_min" in errors[0]