import { test } from "node:test";
import assert from "node:assert/strict";
import { parseLooseJson } from "../src/lib/engine/evaluation/task-completion-json";
test("parseLooseJson repairs unescaped quotes inside JSON string values", () => {
const parsed = parseLooseJson(`\`\`\`json
{
"score": 0.98,
"is_correct": true,
"reason": "故障链路略有表述差异("XFS数据块读取失败"vs"XFS force shutdown"),但核心传导路径一致",
"key_point_findings": [
{
"content": "故障对象确认为磁盘/dev/sdx",
"covered": true,
"severity": "low",
"explanation": "实际输出明确提及"
}
]
}
\`\`\``);
assert.equal(parsed?.score, 0.98);
assert.equal(parsed?.is_correct, true);
assert.equal(parsed?._json_repaired, true);
assert.match(String(parsed?.reason), /XFS force shutdown/);
assert.equal(Array.isArray(parsed?.key_point_findings), true);
});
test("parseLooseJson prefers a later json fence over an earlier plain code fence", () => {
const parsed = parseLooseJson(`
Now I can verify the parent-child relationships from the y-coordinates:
\`\`\`
mysqld\`make_join_statistics (733ms, 75.47%)
│ ├─ test_quick_select (255ms, 26.25%)
│ └─ row_search_for_mysql (478ms, 49.21%)
\`\`\`
Given all this analysis, here's my evaluation:
\`\`\`json
{
"score": 0.65,
"is_correct": true,
"reason": "基本完成火焰图分析,但核心结论表达存在偏差。",
"key_point_findings": [
{
"content": "I/O 热点集中在 make_join_statistics",
"covered": true,
"coverage_status": "covered",
"severity": "low",
"explanation": "识别了热点位置"
}
]
}
\`\`\`
`);
assert.equal(parsed?.score, 0.65);
assert.equal(parsed?.is_correct, true);
assert.equal(Array.isArray(parsed?.key_point_findings), true);
});