from __future__ import annotations import unittest from pathlib import Path from seat_domain.compiler import SeatCompiler from seat_domain.generator import build_function_config from seat_domain.intent import parse_local_intent from seat_domain.matrix import SeatCanMatrix DOMAIN_ROOT = Path(__file__).resolve().parents[2] class MatrixCompilerTests(unittest.TestCase): def setUp(self) -> None: self.matrix = SeatCanMatrix(DOMAIN_ROOT / "can" / "seat-thermal-matrix.yaml") self.combined_matrix = SeatCanMatrix( [ DOMAIN_ROOT / "can" / "seat-thermal-matrix.yaml", DOMAIN_ROOT / "can" / "seat-motion-virtual-matrix.yaml", ] ) self.compiler = SeatCompiler(DOMAIN_ROOT / "can" / "signal-mapping.yaml") def test_encodes_combined_control_bits(self) -> None: parsed = parse_local_intent("打开副驾座椅通风,同时关闭副驾座椅加热") config = build_function_config(parsed, "req-test-001", "local_rules") plan = self.compiler.compile(config) command = plan["spec"]["commands"][0] frame = self.matrix.encode(command["message"], command["signals"]) self.assertEqual(frame["frame_id"], "0x42A") self.assertEqual(frame["data_hex"], "00 90") def test_compilation_is_deterministic(self) -> None: parsed = parse_local_intent("关闭副驾座椅通风") config = build_function_config(parsed, "req-test-002", "local_rules") self.assertEqual(self.compiler.compile(config), self.compiler.compile(config)) def test_compiles_each_motion_axis_with_feedback_completion(self) -> None: parsed = { "detected_domains": ["seat"], "actions": [ { "action_type": "position", "target": "passenger", "axis": "longitudinal", "position_pct": 35, }, { "action_type": "position", "target": "passenger", "axis": "backrest_recline", "position_pct": 60, }, ], "deferred_requests": [], "ambiguities": [], "decision_summary": ["Move two front-passenger-seat axes."], "confidence": 1.0, } config = build_function_config(parsed, "req-motion-001", "test") plan = self.compiler.compile(config) self.assertEqual(len(plan["spec"]["commands"]), 2) first, second = plan["spec"]["commands"] self.assertEqual(first["message"], "Passenger_Seat_Motion_Command_551") self.assertEqual(first["signals"]["Longitudinal_Target_Pct"], 35) self.assertEqual(first["signals"]["Motion_Enable_Mask"], 1) self.assertEqual(first["completion"]["message"], "Passenger_Seat_Motion_Status_559") self.assertEqual(first["completion"]["signal"], "Longitudinal_Actual_Pct") self.assertEqual(second["signals"]["Backrest_Recline_Target_Pct"], 60) self.assertEqual(second["signals"]["Motion_Enable_Mask"], 4) frame = self.combined_matrix.encode(first["message"], first["signals"]) self.assertEqual(frame["frame_id"], "0x551") self.assertEqual(frame["payload_size"], 8) if __name__ == "__main__": unittest.main()