// @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(""))).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);
});
});