import { describe, expect, it } from "vitest"; import { applyRefinement } from "./refineApply"; describe("applyRefinement", () => { const full = "第一段。原文段落。第三段。"; const original = "原文段落。"; const refined = "润色后的段落。"; // "第一段。" = 4 字,原文段落在 [4, 4+len) const range = { start: 4, end: 4 + original.length }; it("选区未漂移:按 range 原地替换", () => { expect(applyRefinement(full, original, refined, range)).toBe( "第一段。润色后的段落。第三段。", ); }); it("选区漂移但原文唯一:按内容重锚替换", () => { // range 指向错位(如流式追加导致偏移),但原文仍能唯一定位。 const drifted = { start: 0, end: 3 }; expect(applyRefinement(full, original, refined, drifted)).toBe( "第一段。润色后的段落。第三段。", ); }); it("原文已不存在(正文被大改):返回 null 让调用方提示重选", () => { expect(applyRefinement("完全不同的正文", original, refined, range)).toBeNull(); }); it("只替换首个匹配(重锚回退时保守取第一处)", () => { const twice = "原文段落。中间。原文段落。"; const drifted = { start: 99, end: 100 }; expect(applyRefinement(twice, original, refined, drifted)).toBe( "润色后的段落。中间。原文段落。", ); }); });