// @vitest-environment happy-dom import { afterEach, describe, expect, it } from "vitest"; import { canEditElementTextInline } from "./domEditInlineText"; afterEach(() => { document.body.innerHTML = ""; }); function mount(html: string): HTMLElement { document.body.innerHTML = html; return document.body.firstElementChild as HTMLElement; } describe("canEditElementTextInline", () => { it("opens a plain piece of copy", () => { expect(canEditElementTextInline(mount("

hello world

"))).toBe(true); }); // The trap this exists for: styling a run of characters puts a span inside // the element, and a rule of "no element children" would have let the editor // lock every element it had ever styled out of itself, permanently. it("still opens an element that has been styled", () => { const element = mount('

hello world

'); expect(canEditElementTextInline(element)).toBe(true); }); it("opens an element whose formatting is nested", () => { const element = mount('

deep

'); expect(canEditElementTextInline(element)).toBe(true); }); it("keeps out an element with a structural child, which the panel edits field by field", () => { expect(canEditElementTextInline(mount("

a

b

"))).toBe(false); }); it("keeps out an element hiding something structural inside its formatting", () => { expect(canEditElementTextInline(mount("

a

"))).toBe(false); }); it("keeps out the document itself", () => { expect(canEditElementTextInline(document.body)).toBe(false); expect(canEditElementTextInline(document.documentElement)).toBe(false); }); it("keeps out an element that is already being edited", () => { const element = mount("

hello

"); element.setAttribute("contenteditable", "true"); expect(canEditElementTextInline(element)).toBe(false); }); it("keeps out an element with no words in it", () => { expect(canEditElementTextInline(mount("

"))).toBe(false); }); it("keeps out nothing at all", () => { expect(canEditElementTextInline(null)).toBe(false); }); });