backend
This commit is contained in:
@@ -108,6 +108,8 @@ class SeatWebApiTests(unittest.TestCase):
|
||||
self.assertIn('data-twin-function="heating"', html)
|
||||
self.assertIn('class="twin-level-meter"', html)
|
||||
self.assertIn('id="presetIndicator"', html)
|
||||
self.assertIn('id="vehicleSelect"', html)
|
||||
self.assertIn('id="saveModeToggle"', html)
|
||||
self.assertIn('data-domain-panel="climate"', html)
|
||||
self.assertIn('data-domain-panel="roof"', html)
|
||||
self.assertIn('data-domain-panel="ambient_light"', html)
|
||||
@@ -118,6 +120,20 @@ class SeatWebApiTests(unittest.TestCase):
|
||||
self.assertGreaterEqual(runtime["matrix"]["messages"], 25)
|
||||
self.assertGreaterEqual(runtime["matrix"]["signals"], 128)
|
||||
self.assertEqual(runtime["motion_position_range_pct"], [0, 100])
|
||||
self.assertEqual(runtime["default_vehicle_id"], "denza_n7")
|
||||
self.assertEqual(runtime["vehicle"]["name"], "腾势 N7")
|
||||
self.assertIn(
|
||||
"denza_n7",
|
||||
{vehicle["id"] for vehicle in runtime["vehicles"]},
|
||||
)
|
||||
self.assertIn(
|
||||
"zero_gravity",
|
||||
{mode["id"] for mode in runtime["modes"]},
|
||||
)
|
||||
self.assertEqual(
|
||||
runtime["vehicle"]["seat"]["motors"]["longitudinal"]["range"],
|
||||
215,
|
||||
)
|
||||
capability_names = {item["name"] for item in runtime["capabilities"]}
|
||||
self.assertIn("seat.save_posture_preset", capability_names)
|
||||
self.assertIn("seat.apply_posture_preset", capability_names)
|
||||
@@ -135,6 +151,7 @@ class SeatWebApiTests(unittest.TestCase):
|
||||
"utterance": "主驾有点热,有点闷",
|
||||
"provider": "local",
|
||||
"conversation_id": "conv-e2e-browser",
|
||||
"vehicle_id": "denza_n7",
|
||||
}
|
||||
).encode("utf-8"),
|
||||
)
|
||||
@@ -146,6 +163,7 @@ class SeatWebApiTests(unittest.TestCase):
|
||||
self.assertEqual(result["command_plan"]["kind"], "CommandPlan")
|
||||
self.assertEqual(result["execution_report"]["spec"]["mode"], "dry_run")
|
||||
self.assertEqual(result["conversation_id"], "conv-e2e-browser")
|
||||
self.assertEqual(result["vehicle"]["id"], "denza_n7")
|
||||
self.assertEqual(result["actuator_state"]["driver"]["ventilation"]["level"], 1)
|
||||
|
||||
def test_hardware_request_is_rejected_when_server_gate_is_locked(self) -> None:
|
||||
|
||||
@@ -6,6 +6,7 @@ from pathlib import Path
|
||||
from unittest.mock import patch
|
||||
|
||||
from cognitive_agent.application.domain_runtime import ConfiguredDomainRuntime
|
||||
from cognitive_agent.application.mode_profile import ModeProfileRegistry
|
||||
from cognitive_agent.application.seat_service import REPOSITORY_ROOT, SeatDemoService
|
||||
|
||||
|
||||
@@ -219,6 +220,260 @@ class MultiDomainServiceTests(unittest.TestCase):
|
||||
self.assertEqual(result["domain_state"]["roof"]["transmittance_pct"], 20)
|
||||
self.assertEqual(result["conversation_turn"], 2)
|
||||
|
||||
def test_named_mode_profile_executes_without_model_expansion(self) -> None:
|
||||
model_output = {
|
||||
"detected_domains": ["seat"],
|
||||
"requests": [],
|
||||
"ambiguities": [],
|
||||
"decision_summary": ["用户要求调用已有零重力模式。"],
|
||||
"confidence": 0.94,
|
||||
}
|
||||
with patch.object(self.service.openai, "interpret", return_value=model_output):
|
||||
result = self.service.process(
|
||||
"副驾驶进入零重力模式",
|
||||
"openai",
|
||||
"conv-zero-gravity-mode",
|
||||
vehicle_id="denza_n7",
|
||||
)
|
||||
|
||||
self.assertEqual(result["status"], "succeeded")
|
||||
self.assertEqual(result["matched_modes"][0]["id"], "zero_gravity")
|
||||
operations = result["function_config"]["spec"]["operations"]
|
||||
by_capability = {item["capability"]: item for item in operations}
|
||||
self.assertEqual(
|
||||
by_capability["seat.set_longitudinal_position"]["parameters"],
|
||||
{"position_pct": 0},
|
||||
)
|
||||
self.assertEqual(
|
||||
by_capability["seat.set_cushion_tilt"]["parameters"],
|
||||
{"position_pct": 100},
|
||||
)
|
||||
self.assertEqual(
|
||||
by_capability["seat.set_backrest_recline"]["parameters"],
|
||||
{"position_pct": 81, "angle_deg": 150},
|
||||
)
|
||||
self.assertEqual(
|
||||
by_capability["seat.set_legrest_height"]["parameters"],
|
||||
{"position_pct": 87, "angle_deg": 163},
|
||||
)
|
||||
|
||||
def test_named_mode_profile_combines_with_temporary_roof_request(self) -> None:
|
||||
model_output = {
|
||||
"detected_domains": ["roof"],
|
||||
"requests": [
|
||||
{
|
||||
"domain": "roof",
|
||||
"capability": "roof.set_transmittance",
|
||||
"target_scope": "vehicle",
|
||||
"operation": "set",
|
||||
"parameters": [{"name": "transmittance_pct", "value": 20}],
|
||||
"reason": "用户同时要求天幕调暗。",
|
||||
}
|
||||
],
|
||||
"ambiguities": [],
|
||||
"decision_summary": ["零重力之外还需设置天幕。"],
|
||||
"confidence": 0.96,
|
||||
}
|
||||
with patch.object(self.service.openai, "interpret", return_value=model_output):
|
||||
result = self.service.process(
|
||||
"副驾零重力模式,天幕透光率调到20%",
|
||||
"openai",
|
||||
"conv-mode-plus-roof",
|
||||
vehicle_id="denza_n7",
|
||||
)
|
||||
|
||||
self.assertEqual(result["status"], "succeeded")
|
||||
self.assertEqual(set(result["function_configs"]), {"seat", "roof"})
|
||||
self.assertEqual(result["scene_config"]["kind"], "SceneConfig")
|
||||
self.assertEqual(result["domain_state"]["roof"]["transmittance_pct"], 20)
|
||||
self.assertIn(
|
||||
"seat.set_backrest_recline",
|
||||
{
|
||||
item["capability"]
|
||||
for item in result["function_configs"]["seat"]["spec"]["operations"]
|
||||
},
|
||||
)
|
||||
|
||||
def test_reference_mode_library_modes_execute_for_denza(self) -> None:
|
||||
model_output = {
|
||||
"detected_domains": ["seat"],
|
||||
"requests": [],
|
||||
"ambiguities": [],
|
||||
"decision_summary": ["用户要求调用已有长期模式。"],
|
||||
"confidence": 0.95,
|
||||
}
|
||||
utterances = [
|
||||
"副驾驶进入零重力模式",
|
||||
"副驾驶进入巡航沙发模式",
|
||||
"副驾驶进入休闲躺椅模式",
|
||||
"副驾驶进入小憩模式",
|
||||
"副驾驶进入轻松进出模式",
|
||||
"副驾驶进入宝宝午睡模式",
|
||||
"副驾驶进入办公模式",
|
||||
"副驾驶进入冥想空间模式",
|
||||
"副驾驶进入电感沙滩椅",
|
||||
"副驾驶进入女王副驾模式",
|
||||
"副驾驶进入小腿解压悬浮模式",
|
||||
]
|
||||
|
||||
with patch.object(self.service.openai, "interpret", return_value=model_output):
|
||||
for index, utterance in enumerate(utterances):
|
||||
with self.subTest(utterance=utterance):
|
||||
result = self.service.process(
|
||||
utterance,
|
||||
"openai",
|
||||
f"conv-reference-mode-{index}",
|
||||
vehicle_id="denza_n7",
|
||||
)
|
||||
|
||||
self.assertEqual(result["status"], "succeeded")
|
||||
self.assertTrue(result["matched_modes"])
|
||||
self.assertTrue(
|
||||
result["function_config"] or result["function_configs"]
|
||||
)
|
||||
|
||||
def test_save_recent_successful_actions_as_long_term_mode_profile(self) -> None:
|
||||
self.service.mode_profiles = ModeProfileRegistry(
|
||||
self.service.artifact_root / "modes"
|
||||
)
|
||||
model_output = {
|
||||
"detected_domains": ["roof"],
|
||||
"requests": [
|
||||
{
|
||||
"domain": "roof",
|
||||
"capability": "roof.set_transmittance",
|
||||
"target_scope": "vehicle",
|
||||
"operation": "set",
|
||||
"parameters": [{"name": "transmittance_pct", "value": 35}],
|
||||
"reason": "保存前先形成一个可复用动作。",
|
||||
}
|
||||
],
|
||||
"ambiguities": [],
|
||||
"decision_summary": ["天幕透光率设为35%。"],
|
||||
"confidence": 0.96,
|
||||
}
|
||||
with patch.object(self.service.openai, "interpret", return_value=model_output):
|
||||
first = self.service.process(
|
||||
"天幕透光率调到35%",
|
||||
"openai",
|
||||
"conv-save-mode-profile",
|
||||
vehicle_id="denza_n7",
|
||||
)
|
||||
|
||||
saved = self.service.process(
|
||||
"这个模式不错,固化为露营模式",
|
||||
"local",
|
||||
"conv-save-mode-profile",
|
||||
vehicle_id="denza_n7",
|
||||
)
|
||||
|
||||
self.assertEqual(first["status"], "succeeded")
|
||||
self.assertEqual(saved["status"], "succeeded")
|
||||
self.assertIsNone(saved["command_plan"])
|
||||
self.assertEqual(saved["mode_profile"]["name"], "露营模式")
|
||||
telemetry = saved["execution_report"]["spec"]["results"][0]["telemetry"]
|
||||
self.assertEqual(telemetry["operation"], "save_mode_profile")
|
||||
self.assertFalse(telemetry["can_command_emitted"])
|
||||
|
||||
registry = ModeProfileRegistry(self.service.artifact_root / "modes")
|
||||
matched = registry.match_text("进入露营模式", vehicle_id="denza_n7")
|
||||
requests = registry.requests_for_profiles(matched)
|
||||
self.assertEqual(requests[0]["capability"], "roof.set_transmittance")
|
||||
self.assertEqual(
|
||||
requests[0]["parameters"],
|
||||
[{"name": "transmittance_pct", "value": 35}],
|
||||
)
|
||||
self.assertEqual(
|
||||
registry.match_text("进入露营模式", vehicle_id="other_vehicle"),
|
||||
[],
|
||||
)
|
||||
|
||||
def test_update_and_restore_long_term_mode_profile_are_control_plane_only(self) -> None:
|
||||
self.service.mode_profiles = ModeProfileRegistry(
|
||||
self.service.artifact_root / "modes"
|
||||
)
|
||||
profile = self.service.mode_profiles.save_mode(
|
||||
"露营模式",
|
||||
[
|
||||
{
|
||||
"domain": "roof",
|
||||
"capability": "roof.set_transmittance",
|
||||
"target_scope": "vehicle",
|
||||
"operation": "set",
|
||||
"parameters": {"transmittance_pct": 20},
|
||||
"reason": "原始天幕目标。",
|
||||
}
|
||||
],
|
||||
vehicle_id="denza_n7",
|
||||
)
|
||||
model_output = {
|
||||
"detected_domains": ["roof"],
|
||||
"requests": [
|
||||
{
|
||||
"domain": "roof",
|
||||
"capability": "roof.set_transmittance",
|
||||
"target_scope": "vehicle",
|
||||
"operation": "set",
|
||||
"parameters": [{"name": "transmittance_pct", "value": 50}],
|
||||
"reason": "用户修改长期模式天幕目标。",
|
||||
}
|
||||
],
|
||||
"ambiguities": [],
|
||||
"decision_summary": ["修改露营模式天幕目标。"],
|
||||
"confidence": 0.96,
|
||||
}
|
||||
|
||||
with patch.object(self.service.openai, "interpret", return_value=model_output):
|
||||
updated = self.service.process(
|
||||
"修改露营模式,天幕透光率改到50%",
|
||||
"openai",
|
||||
"conv-update-mode-profile",
|
||||
execution_mode="hardware",
|
||||
vehicle_id="denza_n7",
|
||||
)
|
||||
|
||||
self.assertEqual(updated["status"], "succeeded")
|
||||
self.assertIsNone(updated["command_plan"])
|
||||
update_telemetry = updated["execution_report"]["spec"]["results"][0][
|
||||
"telemetry"
|
||||
]
|
||||
self.assertEqual(update_telemetry["operation"], "update_mode_profile")
|
||||
self.assertFalse(update_telemetry["can_command_emitted"])
|
||||
self.assertTrue(Path(profile.source).with_suffix(".yaml.initial.bak").is_file())
|
||||
|
||||
registry = ModeProfileRegistry(self.service.artifact_root / "modes")
|
||||
requests = registry.requests_for_profiles(
|
||||
registry.match_text("进入露营模式", vehicle_id="denza_n7")
|
||||
)
|
||||
self.assertEqual(
|
||||
requests[0]["parameters"],
|
||||
[{"name": "transmittance_pct", "value": 50}],
|
||||
)
|
||||
|
||||
restored = self.service.process(
|
||||
"恢复露营模式初始配置",
|
||||
"local",
|
||||
"conv-update-mode-profile",
|
||||
execution_mode="hardware",
|
||||
vehicle_id="denza_n7",
|
||||
)
|
||||
|
||||
self.assertEqual(restored["status"], "succeeded")
|
||||
self.assertIsNone(restored["command_plan"])
|
||||
restore_telemetry = restored["execution_report"]["spec"]["results"][0][
|
||||
"telemetry"
|
||||
]
|
||||
self.assertEqual(restore_telemetry["operation"], "restore_mode_profile")
|
||||
self.assertFalse(restore_telemetry["can_command_emitted"])
|
||||
restored_registry = ModeProfileRegistry(self.service.artifact_root / "modes")
|
||||
restored_requests = restored_registry.requests_for_profiles(
|
||||
restored_registry.match_text("进入露营模式", vehicle_id="denza_n7")
|
||||
)
|
||||
self.assertEqual(
|
||||
restored_requests[0]["parameters"],
|
||||
[{"name": "transmittance_pct", "value": 20}],
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
@@ -0,0 +1,265 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
import yaml
|
||||
|
||||
from cognitive_agent.application.mode_profile import ModeProfileRegistry
|
||||
from cognitive_agent.application.seat_service import REPOSITORY_ROOT
|
||||
|
||||
|
||||
class ModeProfileRegistryTests(unittest.TestCase):
|
||||
def test_zero_gravity_profile_matches_alias_and_builds_requests(self) -> None:
|
||||
registry = ModeProfileRegistry(REPOSITORY_ROOT / "config" / "modes")
|
||||
|
||||
matched = registry.match_text("副驾驶进入零重力模式", vehicle_id="denza_n7")
|
||||
self.assertEqual([profile.id for profile in matched], ["zero_gravity"])
|
||||
self.assertEqual(matched[0].vehicle_ids, ("denza_n7",))
|
||||
|
||||
requests = registry.requests_for_profiles(matched)
|
||||
self.assertGreaterEqual(len(requests), 4)
|
||||
self.assertEqual(requests[0]["domain"], "seat")
|
||||
self.assertEqual(requests[0]["capability"], "seat.set_longitudinal_position")
|
||||
self.assertEqual(requests[0]["target_scope"], "passenger")
|
||||
self.assertIn(
|
||||
{"name": "position_pct", "value": 0},
|
||||
requests[0]["parameters"],
|
||||
)
|
||||
by_capability = {request["capability"]: request for request in requests}
|
||||
self.assertEqual(
|
||||
by_capability["seat.set_cushion_tilt"]["parameters"],
|
||||
[{"name": "position_pct", "value": 100}],
|
||||
)
|
||||
self.assertEqual(
|
||||
by_capability["seat.set_backrest_recline"]["parameters"],
|
||||
[
|
||||
{"name": "position_pct", "value": 81},
|
||||
{"name": "angle_deg", "value": 150},
|
||||
],
|
||||
)
|
||||
self.assertEqual(
|
||||
by_capability["seat.set_legrest_height"]["parameters"],
|
||||
[
|
||||
{"name": "position_pct", "value": 87},
|
||||
{"name": "angle_deg", "value": 163},
|
||||
],
|
||||
)
|
||||
|
||||
public = registry.public_modes()
|
||||
self.assertIn("零重力模式", {item["name"] for item in public})
|
||||
self.assertNotIn(
|
||||
"zero_gravity",
|
||||
{profile.id for profile in registry.match_text("副驾驶进入零重力模式", vehicle_id="other_vehicle")},
|
||||
)
|
||||
|
||||
def test_reference_modes_are_denza_specific(self) -> None:
|
||||
registry = ModeProfileRegistry(REPOSITORY_ROOT / "config" / "modes")
|
||||
|
||||
expected_ids = {
|
||||
"zero_gravity",
|
||||
"cruise_sofa",
|
||||
"leisure_lounger",
|
||||
"nap",
|
||||
"easy_entry_exit",
|
||||
"baby_nap",
|
||||
"office",
|
||||
"meditation_space",
|
||||
"electric_beach_chair",
|
||||
"queen_passenger_driving",
|
||||
"calf_decompression_float",
|
||||
}
|
||||
denza_modes = registry.public_modes(vehicle_id="denza_n7")
|
||||
denza_ids = {mode["id"] for mode in denza_modes}
|
||||
|
||||
self.assertTrue(expected_ids.issubset(denza_ids))
|
||||
self.assertTrue(
|
||||
expected_ids.isdisjoint(
|
||||
{mode["id"] for mode in registry.public_modes(vehicle_id="other_vehicle")}
|
||||
)
|
||||
)
|
||||
self.assertEqual(
|
||||
registry.match_text("进入办公模式", vehicle_id="denza_n7")[0].id,
|
||||
"office",
|
||||
)
|
||||
self.assertEqual(
|
||||
registry.match_text("进入小腿解压悬浮模式", vehicle_id="denza_n7")[0].id,
|
||||
"calf_decompression_float",
|
||||
)
|
||||
|
||||
def test_common_modes_are_visible_with_vehicle_specific_overrides(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
common = root / "common"
|
||||
denza = root / "vehicles" / "denza_n7"
|
||||
other = root / "vehicles" / "other_vehicle"
|
||||
common.mkdir(parents=True)
|
||||
denza.mkdir(parents=True)
|
||||
other.mkdir(parents=True)
|
||||
(common / "relax.yaml").write_text(
|
||||
"""
|
||||
id: relax
|
||||
name: 放松模式
|
||||
aliases:
|
||||
- relax
|
||||
description: 公共放松模式。
|
||||
operations:
|
||||
- domain: roof
|
||||
capability: roof.set_transmittance
|
||||
target_scope: vehicle
|
||||
operation: set
|
||||
parameters:
|
||||
transmittance_pct: 45
|
||||
""".strip()
|
||||
+ "\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
(denza / "relax.yaml").write_text(
|
||||
"""
|
||||
id: relax
|
||||
name: N7 放松模式
|
||||
aliases:
|
||||
- relax
|
||||
description: N7 专属放松模式。
|
||||
scope:
|
||||
vehicle_ids:
|
||||
- denza_n7
|
||||
operations:
|
||||
- domain: roof
|
||||
capability: roof.set_transmittance
|
||||
target_scope: vehicle
|
||||
operation: set
|
||||
parameters:
|
||||
transmittance_pct: 20
|
||||
""".strip()
|
||||
+ "\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
(other / "nap.yaml").write_text(
|
||||
"""
|
||||
id: nap
|
||||
name: 午休模式
|
||||
description: 其他车型专属午休模式。
|
||||
operations:
|
||||
- domain: roof
|
||||
capability: roof.set_transmittance
|
||||
target_scope: vehicle
|
||||
operation: set
|
||||
parameters:
|
||||
transmittance_pct: 10
|
||||
""".strip()
|
||||
+ "\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
registry = ModeProfileRegistry(root)
|
||||
|
||||
denza_matches = registry.match_text("进入放松模式", vehicle_id="denza_n7")
|
||||
other_matches = registry.match_text("进入放松模式", vehicle_id="other_vehicle")
|
||||
|
||||
self.assertEqual([profile.name for profile in denza_matches], ["N7 放松模式"])
|
||||
self.assertEqual([profile.name for profile in other_matches], ["放松模式"])
|
||||
self.assertEqual(
|
||||
{profile.id for profile in registry.match_text("进入午休模式", vehicle_id="denza_n7")},
|
||||
set(),
|
||||
)
|
||||
self.assertEqual(
|
||||
{mode["id"] for mode in registry.public_modes(vehicle_id="denza_n7")},
|
||||
{"relax"},
|
||||
)
|
||||
|
||||
def test_save_mode_profile_persists_yaml_and_reloads(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
registry = ModeProfileRegistry(root)
|
||||
profile = registry.save_mode(
|
||||
"露营模式",
|
||||
[
|
||||
{
|
||||
"domain": "roof",
|
||||
"capability": "roof.set_transmittance",
|
||||
"target_scope": "vehicle",
|
||||
"operation": "set",
|
||||
"parameters": {"transmittance_pct": 20},
|
||||
"reason": "保存最近一次天幕目标。",
|
||||
}
|
||||
],
|
||||
vehicle_id="denza_n7",
|
||||
)
|
||||
|
||||
saved_path = Path(profile.source)
|
||||
self.assertTrue(saved_path.is_file())
|
||||
self.assertEqual(
|
||||
saved_path.relative_to(root).parts[:3],
|
||||
("vehicles", "denza_n7", "user"),
|
||||
)
|
||||
document = yaml.safe_load(saved_path.read_text(encoding="utf-8"))
|
||||
self.assertEqual(document["name"], "露营模式")
|
||||
self.assertEqual(document["scope"]["vehicle_ids"], ["denza_n7"])
|
||||
self.assertEqual(document["operations"][0]["domain"], "roof")
|
||||
|
||||
reloaded = ModeProfileRegistry(root)
|
||||
matched = reloaded.match_text("进入露营模式", vehicle_id="denza_n7")
|
||||
self.assertEqual([item.name for item in matched], ["露营模式"])
|
||||
self.assertEqual(
|
||||
reloaded.match_text("进入露营模式", vehicle_id="other_vehicle"),
|
||||
[],
|
||||
)
|
||||
requests = reloaded.requests_for_profiles(matched)
|
||||
self.assertEqual(requests[0]["capability"], "roof.set_transmittance")
|
||||
self.assertEqual(
|
||||
requests[0]["parameters"],
|
||||
[{"name": "transmittance_pct", "value": 20}],
|
||||
)
|
||||
|
||||
def test_update_mode_profile_backs_up_initial_yaml_and_restores(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
registry = ModeProfileRegistry(root)
|
||||
profile = registry.save_mode(
|
||||
"露营模式",
|
||||
[
|
||||
{
|
||||
"domain": "roof",
|
||||
"capability": "roof.set_transmittance",
|
||||
"target_scope": "vehicle",
|
||||
"operation": "set",
|
||||
"parameters": {"transmittance_pct": 20},
|
||||
"reason": "原始天幕目标。",
|
||||
}
|
||||
],
|
||||
vehicle_id="denza_n7",
|
||||
)
|
||||
|
||||
updated = registry.update_mode(
|
||||
profile,
|
||||
[
|
||||
{
|
||||
"domain": "roof",
|
||||
"capability": "roof.set_transmittance",
|
||||
"target_scope": "vehicle",
|
||||
"operation": "set",
|
||||
"parameters": {"transmittance_pct": 50},
|
||||
"reason": "用户修改天幕目标。",
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
self.assertTrue(Path(profile.source).with_suffix(".yaml.initial.bak").is_file())
|
||||
requests = registry.requests_for_profiles([updated])
|
||||
self.assertEqual(
|
||||
requests[0]["parameters"],
|
||||
[{"name": "transmittance_pct", "value": 50}],
|
||||
)
|
||||
|
||||
restored = registry.restore_initial_mode(updated)
|
||||
restored_requests = registry.requests_for_profiles([restored])
|
||||
self.assertEqual(
|
||||
restored_requests[0]["parameters"],
|
||||
[{"name": "transmittance_pct", "value": 20}],
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -0,0 +1,72 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from cognitive_agent.application.vehicle_profile import VehicleProfileRegistry
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
|
||||
|
||||
class VehicleProfileTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.registry = VehicleProfileRegistry(ROOT / "config" / "vehicles")
|
||||
|
||||
def test_loads_denza_n7_seat_motor_calibration(self) -> None:
|
||||
profile = self.registry.get("denza_n7")
|
||||
|
||||
self.assertEqual(profile.id, "denza_n7")
|
||||
self.assertEqual(profile.name, "腾势 N7")
|
||||
self.assertEqual(set(profile.seat_motors), {
|
||||
"longitudinal",
|
||||
"cushion_tilt",
|
||||
"backrest_recline",
|
||||
"legrest_height",
|
||||
})
|
||||
self.assertEqual(profile.seat_motors["longitudinal"].range, 215)
|
||||
self.assertEqual(profile.seat_motors["longitudinal"].hall_total_pulses, 480)
|
||||
self.assertEqual(profile.seat_motors["longitudinal"].reference_zero, "rearmost")
|
||||
self.assertEqual(profile.seat_motors["backrest_recline"].range, 68)
|
||||
self.assertEqual(profile.seat_motors["backrest_recline"].hall_total_pulses, 917)
|
||||
self.assertEqual(profile.seat_motors["legrest_height"].range, 78)
|
||||
self.assertEqual(profile.seat_motors["legrest_height"].hall_total_pulses, 647)
|
||||
|
||||
def test_converts_relative_physical_delta_to_absolute_percent(self) -> None:
|
||||
profile = self.registry.get("denza_n7")
|
||||
|
||||
self.assertEqual(
|
||||
profile.relative_target_pct("longitudinal", current_pct=50, delta=50, direction="increase"),
|
||||
73,
|
||||
)
|
||||
self.assertEqual(
|
||||
profile.relative_target_pct("backrest_recline", current_pct=20, delta=10, direction="increase"),
|
||||
35,
|
||||
)
|
||||
self.assertEqual(
|
||||
profile.relative_target_pct("legrest_height", current_pct=10, delta=10, direction="decrease"),
|
||||
0,
|
||||
)
|
||||
|
||||
def test_exposes_display_angle_ranges_for_frontend(self) -> None:
|
||||
profile = self.registry.get("denza_n7")
|
||||
public = profile.public_dict()
|
||||
|
||||
backrest = public["seat"]["motors"]["backrest_recline"]
|
||||
legrest = public["seat"]["motors"]["legrest_height"]
|
||||
self.assertEqual(backrest["display_angle"], {
|
||||
"kind": "included_angle",
|
||||
"zero_deg": 95,
|
||||
"max_deg": 163,
|
||||
"provisional": True,
|
||||
})
|
||||
self.assertEqual(legrest["display_angle"], {
|
||||
"kind": "included_angle",
|
||||
"zero_deg": 95,
|
||||
"max_deg": 173,
|
||||
"provisional": True,
|
||||
})
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user