diff --git a/tests/unit/viewport-canvas.test.tsx b/tests/unit/viewport-canvas.test.tsx index fd6d4046..93e95c4b 100644 --- a/tests/unit/viewport-canvas.test.tsx +++ b/tests/unit/viewport-canvas.test.tsx @@ -7,6 +7,7 @@ import { type ActiveTransformSession, type TransformSessionState } from "../../src/core/transform-session"; +import type { ArmedTerrainBrushState } from "../../src/core/terrain-brush"; import { createBoxBrush } from "../../src/document/brushes"; import { createEmptySceneDocument } from "../../src/document/scene-document"; import { createRuntimeClockState } from "../../src/runtime-three/runtime-project-time"; @@ -40,11 +41,13 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setTransformSessionChangeHandler: ReturnType; setTransformCommitHandler: ReturnType; setTransformCancelHandler: ReturnType; + setTerrainBrushCommitHandler: ReturnType; setWhiteboxHoverLabelChangeHandler: ReturnType; setWhiteboxSelectionMode: ReturnType; setWhiteboxSnapSettings: ReturnType; setGridVisible: ReturnType; setToolMode: ReturnType; + setTerrainBrushState: ReturnType; setCreationPreview: ReturnType; setTransformSession: ReturnType; setPanelId: ReturnType; @@ -69,11 +72,13 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setTransformSessionChangeHandler = vi.fn(); setTransformCommitHandler = vi.fn(); setTransformCancelHandler = vi.fn(); + setTerrainBrushCommitHandler = vi.fn(); setWhiteboxHoverLabelChangeHandler = vi.fn(); setWhiteboxSelectionMode = vi.fn(); setWhiteboxSnapSettings = vi.fn(); setGridVisible = vi.fn(); setToolMode = vi.fn(); + setTerrainBrushState = vi.fn(); setCreationPreview = vi.fn(); setTransformSession = vi.fn(); setPanelId = vi.fn(); @@ -149,6 +154,7 @@ describe("ViewportCanvas", () => { viewportGridVisible={true} selection={{ kind: "none" }} activeSelectionId={null} + terrainBrushState={null} toolMode="create" toolPreview={toolPreview} transformSession={createInactiveTransformSession()} @@ -160,6 +166,7 @@ describe("ViewportCanvas", () => { focusRequestId={0} focusSelection={{ kind: "none" }} onSelectionChange={onSelectionChange} + onTerrainBrushCommit={vi.fn(() => true)} onCommitCreation={onCommitCreation} onCameraStateChange={onCameraStateChange} onToolPreviewChange={onToolPreviewChange} @@ -208,6 +215,7 @@ describe("ViewportCanvas", () => { viewportGridVisible={true} selection={{ kind: "none" }} activeSelectionId={null} + terrainBrushState={null} toolMode="select" toolPreview={{ kind: "none" }} transformSession={createInactiveTransformSession()} @@ -219,6 +227,7 @@ describe("ViewportCanvas", () => { focusRequestId={0} focusSelection={{ kind: "none" }} onSelectionChange={vi.fn()} + onTerrainBrushCommit={vi.fn(() => true)} onCommitCreation={vi.fn(() => true)} onCameraStateChange={onCameraStateChange} onToolPreviewChange={vi.fn()} @@ -260,6 +269,7 @@ describe("ViewportCanvas", () => { viewportGridVisible={true} selection={{ kind: "none" }} activeSelectionId={null} + terrainBrushState={null} toolMode="select" toolPreview={{ kind: "none" }} transformSession={createInactiveTransformSession()} @@ -271,6 +281,7 @@ describe("ViewportCanvas", () => { focusRequestId={0} focusSelection={{ kind: "none" }} onSelectionChange={vi.fn()} + onTerrainBrushCommit={vi.fn(() => true)} onCommitCreation={vi.fn(() => true)} onCameraStateChange={vi.fn()} onToolPreviewChange={vi.fn()} @@ -312,6 +323,7 @@ describe("ViewportCanvas", () => { viewportGridVisible={true} selection={{ kind: "brushes", ids: [brush.id] }} activeSelectionId={brush.id} + terrainBrushState={null} toolMode="select" toolPreview={{ kind: "none" }} transformSession={createTransformSession({ @@ -339,6 +351,7 @@ describe("ViewportCanvas", () => { focusRequestId={0} focusSelection={{ kind: "none" }} onSelectionChange={vi.fn()} + onTerrainBrushCommit={vi.fn(() => true)} onCommitCreation={vi.fn(() => true)} onCameraStateChange={vi.fn()} onToolPreviewChange={vi.fn()} @@ -352,4 +365,67 @@ describe("ViewportCanvas", () => { "translate · surface snap · Local X" ); }); + + it("shows the terrain brush overlay and pushes brush state into the viewport host", async () => { + const sceneDocument = createEmptySceneDocument(); + const terrainBrushState: ArmedTerrainBrushState = { + terrainId: "terrain-selected", + tool: "smooth", + radius: 2.5, + strength: 0.4, + falloff: 0.7 + }; + + render( + true)} + onCommitCreation={vi.fn(() => true)} + onCameraStateChange={vi.fn()} + onToolPreviewChange={vi.fn()} + onTransformSessionChange={vi.fn()} + onTransformCommit={vi.fn()} + onTransformCancel={vi.fn()} + /> + ); + + await waitFor(() => { + expect(viewportHostInstances).toHaveLength(1); + expect(viewportHostInstances[0].setTerrainBrushState).toHaveBeenCalledWith( + terrainBrushState + ); + expect( + viewportHostInstances[0].setTerrainBrushCommitHandler + ).toHaveBeenCalledTimes(1); + }); + + expect( + screen.getByTestId("viewport-terrain-brush-preview-topLeft") + ).toHaveTextContent("terrain · smooth"); + }); });