diff --git a/tests/unit/viewport-canvas.test.tsx b/tests/unit/viewport-canvas.test.tsx index 97fddbfe..0fbba7cf 100644 --- a/tests/unit/viewport-canvas.test.tsx +++ b/tests/unit/viewport-canvas.test.tsx @@ -10,6 +10,7 @@ import { import type { ArmedTerrainBrushState } from "../../src/core/terrain-brush"; import { createBoxBrush } from "../../src/document/brushes"; import { createEmptySceneDocument } from "../../src/document/scene-document"; +import { createTerrain } from "../../src/document/terrains"; import { createRuntimeClockState } from "../../src/runtime-three/runtime-project-time"; import { buildRuntimeSceneFromDocument } from "../../src/runtime-three/runtime-scene-build"; import { ViewportCanvas } from "../../src/viewport-three/ViewportCanvas"; @@ -482,4 +483,126 @@ describe("ViewportCanvas", () => { screen.getByTestId("viewport-terrain-brush-preview-topLeft") ).toHaveTextContent("terrain · paint · layer 3"); }); + + it("does not refocus the viewport when the scene document changes without a new focus request", async () => { + const baseSceneDocument = createEmptySceneDocument(); + const focusedTerrain = createTerrain({ + id: "terrain-focused" + }); + const focusedSceneDocument = { + ...baseSceneDocument, + terrains: { + [focusedTerrain.id]: focusedTerrain + } + }; + const updatedSceneDocument = { + ...focusedSceneDocument, + terrains: { + [focusedTerrain.id]: createTerrain({ + ...focusedTerrain, + heights: focusedTerrain.heights.map((height, index) => + index === 0 ? height + 1 : height + ) + }) + } + }; + const cameraState = createDefaultViewportPanelCameraState(); + const onCameraStateChange = vi.fn( + (_cameraState: ViewportPanelCameraState) => undefined + ); + const onToolPreviewChange = vi.fn( + (_toolPreview: ViewportToolPreview) => undefined + ); + const onTransformSessionChange = vi.fn( + (_transformSession: TransformSessionState) => undefined + ); + const onTransformCommit = vi.fn( + (_transformSession: ActiveTransformSession) => undefined + ); + const onTransformCancel = vi.fn(() => undefined); + const onSelectionChange = vi.fn(); + + const { rerender } = render( + true)} + onCommitCreation={vi.fn(() => true)} + onCameraStateChange={onCameraStateChange} + onToolPreviewChange={onToolPreviewChange} + onTransformSessionChange={onTransformSessionChange} + onTransformCommit={onTransformCommit} + onTransformCancel={onTransformCancel} + /> + ); + + await waitFor(() => { + expect(viewportHostInstances).toHaveLength(1); + expect(viewportHostInstances[0].focusSelection).toHaveBeenCalledTimes(1); + }); + + rerender( + true)} + onCommitCreation={vi.fn(() => true)} + onCameraStateChange={onCameraStateChange} + onToolPreviewChange={onToolPreviewChange} + onTransformSessionChange={onTransformSessionChange} + onTransformCommit={onTransformCommit} + onTransformCancel={onTransformCancel} + /> + ); + + expect(viewportHostInstances[0].focusSelection).toHaveBeenCalledTimes(1); + }); });