tabulator-tables
Version:
Interactive table generation JavaScript library
149 lines (123 loc) • 5.12 kB
JavaScript
import TabulatorFull from "../../../src/js/core/TabulatorFull";
import SelectRange from "../../../src/js/modules/SelectRange/SelectRange";
describe("SelectRange module", () => {
/** @type {TabulatorFull} */
let tabulator;
/** @type {SelectRange} */
let selectRangeMod;
let tableData = [
{ id: 1, name: "John", age: 30, position: "Manager" },
{ id: 2, name: "Jane", age: 25, position: "Developer" },
{ id: 3, name: "Bob", age: 35, position: "Designer" }
];
let tableColumns = [
{ title: "ID", field: "id" },
{ title: "Name", field: "name" },
{ title: "Age", field: "age" },
{ title: "Position", field: "position" }
];
beforeEach(async () => {
const el = document.createElement("div");
el.id = "tabulator";
document.body.appendChild(el);
tabulator = new TabulatorFull("#tabulator", {
data: tableData,
columns: tableColumns,
selectableRange: true,
});
selectRangeMod = tabulator.module("selectRange");
return new Promise((resolve) => {
tabulator.on("tableBuilt", () => {
resolve();
});
});
});
afterEach(() => {
tabulator.destroy();
document.getElementById("tabulator")?.remove();
});
it("should have one range initially at the top left", () => {
const range = selectRangeMod.getRanges()[0]._range;
expect(range.top).toBe(0);
expect(range.left).toBe(0);
expect(range.bottom).toBe(0);
expect(range.right).toBe(0);
});
it("should add a new range when addRange is called", () => {
const initialRangesCount = selectRangeMod.getRanges().length;
selectRangeMod.addRange();
expect(selectRangeMod.getRanges().length).toBe(initialRangesCount + 1);
});
it("should reset ranges when resetRanges is called", () => {
// Add multiple ranges
selectRangeMod.addRange();
selectRangeMod.addRange();
// Reset ranges
const resetRange = selectRangeMod.resetRanges();
// Should have only one range after reset
expect(selectRangeMod.getRanges().length).toBe(1);
expect(resetRange).toBe(selectRangeMod.getRanges()[0]._range);
});
it("should have correct structure in RangeComponent", () => {
const rangeComponent = selectRangeMod.getRanges()[0];
// Test component properties
expect(rangeComponent._range).toBeDefined();
expect(typeof rangeComponent.getElement).toBe("function");
expect(typeof rangeComponent.getData).toBe("function");
expect(typeof rangeComponent.getCells).toBe("function");
expect(typeof rangeComponent.getRows).toBe("function");
expect(typeof rangeComponent.getColumns).toBe("function");
});
it("should have correct min/max values", () => {
const range = selectRangeMod.getRanges()[0]._range;
// The min/max values should match the start/end values after they're set
range.setStart(1, 2);
range.setEnd(3, 4);
expect(range.top).toBe(1);
expect(range.bottom).toBe(3);
expect(range.left).toBe(2);
expect(range.right).toBe(4);
});
it("should handle Range setStart and setEnd", () => {
const range = selectRangeMod.getRanges()[0]._range;
// Initial values
expect(range.start.row).toBeUndefined();
expect(range.start.col).toBeUndefined();
expect(range.end.row).toBeUndefined();
expect(range.end.col).toBeUndefined();
// Set start
range.setStart(1, 2);
expect(range.start.row).toBe(1);
expect(range.start.col).toBe(2);
// Set end
range.setEnd(3, 4);
expect(range.end.row).toBe(3);
expect(range.end.col).toBe(4);
});
it("should detect overlaps correctly", () => {
const range = selectRangeMod.getRanges()[0]._range;
// Setup range bounds
range.top = 1;
range.bottom = 3;
range.left = 2;
range.right = 4;
// Test overlapping case
expect(range.overlaps(1, 1, 5, 5)).toBe(true);
expect(range.overlaps(3, 3, 5, 5)).toBe(true);
// Test non-overlapping cases
expect(range.overlaps(5, 5, 7, 7)).toBe(false);
expect(range.overlaps(0, 0, 0, 0)).toBe(false);
});
it("should handle destroyedGuard", () => {
const range = selectRangeMod.getRanges()[0]._range;
// Should return true when not destroyed
expect(range.destroyedGuard("testFunction")).toBe(true);
// Test warning message when destroyed
const consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation();
range.destroyed = true;
expect(range.destroyedGuard("testFunction")).toBe(false);
expect(consoleWarnSpy).toHaveBeenCalled();
// Clean up
consoleWarnSpy.mockRestore();
});
});