From 85b7ddaf2ce43cc97fc3b6b127561cede249cea8 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Wed, 15 Apr 2026 15:10:30 +0200 Subject: [PATCH] Add test for delete selection command --- tests/domain/delete-selection.command.test.ts | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 tests/domain/delete-selection.command.test.ts diff --git a/tests/domain/delete-selection.command.test.ts b/tests/domain/delete-selection.command.test.ts new file mode 100644 index 00000000..38b933ae --- /dev/null +++ b/tests/domain/delete-selection.command.test.ts @@ -0,0 +1,94 @@ +import { describe, expect, it } from "vitest"; + +import { createEditorStore } from "../../src/app/editor-store"; +import { createModelInstance } from "../../src/assets/model-instances"; +import { + createProjectAssetStorageKey, + type ModelAssetRecord +} from "../../src/assets/project-assets"; +import { createDeleteSelectionCommand } from "../../src/commands/delete-selection-command"; +import { createEmptySceneDocument } from "../../src/document/scene-document"; + +const modelAsset = { + id: "asset-model-delete", + kind: "model", + sourceName: "delete-fixture.glb", + mimeType: "model/gltf-binary", + storageKey: createProjectAssetStorageKey("asset-model-delete"), + byteLength: 64, + metadata: { + kind: "model", + format: "glb", + sceneName: "Delete Fixture", + nodeCount: 1, + meshCount: 1, + materialNames: [], + textureNames: [], + animationNames: [], + boundingBox: null, + warnings: [] + } +} satisfies ModelAssetRecord; + +describe("delete selection command", () => { + it("deletes same-kind selections in one undoable batch action", () => { + const modelInstanceA = createModelInstance({ + id: "model-instance-delete-a", + assetId: modelAsset.id, + position: { + x: 0, + y: 0, + z: 0 + } + }); + const modelInstanceB = createModelInstance({ + id: "model-instance-delete-b", + assetId: modelAsset.id, + position: { + x: 4, + y: 1, + z: -2 + } + }); + const store = createEditorStore({ + initialDocument: { + ...createEmptySceneDocument({ name: "Delete Multi Fixture" }), + assets: { + [modelAsset.id]: modelAsset + }, + modelInstances: { + [modelInstanceA.id]: modelInstanceA, + [modelInstanceB.id]: modelInstanceB + } + } + }); + const selection = { + kind: "modelInstances" as const, + ids: [modelInstanceA.id, modelInstanceB.id] + }; + + store.setSelection(selection); + store.executeCommand(createDeleteSelectionCommand(selection)); + + expect(store.getState().document.modelInstances[modelInstanceA.id]).toBeUndefined(); + expect(store.getState().document.modelInstances[modelInstanceB.id]).toBeUndefined(); + expect(store.getState().selection).toEqual({ + kind: "none" + }); + expect(store.getState().activeSelectionId).toBeNull(); + + expect(store.undo()).toBe(true); + expect(store.getState().document.modelInstances[modelInstanceA.id]).toEqual( + modelInstanceA + ); + expect(store.getState().document.modelInstances[modelInstanceB.id]).toEqual( + modelInstanceB + ); + expect(store.getState().selection).toEqual(selection); + expect(store.getState().activeSelectionId).toBe(modelInstanceB.id); + + expect(store.redo()).toBe(true); + expect(store.getState().document.modelInstances[modelInstanceA.id]).toBeUndefined(); + expect(store.getState().document.modelInstances[modelInstanceB.id]).toBeUndefined(); + }); +});