diff --git a/tests/unit/terrain-grid-resize-controls.test.ts b/tests/unit/terrain-grid-resize-controls.test.ts new file mode 100644 index 00000000..73fc7c34 --- /dev/null +++ b/tests/unit/terrain-grid-resize-controls.test.ts @@ -0,0 +1,68 @@ +import { describe, expect, it } from "vitest"; + +import { createTerrain } from "../../src/document/terrains"; +import { + resizeTerrainGridFromBorderDrag, + resolveTerrainGridResizeSideFromLocalPosition +} from "../../src/viewport-three/terrain-grid-resize-controls"; + +describe("terrain grid resize viewport controls", () => { + it("resolves cardinal sides from local border hover positions", () => { + const terrain = createTerrain({ + id: "terrain-grid-hover-sides", + sampleCountX: 5, + sampleCountZ: 5, + cellSize: 1 + }); + + expect(resolveTerrainGridResizeSideFromLocalPosition(terrain, 0.1, 2, 0.25)).toBe( + "west" + ); + expect(resolveTerrainGridResizeSideFromLocalPosition(terrain, 3.9, 2, 0.25)).toBe( + "east" + ); + expect(resolveTerrainGridResizeSideFromLocalPosition(terrain, 2, 0.1, 0.25)).toBe( + "south" + ); + expect(resolveTerrainGridResizeSideFromLocalPosition(terrain, 2, 3.9, 0.25)).toBe( + "north" + ); + expect(resolveTerrainGridResizeSideFromLocalPosition(terrain, 2, 2, 0.25)).toBeNull(); + }); + + it("drags east and north borders by rounded cell deltas", () => { + const terrain = createTerrain({ + id: "terrain-grid-drag-east-north", + sampleCountX: 5, + sampleCountZ: 5, + cellSize: 1 + }); + + const eastResized = resizeTerrainGridFromBorderDrag(terrain, "east", 1.6); + const northResized = resizeTerrainGridFromBorderDrag(terrain, "north", -1.2); + + expect(eastResized.sampleCountX).toBe(7); + expect(eastResized.sampleCountZ).toBe(5); + expect(eastResized.position).toEqual(terrain.position); + expect(northResized.sampleCountX).toBe(5); + expect(northResized.sampleCountZ).toBe(4); + expect(northResized.position).toEqual(terrain.position); + }); + + it("drags west and south borders by moving the terrain origin", () => { + const terrain = createTerrain({ + id: "terrain-grid-drag-west-south", + sampleCountX: 5, + sampleCountZ: 5, + cellSize: 1 + }); + + const westResized = resizeTerrainGridFromBorderDrag(terrain, "west", 2); + const southResized = resizeTerrainGridFromBorderDrag(terrain, "south", -2); + + expect(westResized.sampleCountX).toBe(7); + expect(westResized.position.x).toBe(terrain.position.x - 2); + expect(southResized.sampleCountZ).toBe(3); + expect(southResized.position.z).toBe(terrain.position.z + 2); + }); +});