Files
deerflow-code/frontend-web/src/roundtable-planning/lib/reasoning.test.ts
T
2026-06-12 21:38:20 +08:00

62 lines
2.4 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
import { splitInlineReasoning, stripReasoning } from "./reasoning";
test("空输入返回空正文与 null 推理", () => {
assert.deepEqual(splitInlineReasoning(""), { content: "", reasoning: null });
});
test("无 think 标签时原样返回正文", () => {
assert.deepEqual(splitInlineReasoning("纯正文,无推理"), {
content: "纯正文,无推理",
reasoning: null,
});
});
test("形态 1:完整 <think>…</think> 提取推理,保留正文", () => {
const { content, reasoning } = splitInlineReasoning("<think>先想一下</think>这是答案");
assert.equal(content, "这是答案");
assert.equal(reasoning, "先想一下");
});
test("形态 2:多段 think 合并推理", () => {
const { content, reasoning } = splitInlineReasoning(
"<think>第一段</think>正文A<think>第二段</think>正文B",
);
assert.equal(content, "正文A正文B");
assert.equal(reasoning, "第一段\n\n第二段");
});
test("形态 3:流式未闭合 <think> 尾段算推理", () => {
const { content, reasoning } = splitInlineReasoning("正文<think>还在想…");
assert.equal(content, "正文");
assert.equal(reasoning, "还在想…");
});
test("形态 4:模板注入式只吐闭合 </think>,前导内容算推理", () => {
const { content, reasoning } = splitInlineReasoning(
"我需要分析一下需求</think>这是最终方案",
);
assert.equal(content, "这是最终方案");
assert.equal(reasoning, "我需要分析一下需求");
});
test("形态 4 流式:尚未吐出 </think> 时全部当正文(后续闭合再归位)", () => {
// 未出现任何标签 → 无从区分,先按正文渲染。
const { content, reasoning } = splitInlineReasoning("正在推理中,还没收到闭合标签");
assert.equal(content, "正在推理中,还没收到闭合标签");
assert.equal(reasoning, null);
});
test("安全兜底:正文里绝不残留任何 think 标签字面量", () => {
const { content } = splitInlineReasoning("答案前</think>答案中<think>");
assert.ok(!content.includes("<think>"));
assert.ok(!content.includes("</think>"));
});
test("stripReasoning 只返回正文", () => {
assert.equal(stripReasoning("<think>推理</think>交付正文"), "交付正文");
assert.equal(stripReasoning("前导推理</think>交付正文"), "交付正文");
});