From 493bbc6c2ee54ed755dba8a1bbc68f4c7a6255f7 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Mon, 27 Apr 2026 00:03:23 +0200 Subject: [PATCH] Add test case to verify selection synchronization logic in ViewportCanvas --- tests/unit/viewport-canvas.test.tsx | 81 +++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/tests/unit/viewport-canvas.test.tsx b/tests/unit/viewport-canvas.test.tsx index 9418e08c..e681f31a 100644 --- a/tests/unit/viewport-canvas.test.tsx +++ b/tests/unit/viewport-canvas.test.tsx @@ -252,6 +252,87 @@ describe("ViewportCanvas", () => { }); }); + it("syncs selection without resyncing the viewport document", async () => { + const brush = createBoxBrush({ + id: "selection-sync-brush" + }); + const sceneDocument = { + ...createEmptySceneDocument(), + brushes: { + [brush.id]: brush + } + }; + const cameraState = createDefaultViewportPanelCameraState(); + const renderCanvas = ( + selection: EditorSelection, + activeSelectionId: string | null + ) => ( + true)} + onCommitCreation={vi.fn(() => true)} + onCameraStateChange={vi.fn()} + onToolPreviewChange={vi.fn()} + onTransformSessionChange={vi.fn()} + onTransformCommit={vi.fn()} + onTransformCancel={vi.fn()} + /> + ); + + const { rerender } = render(renderCanvas({ kind: "none" }, null)); + + await waitFor(() => { + expect(viewportHostInstances).toHaveLength(1); + expect(viewportHostInstances[0].updateDocument).toHaveBeenCalledWith( + sceneDocument + ); + }); + + const viewportHost = viewportHostInstances[0]; + expect(viewportHost.updateDocument.mock.calls[0]).toHaveLength(1); + viewportHost.updateDocument.mockClear(); + viewportHost.updateSelection.mockClear(); + + const selectedBrush: EditorSelection = { + kind: "brushes", + ids: [brush.id] + }; + rerender(renderCanvas(selectedBrush, brush.id)); + + await waitFor(() => { + expect(viewportHost.updateSelection).toHaveBeenCalledWith( + selectedBrush, + brush.id + ); + }); + expect(viewportHost.updateDocument).not.toHaveBeenCalled(); + }); + it("pushes editor simulation scene state into the viewport host", async () => { const sceneDocument = createEmptySceneDocument(); const editorSimulationScene = buildRuntimeSceneFromDocument(sceneDocument);