"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.evaluateTrace = evaluateTrace; const evidence_1 = require("./evidence"); function evaluateTrace(requirements, cases, reviewDate) { const required = requirements.filter(item => item.mandatory); const ids = new Set(required.map(item => item.id)); const usedCases = new Set(), duplicateCases = [], orphanCases = []; const links = new Map(); for (const item of cases) { if (usedCases.has(item.id)) { duplicateCases.push(item.id); continue; } usedCases.add(item.id); for (const id of item.requirementIds) { if (!ids.has(id)) { orphanCases.push(item.id); continue; } links.set(id, [...(links.get(id) ?? []), item]); } } const gaps = []; for (const requirement of required) { const related = links.get(requirement.id) ?? []; if (related.length === 0) gaps.push({ requirementId: requirement.id, reason: '无验证用例' }); else if (!related.some(item => (0, evidence_1.evidenceState)(item, reviewDate) === null)) gaps.push({ requirementId: requirement.id, reason: related.map(item => (0, evidence_1.evidenceState)(item, reviewDate)).join('、') }); } const covered = required.length - gaps.length; return { covered, total: required.length, percent: required.length ? Math.round(covered * 100 / required.length) : 100, gaps, orphanCases, duplicateCases }; }