testMergeLinesMarksConflicts

tcmts.cli.merge.testMergeLinesMarksConflicts · #4t4s47zs · term

import { conflictMarkers, mergeLines } from "#codebase/tcmts/cli/merge";
import assert from "node:assert/strict";

export const testMergeLinesMarksConflicts = () => {
  const base = ["a", "b", "c", "d"];
  const clean = mergeLines(base, ["a", "B", "c", "d"], ["a", "b", "c", "D"]);
  assert.deepEqual(clean.lines, ["a", "B", "c", "D"]);
  assert.equal(clean.conflicts, 0);
  assert.deepEqual(clean.stretches, [
    { by: "ours", at: 1, lines: 1 },
    { by: "theirs", at: 3, lines: 1 },
  ]);
  assert.deepEqual(clean.changed, {
    ours: { added: 1, removed: 1 },
    theirs: { added: 1, removed: 1 },
  });
  const r = mergeLines(base, ["a", "b1", "c", "d"], ["a", "b2", "c", "D"], {
    ours: "ours (session/x)",
    base: "base",
    theirs: "theirs (main)",
  });
  assert.equal(r.conflicts, 1);
  assert.deepEqual(r.lines, [
    "a",
    "<<<<<<< ours (session/x)",
    "b1",
    "||||||| base",
    "b",
    "=======",
    "b2",
    ">>>>>>> theirs (main)",
    "c",
    "D",
  ]);
  assert.deepEqual(r.stretches, [
    { by: "both", at: 1, lines: 7, conflict: true },
    { by: "theirs", at: 9, lines: 1 },
  ]);
  assert.deepEqual(
    mergeLines(base, ["a", "B", "c", "d"], ["a", "B", "c", "d"]).stretches,
    [{ by: "both", at: 1, lines: 1 }],
    "both changing it alike isn't a conflict",
  );
  assert.equal(conflictMarkers(r.lines.join("\n")), 2);
  assert.equal(
    conflictMarkers("a\n=======\nb"),
    undefined,
    "a Markdown heading's underline isn't one",
  );
}

uses