import { describe, test, expect } from "vitest";
import {
createEmptyTextSpan,
createTextSpan,
getTextSpan,
getTextSpanLength,
isTextSpan,
isTextSpanEnd,
isTextSpanStart,
isLikeTextSpan,
splitTextSpan,
TAG,
TYPE,
} from "./TextSpan.js";
import { createLineBreak } from "./LineBreak.js";
/* @vitest-environment jsdom */
describe("TextSpan", () => {
test("createTextSpan should throw when passed an invalid child", () => {
expect(() => createTextSpan("Hello, World!")).toThrowError(
"Invalid textSpan child",
);
});
test("createTextSpan creates a new textSpan element with a
inside", () => {
const textSpan = createTextSpan(createLineBreak());
expect(textSpan).toBeInstanceOf(HTMLSpanElement);
expect(textSpan.dataset.itype).toBe(TYPE);
expect(textSpan.nodeName).toBe(TAG);
expect(textSpan.textContent).toBe("");
expect(textSpan.firstChild).toBeInstanceOf(HTMLBRElement);
});
test("createTextSpan creates a new textSpan element with a text inside", () => {
const textSpan = createTextSpan(new Text("Hello, World!"));
expect(textSpan).toBeInstanceOf(HTMLSpanElement);
expect(textSpan.dataset.itype).toBe(TYPE);
expect(textSpan.nodeName).toBe(TAG);
expect(textSpan.textContent).toBe("Hello, World!");
expect(textSpan.firstChild).toBeInstanceOf(Text);
});
test("createEmptyTextSpan creates a new empty textSpan element with a
inside", () => {
const emptyTextSpan = createEmptyTextSpan();
expect(emptyTextSpan).toBeInstanceOf(HTMLSpanElement);
expect(emptyTextSpan.dataset.itype).toBe(TYPE);
expect(emptyTextSpan.nodeName).toBe(TAG);
expect(emptyTextSpan.textContent).toBe("");
expect(emptyTextSpan.firstChild).toBeInstanceOf(HTMLBRElement);
});
test("isTextSpan should return true on elements that are text spans", () => {
const textSpan = createTextSpan(new Text("Hello, World!"));
expect(isTextSpan(textSpan)).toBe(true);
const a = document.createElement("a");
expect(isTextSpan(a)).toBe(false);
const b = null;
expect(isTextSpan(b)).toBe(false);
const c = document.createElement("span");
expect(isTextSpan(c)).toBe(false);
});
test("isLikeTextSpan should return true on elements that have textSpan behavior by default", () => {
expect(isLikeTextSpan(Infinity)).toBe(false);
expect(isLikeTextSpan(null)).toBe(false);
expect(isLikeTextSpan(document.createElement("A"))).toBe(true);
});
// FIXME: Should throw?
test("isTextSpanStart returns false when passed node is not an textSpan", () => {
const textSpan = document.createElement("div");
expect(isTextSpanStart(textSpan, 0)).toBe(false);
expect(isTextSpanStart(textSpan, "Hello, World!".length)).toBe(false);
});
test("isTextSpanStart returns if we're at the start of an textSpan", () => {
const textSpan = createTextSpan(new Text("Hello, World!"));
expect(isTextSpanStart(textSpan, 0)).toBe(true);
expect(isTextSpanStart(textSpan, "Hello, World!".length)).toBe(false);
});
// FIXME: Should throw?
test("isTextSpanEnd returns false when passed node is not an textSpan", () => {
const textSpan = document.createElement("div");
expect(isTextSpanEnd(textSpan, 0)).toBe(false);
expect(isTextSpanEnd(textSpan, "Hello, World!".length)).toBe(false);
});
test("isTextSpanEnd returns if we're in the end of an textSpan", () => {
const textSpan = createTextSpan(new Text("Hello, World!"));
expect(isTextSpanEnd(textSpan, 0)).toBe(false);
expect(isTextSpanEnd(textSpan, "Hello, World!".length)).toBe(true);
});
test("getTextSpan ", () => {
expect(getTextSpan(null)).toBe(null);
});
test("getTextSpanLength throws when the passed node is not an textSpan", () => {
const textSpan = document.createElement("div");
expect(() => getTextSpanLength(textSpan)).toThrowError("Invalid textSpan");
});
test("getTextSpanLength returns the length of the textSpan content", () => {
const textSpan = createTextSpan(new Text("Hello, World!"));
expect(getTextSpanLength(textSpan)).toBe(13);
});
test("getTextSpanLength should return 0 when the textSpan content is a
", () => {
const emptyTextSpan = createEmptyTextSpan();
expect(getTextSpanLength(emptyTextSpan)).toBe(0);
});
test("splitTextSpan returns a new textSpan from the splitted textSpan", () => {
const textSpan = createTextSpan(new Text("Hello, World!"));
const newTextSpan = splitTextSpan(textSpan, 5);
expect(newTextSpan).toBeInstanceOf(HTMLSpanElement);
expect(newTextSpan.firstChild).toBeInstanceOf(Text);
expect(newTextSpan.textContent).toBe(", World!");
expect(newTextSpan.dataset.itype).toBe(TYPE);
expect(newTextSpan.nodeName).toBe(TAG);
});
});