Add unit tests for ViewportCanvas
This commit is contained in:
93
tests/unit/viewport-canvas.test.tsx
Normal file
93
tests/unit/viewport-canvas.test.tsx
Normal file
@@ -0,0 +1,93 @@
|
||||
import { render, waitFor } from "@testing-library/react";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
import { createEmptySceneDocument } from "../../src/document/scene-document";
|
||||
import { ViewportCanvas } from "../../src/viewport-three/ViewportCanvas";
|
||||
import type { CreationViewportToolPreview, ViewportToolPreview } from "../../src/viewport-three/viewport-transient-state";
|
||||
|
||||
const viewportHostInstances: MockViewportHost[] = [];
|
||||
|
||||
class MockViewportHost {
|
||||
mount = vi.fn();
|
||||
dispose = vi.fn();
|
||||
updateWorld = vi.fn();
|
||||
updateAssets = vi.fn();
|
||||
updateDocument = vi.fn();
|
||||
setViewMode = vi.fn();
|
||||
setDisplayMode = vi.fn();
|
||||
setBrushSelectionChangeHandler = vi.fn();
|
||||
setCreationPreviewChangeHandler = vi.fn();
|
||||
setCreationCommitHandler = vi.fn();
|
||||
setToolMode = vi.fn();
|
||||
setCreationPreview = vi.fn();
|
||||
focusSelection = vi.fn();
|
||||
|
||||
constructor() {
|
||||
viewportHostInstances.push(this);
|
||||
}
|
||||
}
|
||||
|
||||
vi.mock("../../src/viewport-three/viewport-host", () => ({
|
||||
ViewportHost: MockViewportHost
|
||||
}));
|
||||
|
||||
describe("ViewportCanvas", () => {
|
||||
beforeEach(() => {
|
||||
viewportHostInstances.length = 0;
|
||||
vi.spyOn(HTMLCanvasElement.prototype, "getContext").mockImplementation(() => ({}) as never);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.restoreAllMocks();
|
||||
});
|
||||
|
||||
it("wires the creation commit handler into the viewport host", async () => {
|
||||
const sceneDocument = createEmptySceneDocument();
|
||||
const toolPreview: CreationViewportToolPreview = {
|
||||
kind: "create",
|
||||
sourcePanelId: "topLeft",
|
||||
target: {
|
||||
kind: "box-brush"
|
||||
},
|
||||
center: null
|
||||
};
|
||||
const onCommitCreation = vi.fn(() => true);
|
||||
const onToolPreviewChange = vi.fn((_toolPreview: ViewportToolPreview) => undefined);
|
||||
const onSelectionChange = vi.fn();
|
||||
|
||||
render(
|
||||
<ViewportCanvas
|
||||
panelId="topLeft"
|
||||
world={sceneDocument.world}
|
||||
sceneDocument={sceneDocument}
|
||||
projectAssets={sceneDocument.assets}
|
||||
loadedModelAssets={{}}
|
||||
loadedImageAssets={{}}
|
||||
selection={{ kind: "none" }}
|
||||
toolMode="create"
|
||||
toolPreview={toolPreview}
|
||||
viewMode="perspective"
|
||||
displayMode="authoring"
|
||||
layoutMode="single"
|
||||
isActivePanel
|
||||
focusRequestId={0}
|
||||
focusSelection={{ kind: "none" }}
|
||||
onSelectionChange={onSelectionChange}
|
||||
onCommitCreation={onCommitCreation}
|
||||
onToolPreviewChange={onToolPreviewChange}
|
||||
/>
|
||||
);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(viewportHostInstances).toHaveLength(1);
|
||||
expect(viewportHostInstances[0].setCreationCommitHandler).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
const registeredHandler = viewportHostInstances[0].setCreationCommitHandler.mock.calls[0][0] as (
|
||||
toolPreview: CreationViewportToolPreview
|
||||
) => boolean;
|
||||
|
||||
expect(registeredHandler(toolPreview)).toBe(true);
|
||||
expect(onCommitCreation).toHaveBeenCalledWith(toolPreview);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user