import InfiniteGrid, { InfiniteGridItemInfo, getRenderingItems, InfiniteGridOptions, STATUS_TYPE, mountRenderingItems, Renderer, } from "../../src"; import { SampleGrid } from "./samples/SampleGrid"; import { sandbox, cleanup, waitEvent } from "./utils/utils"; describe("test cfcs", () => { let ig: InfiniteGrid | null; let container: HTMLElement | null; let items: InfiniteGridItemInfo[]; beforeEach(() => { container = sandbox("")!; container!.style.cssText = ""; items = [0, 1, 2, 3, 4, 5].map((item) => { return { key: item, groupKey: Math.floor(item / 3), html: `
${item}
`, }; }); }); afterEach(() => { if (ig) { ig!.destroy(); } ig = null; container = null; cleanup(); }); it("should check if rendering items exist (useFirstRender: true)", () => { // Given, When const renderingItems = getRenderingItems(items, { grid: null, horizontal: false, status: null, useFirstRender: true, useLoading: false, usePlaceholder: false, }); // Then expect(renderingItems.length).to.be.equals(3); }); it("should check if rendering items does not exist (useLoading: false)", () => { // Given, When const renderingItems = getRenderingItems(items, { grid: null, horizontal: false, status: null, useFirstRender: false, useLoading: false, usePlaceholder: false, }); // Then expect(renderingItems.length).to.be.equals(0); }); it("should check if rendering items exists with loading", async () => { // Given container!.innerHTML = `
`; const wrapper = container!.querySelector(".wrapper")!; ig = new InfiniteGrid(wrapper, { gridConstructor: SampleGrid, container: true, }); ig.syncItems(items); ig.setLoading({ html: `
`, }); await waitEvent(ig!, "renderComplete"); // When ig.wait(); await waitEvent(ig!, "renderComplete"); const renderingItems = getRenderingItems(items, { grid: ig, horizontal: false, status: null, useFirstRender: false, useLoading: true, usePlaceholder: false, }); // Then // 3 3 1 expect(renderingItems.length).to.be.equals(7); }); it("should check if the key is maintained every time it is updated", async () => { // Given const noKeyItems = [0, 1, 2, 3, 4, 5].map((item) => { return { html: `
${item}
`, }; }); container!.innerHTML = `
`; const wrapper = container!.querySelector(".wrapper")!; ig = new InfiniteGrid(wrapper, { gridConstructor: SampleGrid, container: true, }); // When // first render ig.syncItems(noKeyItems); await waitEvent(ig!, "renderComplete"); const renderingItems = ig.getRenderingItems(); // second render ig.syncItems(noKeyItems); ig.renderItems(); await waitEvent(ig!, "renderComplete"); const renderingItems2 = ig.getRenderingItems(); // Then renderingItems.forEach((item, i) => { const item2 = renderingItems2[i]; expect(item.groupKey).to.be.equals(item2.groupKey); expect(item.key).to.be.equals(item2.key); expect(item.element).to.be.equals(item2.element); }); }); it("should check if the element is updated even if the key is the same", async () => { // Given const firstItems = [0, 1, 2, 3, 4, 5].map((i) => { return { key: i, element: document.createElement("div"), }; }); container!.innerHTML = `
`; const wrapper = container!.querySelector(".wrapper")!; ig = new InfiniteGrid(wrapper, { gridConstructor: SampleGrid, container: true, }); // first render ig.syncItems(firstItems); await waitEvent(ig!, "renderComplete"); // When // second render with same key const nextItems = [0, 1, 2, 3, 4, 5].map((i) => { return { key: i, element: document.createElement("li"), }; }); ig.getContainerElement().innerHTML = ""; nextItems.forEach((item) => { ig!.getContainerElement().appendChild(item.element); }); ig.syncItems(nextItems); ig.renderItems(); await waitEvent(ig!, "renderComplete"); const renderingItems2 = ig.getRenderingItems(); // Then nextItems.forEach((item, i) => { const item2 = renderingItems2[i]; expect(item.element).to.be.equals(item2.element); }); }); it("should check if rendering items exists with placeholders", async () => { // Given container!.innerHTML = `
`; const wrapper = container!.querySelector(".wrapper")!; ig = new InfiniteGrid(wrapper, { gridConstructor: SampleGrid, container: true, }); ig.syncItems(items); ig.setPlaceholder({ html: `
`, }); await waitEvent(ig!, "renderComplete"); // When ig.wait(); ig.appendPlaceholders(5, 4); await waitEvent(ig!, "renderComplete"); const renderingItems = getRenderingItems(items, { grid: ig, horizontal: false, status: null, useFirstRender: false, useLoading: false, usePlaceholder: true, }); // Then // 3 3 5 expect(renderingItems.length).to.be.equals(11); }); it("should check if rendering items exists with visible status", async () => { // Given container!.innerHTML = `
`; const wrapper = container!.querySelector(".wrapper")!; ig = new InfiniteGrid(wrapper, { gridConstructor: SampleGrid, container: true, }); ig.syncItems([0, 1, 2, 3, 4, 5, 6, 7, 8].map((item) => { return { key: item, groupKey: Math.floor(item / 3), html: `
${item}
`, }; })); await waitEvent(ig!, "renderComplete"); // 3 3 x const status = ig.getStatus(STATUS_TYPE.MINIMIZE_INVISIBLE_ITEMS); // When const renderingItems = getRenderingItems(items, { grid: null, horizontal: false, status, useFirstRender: false, useLoading: false, usePlaceholder: false, }); // Then // 3 3 5 expect(renderingItems.length).to.be.equals(6); }); it("should check whether the rendering is done even if the item is changed during status recovery", async () => { // Given container!.innerHTML = `
`; const wrapper = container!.querySelector(".wrapper")!; ig = new InfiniteGrid(wrapper, { gridConstructor: SampleGrid, container: true, }); ig.syncItems([0, 1, 2, 3, 4, 5, 6, 7, 8].map((item) => { return { key: item, html: `
${item}
`, }; })); await waitEvent(ig!, "renderComplete"); const status = ig.getStatus(); ig.destroy(); const renderer = new Renderer(); ig = new InfiniteGrid(wrapper, { gridConstructor: SampleGrid, container: true, renderer, }); // When // change itmes const nextItems = [0, 1, 2, 3, 5, 6, 7, 8].map((item) => { return { key: item, html: `
${item}
`, }; }); ig.getContainerElement().innerHTML = nextItems.map((item) => item.html).join(""); mountRenderingItems(nextItems, { grid: ig, status, useFirstRender: true, usePlaceholder: false, useLoading: false, horizontal: false, }); setTimeout(() => { renderer.updated(); }); // restore await waitEvent(ig, "renderComplete"); // re-render await waitEvent(ig, "renderComplete"); // Then const children = [].slice.call(ig.getContainerElement().children); children.forEach((child, i) => { expect(child.style.top).to.be.equals(`${i * 100}px`); }); }); });