import { MasonryInfiniteGrid } from "../../src";
import { cleanup, sandbox, waitEvent } from "./utils/utils";
describe("test InfiniteGrid", () => {
let ig: MasonryInfiniteGrid | null;
let container: HTMLElement | null;
beforeEach(() => {
container = sandbox("")!;
container!.style.cssText = "";
});
afterEach(() => {
if (ig) {
ig!.destroy();
}
ig = null;
container = null;
cleanup();
});
describe("test outlines", () => {
it("should check whether the outline of the invisible area and the visible area are connected", async () => {
// Given
container!.innerHTML = `
`;
const wrapper = container!.querySelector(".wrapper")!;
ig = new MasonryInfiniteGrid(wrapper, {
container: true,
});
const bottomArea = document.createElement("div");
wrapper.appendChild(bottomArea);
const igScrollContainer = ig!.getScrollContainerElement();
ig!.syncItems([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map((child) => {
return {
groupKey: Math.floor(child / 4),
key: `key${child}`,
html: `${child}
`,
};
}));
ig!.setCursors(0, 2);
ig!.renderItems();
await waitEvent(ig!, "renderComplete");
const outlineLength1 = ig!.getVisibleGroups()[0].grid.getOutlines().start.length;
// When
// [1, 2]
igScrollContainer.scrollTop = 1000;
await waitEvent(ig!, "renderComplete");
// [1, 2] for first size
ig!.getVisibleItems().forEach((item) => {
item.element!.style.cssText = "width: 300px";
});
ig.updateItems();
await waitEvent(ig!, "renderComplete");
const outlineLength2 = ig!.getVisibleGroups()[0].grid.getOutlines().start.length;
// Then
expect(outlineLength1).to.be.equals(2);
expect(outlineLength2).to.be.equals(1);
});
it("should check whether the outline of the invisible area and the last area are connected", async () => {
// Given
container!.innerHTML = ``;
const wrapper = container!.querySelector(".wrapper")!;
ig = new MasonryInfiniteGrid(wrapper, {
container: true,
});
const bottomArea = document.createElement("div");
bottomArea.style.cssText = "position: relative;height: 500px";
wrapper.appendChild(bottomArea);
const igScrollContainer = ig!.getScrollContainerElement();
ig!.syncItems([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].map((child) => {
return {
groupKey: Math.floor(child / 4),
key: `key${child}`,
html: `${child}
`,
};
}));
ig!.setCursors(0, 3);
ig!.renderItems();
// [0, 3]
await waitEvent(ig!, "renderComplete");
// [0, 1]
await waitEvent(ig!, "renderComplete");
// When
igScrollContainer.scrollTop = 2000;
// [1, 3]
await waitEvent(ig!, "renderComplete");
// Then
expect(ig.getStartCursor()).to.be.equals(3);
expect(ig.getVisibleGroups()[0].grid.getOutlines().start).to.be.lengthOf(2);
});
it("should check whether the outline of the invisible area and the last area are connected", async () => {
// Given
container!.innerHTML = ``;
const wrapper = container!.querySelector(".wrapper")!;
ig = new MasonryInfiniteGrid(wrapper, {
container: true,
});
const bottomArea = document.createElement("div");
bottomArea.style.cssText = "position: relative;height: 500px";
wrapper.appendChild(bottomArea);
ig!.syncItems([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].map((child) => {
// 0 ~ 3, 4 ~ 7, 8 ~ 11, 12 ~ 13
const width = child >= 12 ? "100%" : "150px";
const column = child >= 12 ? "2" : "";
return {
groupKey: Math.floor(child / 4),
key: `key${child}`,
attributes: {
column,
},
html: `${child}
`,
};
}));
ig!.renderItems();
// [0, 0]
await waitEvent(ig!, "renderComplete");
// [0, 1]
await waitEvent(ig!, "renderComplete");
// 12 left 0, top 1000
const rect12 = ig.getItems()[12].cssRect;
// 13 left 0, top 1000
const rect13 = ig.getItems()[13].cssRect;
// Then
expect(rect12.left).to.be.equals(0);
expect(rect12.top).to.be.equals(1000);
expect(rect13.left).to.be.equals(0);
expect(rect13.top).to.be.equals(1000);
});
});
});