UNPKG

thenavisapp

Version:

This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).

107 lines (86 loc) 3.95 kB
import { parseDocument } from "htmlparser2"; import { removeSubsets, compareDocumentPosition, uniqueSort } from "./helpers"; import type { Element, Document } from "domhandler"; describe("helpers", () => { describe("removeSubsets", () => { const dom = parseDocument("<div><p><span></span></p><p></p></div>") .children[0] as Element; it("removes identical trees", () => expect(removeSubsets([dom, dom])).toHaveLength(1)); it("Removes subsets found first", () => { const firstChild = dom.children[0] as Element; const matches = removeSubsets([dom, firstChild.children[0]]); expect(matches).toHaveLength(1); }); it("Removes subsets found last", () => expect(removeSubsets([dom.children[0], dom])).toHaveLength(1)); it("Does not remove unique trees", () => expect( removeSubsets([dom.children[0], dom.children[1]]), ).toHaveLength(2)); }); describe("compareDocumentPosition", () => { const markup = "<div><p><span></span></p><a></a></div>"; const dom = parseDocument(markup).children[0] as Element; const p = dom.children[0] as Element; const span = p.children[0]; const a = dom.children[1]; it("reports when the first node occurs before the second indirectly", () => expect(compareDocumentPosition(span, a)).toBe(2)); it("reports when the first node contains the second", () => expect(compareDocumentPosition(p, span)).toBe(10)); it("reports when the first node occurs after the second indirectly", () => expect(compareDocumentPosition(a, span)).toBe(4)); it("reports when the first node is contained by the second", () => expect(compareDocumentPosition(span, p)).toBe(20)); it("reports when the nodes belong to separate documents", () => { const otherDom = parseDocument(markup).children[0] as Element; const other = (otherDom.children[0] as Element).children[0]; expect(compareDocumentPosition(span, other)).toBe(1); }); it("reports when the nodes are identical", () => expect(compareDocumentPosition(span, span)).toBe(0)); it("does not end up in infinite loop (#109)", () => { const dom = parseDocument("<div><span>1</span><span>2</span></div>") .children[0] as Element; expect( compareDocumentPosition( dom.children[0], (dom.children[0] as Element).children[0], ), ).toBe(10); }); }); describe("uniqueSort", () => { let root: Document; let dom: Element; let p: Element; let span: Element; let a: Element; beforeEach(() => { root = parseDocument("<div><p><span></span></p><a></a></div>"); [dom] = root.children as Element[]; [p, a] = dom.children as Element[]; [span] = p.children as Element[]; }); it("leaves unique elements untouched", () => expect(uniqueSort([p, a])).toStrictEqual([p, a])); it("removes duplicate elements", () => expect(uniqueSort([p, a, p])).toStrictEqual([p, a])); it("sorts nodes in document order", () => expect(uniqueSort([a, dom, span, p])).toStrictEqual([ dom, p, span, a, ])); it("puts the document node in the right spot", () => expect(uniqueSort([a, dom, span, root, p])).toStrictEqual([ root, dom, p, span, a, ])); }); });