cockpit-agent/tests/test_semantic_target.py

142 lines
4.6 KiB
Python
Raw Permalink Normal View History

2026-08-24 16:49:44 +08:00
import unittest
from cockpit_agent.common.enums import Interaction, SliderOrientation, Zone
from cockpit_agent.grounding.semantic_target import SemanticTargetBuilder
from cockpit_agent.intent.schemas import SemanticAction
from cockpit_agent.common.enums import Domain, Operation, State, Unit
from cockpit_agent.planning.schemas import ActionPlan
class SemanticTargetBuilderTest(unittest.TestCase):
def setUp(self) -> None:
self.builder = SemanticTargetBuilder()
def test_temperature_query_uses_semantic_zone_and_direction(self) -> None:
query = self.builder.build_action_target(
ActionPlan(
interaction=Interaction.TAP,
function="temperature_decrease",
zone=Zone.DRIVER,
repeat=3,
)
)
self.assertEqual(query, "主驾驶温度降低控制")
def test_recirculation_query(self) -> None:
query = self.builder.build_action_target(
ActionPlan(
interaction=Interaction.TAP,
function="air_recirculation",
zone=Zone.ALL,
)
)
self.assertEqual(query, "车辆空调内循环控制")
def test_slider_query(self) -> None:
query = self.builder.build_action_target(
ActionPlan(
interaction=Interaction.DRAG,
function="tailgate_max_opening",
normalized_target=0.6,
orientation=SliderOrientation.HORIZONTAL,
)
)
self.assertEqual(query, "后背门最大开度滑块")
def test_segmented_option_query(self) -> None:
query = self.builder.build_action_target(
ActionPlan(
interaction=Interaction.TAP,
function="unlock_mode",
option="all_doors",
)
)
self.assertEqual(query, "所有车门解锁选项")
def test_noop_has_no_grounding_query(self) -> None:
with self.assertRaisesRegex(ValueError, "noop"):
self.builder.build_action_target(
ActionPlan(
interaction=Interaction.NOOP,
reason="already_in_target_state",
)
)
def test_function_targets_are_semantic_regions(self) -> None:
temperature = SemanticAction(
domain=Domain.CLIMATE,
function="temperature",
zone=Zone.DRIVER,
operation=Operation.SET,
state=None,
value=23,
unit=Unit.CELSIUS,
)
recirculation = SemanticAction(
domain=Domain.CLIMATE,
function="air_recirculation",
zone=Zone.ALL,
operation=Operation.SET,
state=State.ON,
value=None,
unit=None,
)
self.assertEqual(
self.builder.build_function_target(temperature),
(
"主驾驶温度调节控件整体,"
"包含当前温度显示以及用于升高和降低温度的控制元素"
),
)
self.assertEqual(
self.builder.build_function_target(recirculation),
"车辆空调内循环控制",
)
def test_function_targets_describe_complete_control_structure(self) -> None:
intents = (
SemanticAction(
domain=Domain.BODY,
function="tailgate_max_opening",
zone=None,
operation=Operation.SET,
state=None,
value=80,
unit=Unit.PERCENT,
),
SemanticAction(
domain=Domain.BODY,
function="unlock_mode",
zone=None,
operation=Operation.SET,
state=None,
value="all_doors",
unit=None,
),
)
targets = tuple(
self.builder.build_function_target(intent) for intent in intents
)
self.assertIn("滑轨", targets[0])
self.assertIn("滑块", targets[0])
self.assertIn("控件整体", targets[1])
self.assertIn("所有可选择的解锁方式选项", targets[1])
forbidden = (
"AUTO",
"风扇",
"蓝色",
"橙色",
"左边",
"右边",
"固定像素",
)
for target in targets:
for term in forbidden:
with self.subTest(target=target, term=term):
self.assertNotIn(term, target)
if __name__ == "__main__":
unittest.main()