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