import assert from "node:assert/strict";
import { test } from "node:test";
import { extractBlock, hasBlock, removeBlock, upsertBlock } from "../src/marker.ts";

const M = "designpaca";

test("빈 문서에 블록을 넣는다", () => {
  const out = upsertBlock("", M, "본문");
  assert.ok(hasBlock(out, M));
  assert.equal(extractBlock(out, M), "본문");
});

test("기존 문서 뒤에 붙이고 원문을 보존한다", () => {
  const doc = "# 내 지침\n\n건드리지 마라.\n";
  const out = upsertBlock(doc, M, "우리 블록");
  assert.ok(out.startsWith("# 내 지침"));
  assert.ok(out.includes("건드리지 마라."));
  assert.equal(extractBlock(out, M), "우리 블록");
});

test("두 번째 호출은 블록 내용만 교체한다", () => {
  const first = upsertBlock("# 문서\n\n앞부분\n", M, "v1");
  const second = upsertBlock(first, M, "v2");
  assert.equal(extractBlock(second, M), "v2");
  assert.ok(!second.includes("v1"));
  assert.ok(second.includes("앞부분"));
  // 블록이 두 개로 늘어나면 안 된다
  assert.equal(second.split("designpaca:start").length - 1, 1);
});

test("블록 뒤에 사용자가 쓴 내용도 보존한다", () => {
  const doc = upsertBlock("앞\n", M, "블록") + "\n뒤에 쓴 내용\n";
  const out = upsertBlock(doc, M, "새 블록");
  assert.ok(out.includes("앞"));
  assert.ok(out.includes("뒤에 쓴 내용"));
  assert.equal(extractBlock(out, M), "새 블록");
});

test("제거하면 우리 블록만 사라진다", () => {
  const doc = upsertBlock("# 문서\n\n내용\n", M, "블록");
  const out = removeBlock(doc, M);
  assert.ok(!hasBlock(out, M));
  assert.ok(out.includes("# 문서"));
  assert.ok(out.includes("내용"));
});

test("블록이 없는 문서를 제거해도 그대로다", () => {
  const doc = "# 문서\n";
  assert.equal(removeBlock(doc, M), doc);
});
