AgentEvalTool/tests/unit/test_implicit_rules.py
sinohqb ffc058f951 refactor(engine): thin _run_case and _save_rule_results
Three near-identical Turn(...)+save_turn blocks (send-fail / poll-except /
happy path) collapse into one _persist_turn helper differing only by the
optional fields set. The期望→隐式规则 translation becomes a pure,
unit-testable derive_implicit_rules seam (CONTEXT: 期望与规则叠加生效),
and the rule_type→ModelPurpose map is hoisted to a module constant.
2026-07-31 14:59:50 +08:00

46 lines
1.6 KiB
Python

"""Unit tests for derive_implicit_rules — 期望→隐式规则的纯翻译."""
from agenteval.evaluation.implicit_rules import derive_implicit_rules
from agenteval.models import Expectation
def test_empty_expectation_yields_no_rules():
assert derive_implicit_rules(Expectation()) == []
def test_intent_and_coherence_alone_yield_no_rules():
# intent / coherence_min_score 不派生隐式规则(无对应规则类型)
exp = Expectation(intent="问诊分流", coherence_min_score=0.8)
assert derive_implicit_rules(exp) == []
def test_response_time_yields_response_time_rule():
rules = derive_implicit_rules(Expectation(response_time_max_ms=2000))
assert len(rules) == 1
assert rules[0].type == "response_time"
assert rules[0].params == {"max_ms": 2000}
def test_keywords_include_yields_keyword_rule():
rules = derive_implicit_rules(Expectation(keywords_include=["挂号", "门诊"]))
assert len(rules) == 1
assert rules[0].type == "keyword_match"
assert rules[0].params == {"keywords": ["挂号", "门诊"], "exclude_keywords": []}
def test_keywords_exclude_alone_yields_keyword_rule():
rules = derive_implicit_rules(Expectation(keywords_exclude=["投诉"]))
assert len(rules) == 1
assert rules[0].type == "keyword_match"
assert rules[0].params == {"keywords": [], "exclude_keywords": ["投诉"]}
def test_both_expectations_yield_two_rules_in_order():
exp = Expectation(
response_time_max_ms=1500,
keywords_include=["预约"],
keywords_exclude=["取消"],
)
rules = derive_implicit_rules(exp)
assert [r.type for r in rules] == ["response_time", "keyword_match"]