""" HINA 策略模板 — 根据程序分类定义必须的测试项和边界条件。 Task 2.2: 必须项模板 + supplement 函数 """ STRATEGY_TEMPLATES: dict[str, dict] = { "マッチング": { "required": [ "COM-N001", "COM-N002", "COM-A002", "COM-A003", "MT-N001", "MT-N002", "MT-N004", "MT-N005", "MT-N006", ], "boundary": ["MT-B001", "MT-B002"], }, "キーブレイク": { "required": [ "COM-N001", "COM-A002", "KB-N001", "KB-N004", "KB-N005", "KB-A001", ], "boundary": ["KB-B001", "KB-B002"], }, "条件分岐": { "required": [ "B-N001", "B-N003", "B-N006", "B-N009", ], }, "内部表検索": { "required": [ "T-N001", "T-N002", "T-A001", "T-A002", ], }, "項目チェック": { "required": [ "VF-N001", "VF-N002", "VF-N004", "VF-A001", ], }, } def get_strategy(hina_type: str) -> dict: """返回对应 HINA 类型的策略模板。 Args: hina_type: HINA 程序分类名称(如 "マッチング")。 Returns: dict: required 列表及可选的 boundary 列表。 未知类型返回空模板 {"required": [], "boundary": []}。 """ return STRATEGY_TEMPLATES.get(hina_type, {"required": [], "boundary": []}) def _make_marker(code: str, prefix: str = "REQ") -> dict: """生成一条标记记录。""" return { "id": f"{prefix}-{code}", "coverage_targets": [code], "fields": {}, } def supplement(base_tests: list[dict], hina_result: dict) -> list[dict]: """根据 HINA 类型追加模板中的必须项标记记录。 从 ``hina_result["category"]`` 获取分类,查找对应的策略模板, 将模板中所有的 required 和 boundary 项以标记记录形式追加到测试列表末尾。 Args: base_tests: 已有的测试数据列表(每个元素为 dict)。 hina_result: HINA 分类结果,至少包含 ``{"category": str}``。 Returns: list[dict]: 追加必须项标记记录后的完整测试列表。 """ hina_type = hina_result.get("category", "unknown") template = get_strategy(hina_type) result = list(base_tests) for code in template.get("required", []): result.append(_make_marker(code)) for code in template.get("boundary", []): result.append(_make_marker(code, prefix="BND")) return result def supplement_only(base_tests: list[dict], hina_gaps: list[str]) -> list[dict]: """增量补充指定必须项的标记记录。 根据传入的 code 列表(而不是从模板查找),只追加缺失的那些必须项标记。 Args: base_tests: 已有的测试数据列表(每个元素为 dict)。 hina_gaps: 需要补充的 HINA 必须项 code 列表。 Returns: list[dict]: 追加标记记录后的完整测试列表。 """ result = list(base_tests) for code in hina_gaps: result.append(_make_marker(code)) return result