from __future__ import annotations import pytest from cognitive_agent.application.mode_profile_intent import ( is_mode_profile_query, is_mode_profile_update_shape, parse_mode_profile_delete, parse_mode_profile_update, ) @pytest.mark.parametrize( ("message", "expected"), ( ( "把阅读模式中空调温度调整到26度", ("阅读模式", "空调温度调整到26度"), ), ( "调整办公模式,把办公模式的副驾空调温度调整为26度。", ("办公模式", "副驾空调温度调整为26度"), ), ( "请帮我把“阅读模式”里的空调温度改成25度吧。", ("阅读模式", "空调温度改成25度"), ), ( "将看书模式里的风量设置成2档", ("看书模式", "风量设置成2档"), ), ( "麻烦调整一下阅读模式:遮阳帘设置为50%", ("阅读模式", "遮阳帘设置为50%"), ), ( "阅读模式内的阅读灯打开", ("阅读模式", "阅读灯打开"), ), ), ) def test_saved_mode_update_parser_accepts_natural_variants( message: str, expected: tuple[str, str], ) -> None: assert parse_mode_profile_update(message) == expected @pytest.mark.parametrize("change", ( "第二阶段保持30秒", "第二阶段持续16分钟", "循环21次", "重复两次", "重复1.5次", "持续30秒", "全部阶段持续2分钟", )) def test_schedule_update_predicates_stay_on_control_plane_even_when_bounds_are_invalid(change): assert parse_mode_profile_update(f"把上车预热模式的{change}") == ("上车预热模式", change) @pytest.mark.parametrize("message", ( "把上车预热模式的第二阶段保持30秒合适吗?", "不要把上车预热模式的第二阶段保持30秒", "上车预热模式的第二阶段不要保持30秒", "把上车预热模式的重复两次,但是不要保存", "解释把上车预热模式的重复两次", "创建一个上车预热模式,第二阶段保持30秒", )) def test_schedule_update_predicates_do_not_authorize_queries_negation_or_creation(message): assert parse_mode_profile_update(message) is None @pytest.mark.parametrize( "message", ( "把空调温度调整到26度", "副驾空调温度调到26度", "执行阅读模式", "进入阅读模式", "删除阅读模式", "不要修改阅读模式中的空调温度", "阅读模式中空调温度是多少?", "把阅读模式中空调温度调整到26度合适吗?", "如何调整阅读模式中的空调温度?", "用户说‘把阅读模式中空调温度调整到26度’", ), ) def test_saved_mode_update_parser_rejects_controls_questions_and_quoted_examples( message: str, ) -> None: assert parse_mode_profile_update(message) is None def test_negated_mode_update_shape_is_preserved_but_never_actionable() -> None: message = "把观影模式的遮阳帘打开到100%,但是不要执行" assert is_mode_profile_update_shape(message) assert parse_mode_profile_update(message) is None @pytest.mark.parametrize( ("message", "expected_name"), ( ("删除阅读模式", "阅读模式"), ("删除一下阅读模式。", "阅读模式"), ("请帮我删除一下看书模式吧", "看书模式"), ("麻烦移除阅读模式!", "阅读模式"), ("把阅读模式删掉", "阅读模式"), ("把“阅读模式”删除。", "阅读模式"), ), ) def test_saved_mode_delete_parser_accepts_explicit_imperative_variants( message: str, expected_name: str, ) -> None: assert parse_mode_profile_delete(message) == expected_name @pytest.mark.parametrize( "message", ( "删除模式", "删除功能模式", "不要删除阅读模式", "先别把阅读模式删掉", "删除阅读模式会怎样?", "可以删除阅读模式吗?", "如何删除阅读模式?", "阅读模式不存在就删除", "用户说‘删除阅读模式’", "执行阅读模式", "关闭阅读模式", "取消阅读模式", ), ) def test_saved_mode_delete_parser_rejects_ambiguous_or_non_imperative_text( message: str, ) -> None: assert parse_mode_profile_delete(message) is None @pytest.mark.parametrize( "message", ( "办公模式下会控制哪些车端设备,执行哪些动作?", "阅读模式里都有哪些动作", "看书模式会把空调设置为多少度?", "请展示一下阅读模式的设备和参数", "办公模式包含什么配置", ), ) def test_saved_mode_detail_questions_are_classified_as_queries(message: str) -> None: assert is_mode_profile_query(message) assert parse_mode_profile_update(message) is None assert parse_mode_profile_delete(message) is None @pytest.mark.parametrize( "message", ( "把办公模式的副驾空调温度调整为26度", "删除办公模式", "执行办公模式", "副驾空调温度调整为26度", ), ) def test_mutations_and_immediate_controls_are_not_detail_queries(message: str) -> None: assert not is_mode_profile_query(message)