85 lines
3.3 KiB
Python
Executable File
85 lines
3.3 KiB
Python
Executable File
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"], "01 80")
|
|
|
|
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": "driver",
|
|
"axis": "longitudinal",
|
|
"position_pct": 35,
|
|
},
|
|
{
|
|
"action_type": "position",
|
|
"target": "driver",
|
|
"axis": "backrest_recline",
|
|
"position_pct": 60,
|
|
},
|
|
],
|
|
"deferred_requests": [],
|
|
"ambiguities": [],
|
|
"decision_summary": ["Move two driver-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"], "Driver_Seat_Motion_Command_550")
|
|
self.assertEqual(first["signals"]["Longitudinal_Target_Pct"], 35)
|
|
self.assertEqual(first["signals"]["Motion_Enable_Mask"], 1)
|
|
self.assertEqual(first["completion"]["message"], "Driver_Seat_Motion_Status_558")
|
|
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"], "0x550")
|
|
self.assertEqual(frame["payload_size"], 8)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|