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(
      "润色后的段落。中间。原文段落。",
    );
  });
});
