import { describe, expect, it } from "vitest"; import { extractDraftQuotes, locateInDraft } from "./locate"; const TEXT = "第一段没问题。\n\n他乘坐迈巴赫扬长而去,留下一地尘土。\n\n结尾。"; describe("locateInDraft", () => { it("locates the exact original fragment", () => { const loc = locateInDraft(TEXT, { original: "迈巴赫", where: "第2段" }); expect(loc).not.toBeNull(); expect(TEXT.slice(loc!.start, loc!.end)).toBe("迈巴赫"); }); it("falls back to the paragraph snippet when no original", () => { const loc = locateInDraft(TEXT, { original: null, where: "第2段" }); expect(loc).not.toBeNull(); expect(TEXT.slice(loc!.start, loc!.end)).toBe( "他乘坐迈巴赫扬长而去,留下一地尘土。", ); }); it("returns null when original is absent from text and no paragraph hint", () => { expect( locateInDraft(TEXT, { original: "保时捷", where: "无段号" }), ).toBeNull(); }); it("returns null when the snippet paragraph is out of range", () => { expect(locateInDraft(TEXT, { original: null, where: "第9段" })).toBeNull(); }); it("locates via quoted draft text inside where (no original, no 段号)", () => { // 真实形态:where = 草稿中写"<草稿原文>",引号内即正文精确子串。 const loc = locateInDraft(TEXT, { original: null, where: '草稿中写"迈巴赫扬长而去"', }); expect(loc).not.toBeNull(); expect(TEXT.slice(loc!.start, loc!.end)).toBe("迈巴赫扬长而去"); }); }); describe("extractDraftQuotes", () => { it("extracts quoted spans (multiple quote styles) longest-first, deduped", () => { expect(extractDraftQuotes('草稿中写"长一些的原文",又如「短的」')).toEqual([ "长一些的原文", "短的", ]); }); it("returns empty when there are no quotes", () => { expect(extractDraftQuotes("第3段,主角忽然示弱")).toEqual([]); }); });