102 lines
2.9 KiB
TypeScript
102 lines
2.9 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
createMultiSelectState,
|
|
finalizeMultiSelectDraft,
|
|
updateMultiSelectDraft,
|
|
} from "./timelineMultiSelect.js";
|
|
|
|
type TestMultiSelectState = {
|
|
isSelecting: boolean;
|
|
startX: number;
|
|
startY: number;
|
|
currentX: number;
|
|
currentY: number;
|
|
selectedAllocationIds: string[];
|
|
selectedResourceIds: string[];
|
|
dateRange: { start: Date; end: Date } | null;
|
|
multiDragDaysDelta: number;
|
|
isMultiDragging: boolean;
|
|
multiDragMode: "move" | "resize-start" | "resize-end";
|
|
};
|
|
|
|
describe("timelineMultiSelect", () => {
|
|
it("creates a fresh drag-selection state with the provided origin", () => {
|
|
expect(
|
|
createMultiSelectState<TestMultiSelectState>(120, 240, {
|
|
selectedAllocationIds: [],
|
|
selectedResourceIds: [],
|
|
dateRange: null,
|
|
multiDragDaysDelta: 0,
|
|
isMultiDragging: false,
|
|
multiDragMode: "move",
|
|
}),
|
|
).toEqual({
|
|
isSelecting: true,
|
|
startX: 120,
|
|
startY: 240,
|
|
currentX: 120,
|
|
currentY: 240,
|
|
selectedAllocationIds: [],
|
|
selectedResourceIds: [],
|
|
dateRange: null,
|
|
multiDragDaysDelta: 0,
|
|
isMultiDragging: false,
|
|
multiDragMode: "move",
|
|
});
|
|
});
|
|
|
|
it("updates only the current rectangle coordinates while preserving selection metadata", () => {
|
|
const state = createMultiSelectState<TestMultiSelectState>(120, 240, {
|
|
selectedAllocationIds: ["alloc-1"],
|
|
selectedResourceIds: ["res-1"],
|
|
dateRange: {
|
|
start: new Date("2025-01-01T00:00:00.000Z"),
|
|
end: new Date("2025-01-02T00:00:00.000Z"),
|
|
},
|
|
multiDragDaysDelta: 3,
|
|
isMultiDragging: true,
|
|
multiDragMode: "resize-end",
|
|
});
|
|
|
|
expect(updateMultiSelectDraft(state, 155, 275)).toEqual({
|
|
...state,
|
|
currentX: 155,
|
|
currentY: 275,
|
|
});
|
|
});
|
|
|
|
it("resets minimal right-click movement instead of producing a drag rectangle", () => {
|
|
const state = createMultiSelectState<TestMultiSelectState>(120, 240, {
|
|
selectedAllocationIds: [],
|
|
selectedResourceIds: [],
|
|
dateRange: null,
|
|
multiDragDaysDelta: 0,
|
|
isMultiDragging: false,
|
|
multiDragMode: "move",
|
|
});
|
|
|
|
expect(finalizeMultiSelectDraft(state, 123, 243)).toBeNull();
|
|
});
|
|
|
|
it("finalizes a real drag by freezing the rectangle and clearing only isSelecting", () => {
|
|
const state = createMultiSelectState<TestMultiSelectState>(120, 240, {
|
|
selectedAllocationIds: ["alloc-1"],
|
|
selectedResourceIds: ["res-1"],
|
|
dateRange: {
|
|
start: new Date("2025-01-01T00:00:00.000Z"),
|
|
end: new Date("2025-01-02T00:00:00.000Z"),
|
|
},
|
|
multiDragDaysDelta: 2,
|
|
isMultiDragging: true,
|
|
multiDragMode: "resize-start",
|
|
});
|
|
|
|
expect(finalizeMultiSelectDraft(state, 150, 295)).toEqual({
|
|
...state,
|
|
isSelecting: false,
|
|
currentX: 150,
|
|
currentY: 295,
|
|
});
|
|
});
|
|
});
|