import { describe, expect, it } from "vitest"; import { getNodeText } from "../../inc/ndtxt"; import { collapsed, pos } from "../../inc/pam"; import { computeListLabels } from "../../source/core/doc/number"; import { countDoc } from "../../source/core/doc/DocumentStatisticsManager"; import { SwWrtShell } from "../../source/uibase/wrtsh/wrtsh"; const texts = (sh: SwWrtShell) => sh.doc.nodes.map(getNodeText); function typed(text: string): SwWrtShell { const sh = new SwWrtShell(); for (const ch of text) { if (ch === "\r") sh.splitNode(); else sh.insert(ch); } return sh; } describe("SwWrtShell editing", () => { it("types, splits and joins paragraphs", () => { const sh = typed("Hello\rWorld"); expect(texts(sh)).toEqual(["Hello", "World"]); sh.setSelection(collapsed(pos(1, 0))); sh.delLeft(); expect(texts(sh)).toEqual(["HelloWorld"]); expect(sh.pam.point).toEqual(pos(0, 5)); sh.delRight(); expect(texts(sh)).toEqual(["Helloorld"]); }); it("groups typing into one undo step", () => { const sh = typed("abc"); sh.undo(); expect(texts(sh)).toEqual([""]); sh.redo(); expect(texts(sh)).toEqual(["abc"]); }); it("applies bold to the word around a collapsed cursor", () => { const sh = typed("one two"); sh.setSelection(collapsed(pos(0, 5))); sh.toggleCharAttr("bold"); const runs = sh.doc.nodes[0].runs; expect(runs.map((r) => [r.text, !!r.attrs.bold])).toEqual([ ["one ", false], ["two", true], ]); }); it("keeps pending attributes for the next input", () => { const sh = typed("a"); sh.toggleCharAttr("italic"); sh.insert("b"); expect(sh.doc.nodes[0].runs.map((r) => [r.text, !!r.attrs.italic])).toEqual([ ["a", false], ["b", true], ]); }); it("switches heading to body text on Enter at the end", () => { const sh = typed("Title"); sh.setParaStyle("Heading_20_1"); sh.splitNode(); expect(sh.doc.nodes.map((n) => n.style)).toEqual(["Heading_20_1", "Text_20_body"]); }); it("numbers list paragraphs and leaves the list on empty Enter", () => { const sh = typed("a\rb"); sh.selectAll(); sh.toggleList("number"); expect(computeListLabels(sh.doc)).toEqual(["1.", "2."]); sh.setSelection(collapsed(pos(1, 1))); sh.splitNode(); sh.splitNode(); expect(sh.doc.nodes[2].attrs.list).toBeUndefined(); }); it("pastes multi-line text as paragraphs", () => { const sh = typed("[]"); sh.setSelection(collapsed(pos(0, 1))); sh.insertPlainText("x\ny\nz"); expect(texts(sh)).toEqual(["[x", "y", "z]"]); expect(sh.pam.point).toEqual(pos(2, 1)); }); it("finds and replaces all", () => { const sh = typed("cat Cat cat"); expect(sh.replaceAll("cat", "dog", { matchCase: true })).toBe(2); expect(texts(sh)).toEqual(["dog Cat dog"]); expect(countDoc(sh.doc).words).toBe(3); }); });