2025-04-16 14:16:53 -07:00
|
|
|
|
import TextBuffer from "../src/text-buffer.js";
|
2025-04-16 12:56:08 -04:00
|
|
|
|
import { describe, it, expect } from "vitest";
|
|
|
|
|
|
|
|
|
|
|
|
// These tests ensure that the TextBuffer copy‑&‑paste logic keeps parity with
|
|
|
|
|
|
// the Rust reference implementation (`textarea.rs`). When a multi‑line
|
|
|
|
|
|
// string *without* a trailing newline is pasted at the beginning of a line,
|
|
|
|
|
|
// the final pasted line should be merged with the text that originally
|
|
|
|
|
|
// followed the caret – exactly how most editors behave.
|
|
|
|
|
|
|
|
|
|
|
|
function setupBuffer(): TextBuffer {
|
|
|
|
|
|
return new TextBuffer("ab\ncd\nef");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
describe("TextBuffer – copy/paste multi‑line", () => {
|
|
|
|
|
|
it("copies a multi‑line selection without the trailing newline", () => {
|
|
|
|
|
|
const buf = setupBuffer();
|
|
|
|
|
|
|
|
|
|
|
|
// Select from (0,0) → (1,2) ["ab", "cd"]
|
|
|
|
|
|
buf.startSelection(); // anchor at 0,0
|
|
|
|
|
|
buf.move("down"); // 1,0
|
|
|
|
|
|
buf.move("right");
|
|
|
|
|
|
buf.move("right"); // 1,2
|
|
|
|
|
|
|
|
|
|
|
|
const copied = buf.copy();
|
|
|
|
|
|
expect(copied).toBe("ab\ncd");
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it("pastes the multi‑line clipboard as separate lines (does not merge with following text)", () => {
|
|
|
|
|
|
const buf = setupBuffer();
|
|
|
|
|
|
|
|
|
|
|
|
// Make the same selection and copy
|
|
|
|
|
|
buf.startSelection();
|
|
|
|
|
|
buf.move("down");
|
|
|
|
|
|
buf.move("right");
|
|
|
|
|
|
buf.move("right");
|
|
|
|
|
|
buf.copy();
|
|
|
|
|
|
|
|
|
|
|
|
// Move caret to the start of the last line and paste
|
|
|
|
|
|
buf.move("down");
|
|
|
|
|
|
buf.move("home"); // (2,0)
|
|
|
|
|
|
|
|
|
|
|
|
const ok = buf.paste();
|
|
|
|
|
|
expect(ok).toBe(true);
|
|
|
|
|
|
|
|
|
|
|
|
// Desired final buffer – behaviour should match the Rust reference:
|
|
|
|
|
|
// the final pasted line is *merged* with the original text on the
|
|
|
|
|
|
// insertion row.
|
|
|
|
|
|
expect(buf.getLines()).toEqual(["ab", "cd", "ab", "cdef"]);
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|