import assert from "node:assert/strict";
import {
    buildDropIndicatorText,
    computeSpanTargetStart,
    mergeBlockTexts,
    moveContiguousSpan,
} from "../src/lib/editor-block-ops.ts";

const cases = [
    () => assert.equal(mergeBlockTexts(["A", "B", "C"]), "A\n\nB\n\nC"),
    () => assert.equal(computeSpanTargetStart(6, 2, 3, 3), 2),
    () => assert.equal(computeSpanTargetStart(6, 3, 4, 1), 1),
    () => assert.equal(computeSpanTargetStart(6, 1, 2, 5), 3),
    () => {
        const moved = moveContiguousSpan(["A", "B", "C", "D", "E"], 2, 3, 1);
        assert.equal(moved.changed, true);
        assert.equal(moved.targetStart, 1);
        assert.deepEqual(moved.reordered, ["A", "C", "D", "B", "E"]);
    },
    () => {
        const moved = moveContiguousSpan(["A", "B", "C", "D", "E"], 1, 2, 5);
        assert.equal(moved.changed, true);
        assert.equal(moved.targetStart, 3);
        assert.deepEqual(moved.reordered, ["A", "D", "E", "B", "C"]);
    },
    () => {
        const moved = moveContiguousSpan(["A", "B", "C", "D", "E"], 1, 3, 2);
        assert.equal(moved.changed, false);
        assert.equal(moved.targetStart, 1);
        assert.deepEqual(moved.reordered, ["A", "B", "C", "D", "E"]);
    },
    () => {
        assert.equal(buildDropIndicatorText(0, 4), "将插入到第 1 块之前");
        assert.equal(buildDropIndicatorText(2, 4), "将插入到第 3 块之前");
        assert.equal(buildDropIndicatorText(9, 4), "将插入到文档末尾");
    },
];

for (const [index, run] of cases.entries()) {
    run();
    console.log(`ok ${index + 1}`);
}

console.log(`All ${cases.length} editor block operation checks passed.`);
