Add tests for simulation frame and scene version updates

This commit is contained in:
2026-04-27 16:09:47 +02:00
parent 12f7bdada3
commit 06e1044989

View File

@@ -384,11 +384,150 @@ describe("ViewportCanvas", () => {
expect(viewportHostInstances).toHaveLength(1);
expect(viewportHostInstances[0].updateSimulation).toHaveBeenCalledWith(
editorSimulationFrame.runtimeScene,
editorSimulationFrame.clock
editorSimulationFrame.clock,
{
sceneVersion: editorSimulationFrame.sceneVersion,
frameVersion: editorSimulationFrame.frameVersion
}
);
});
});
it("routes ordinary editor simulation frames through the incremental host update", async () => {
const sceneDocument = createEmptySceneDocument();
sceneDocument.time.dayLengthMinutes = 24;
const editorSimulationController = new EditorSimulationController({
requestAnimationFrame: () => 1,
cancelAnimationFrame: () => undefined
});
editorSimulationController.updateInputs({
document: sceneDocument,
loadedModelAssets: {}
});
render(
<ViewportCanvas
panelId="topLeft"
world={sceneDocument.world}
sceneDocument={sceneDocument}
editorSimulationController={editorSimulationController}
projectAssets={sceneDocument.assets}
loadedModelAssets={{}}
loadedImageAssets={{}}
whiteboxSelectionMode="object"
whiteboxSnapEnabled
whiteboxSnapStep={1}
viewportGridVisible={true}
selection={{ kind: "none" }}
activeSelectionId={null}
terrainBrushState={null}
toolMode="select"
toolPreview={{ kind: "none" }}
transformSession={createInactiveTransformSession()}
cameraState={createDefaultViewportPanelCameraState()}
viewMode="perspective"
displayMode="normal"
layoutMode="single"
isActivePanel
focusRequestId={0}
focusSelection={{ kind: "none" }}
onSelectionChange={vi.fn()}
onTerrainBrushCommit={vi.fn(() => 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);
});
const viewportHost = viewportHostInstances[0];
viewportHost.updateSimulation.mockClear();
viewportHost.updateSimulationFrame.mockClear();
act(() => {
editorSimulationController.play();
editorSimulationController.advance(0.25);
});
expect(viewportHost.updateSimulation).not.toHaveBeenCalled();
expect(viewportHost.updateSimulationFrame).toHaveBeenCalled();
});
it("routes editor simulation scene-version changes through the structural host update", async () => {
const sceneDocument = createEmptySceneDocument();
const editorSimulationController = new EditorSimulationController();
editorSimulationController.updateInputs({
document: sceneDocument,
loadedModelAssets: {}
});
render(
<ViewportCanvas
panelId="topLeft"
world={sceneDocument.world}
sceneDocument={sceneDocument}
editorSimulationController={editorSimulationController}
projectAssets={sceneDocument.assets}
loadedModelAssets={{}}
loadedImageAssets={{}}
whiteboxSelectionMode="object"
whiteboxSnapEnabled
whiteboxSnapStep={1}
viewportGridVisible={true}
selection={{ kind: "none" }}
activeSelectionId={null}
terrainBrushState={null}
toolMode="select"
toolPreview={{ kind: "none" }}
transformSession={createInactiveTransformSession()}
cameraState={createDefaultViewportPanelCameraState()}
viewMode="perspective"
displayMode="normal"
layoutMode="single"
isActivePanel
focusRequestId={0}
focusSelection={{ kind: "none" }}
onSelectionChange={vi.fn()}
onTerrainBrushCommit={vi.fn(() => 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);
});
const viewportHost = viewportHostInstances[0];
viewportHost.updateSimulation.mockClear();
viewportHost.updateSimulationFrame.mockClear();
const nextSceneDocument = {
...sceneDocument,
name: "Structural Simulation Scene"
};
act(() => {
editorSimulationController.updateInputs({
document: nextSceneDocument,
loadedModelAssets: {}
});
});
expect(viewportHost.updateSimulation).toHaveBeenCalledTimes(1);
expect(viewportHost.updateSimulationFrame).not.toHaveBeenCalled();
});
it("shows the surface snap translate overlay when the active transform enables it", () => {
const sceneDocument = createEmptySceneDocument();
const brush = createBoxBrush({