Files
webeditor3d/tests/domain/entity.command.test.ts

187 lines
5.2 KiB
TypeScript
Raw Normal View History

2026-03-31 05:59:52 +02:00
import { describe, expect, it } from "vitest";
import { createEditorStore } from "../../src/app/editor-store";
import { createUpsertEntityCommand } from "../../src/commands/upsert-entity-command";
import { createPointLightEntity, createSoundEmitterEntity, createSpotLightEntity, createTriggerVolumeEntity } from "../../src/entities/entity-instances";
2026-03-31 05:59:52 +02:00
describe("typed entity upsert command", () => {
it("places a Sound Emitter and restores the previous tool mode across undo and redo", () => {
const store = createEditorStore();
const soundEmitter = createSoundEmitterEntity({
position: {
x: 1,
y: 2,
z: 3
},
audioAssetId: null,
volume: 0.5,
refDistance: 5,
maxDistance: 12
2026-03-31 05:59:52 +02:00
});
2026-04-03 00:23:52 +02:00
store.setToolMode("create");
2026-03-31 05:59:52 +02:00
store.executeCommand(
createUpsertEntityCommand({
entity: soundEmitter,
label: "Place sound emitter"
})
);
expect(store.getState().toolMode).toBe("select");
expect(store.getState().selection).toEqual({
kind: "entities",
ids: [soundEmitter.id]
});
expect(store.getState().document.entities[soundEmitter.id]).toEqual(soundEmitter);
expect(store.undo()).toBe(true);
2026-04-03 00:23:52 +02:00
expect(store.getState().toolMode).toBe("create");
2026-03-31 05:59:52 +02:00
expect(store.getState().document.entities).toEqual({});
expect(store.redo()).toBe(true);
expect(store.getState().toolMode).toBe("select");
expect(store.getState().document.entities[soundEmitter.id]).toEqual(soundEmitter);
});
it("places a Point Light and restores the previous tool mode across undo and redo", () => {
const store = createEditorStore();
const pointLight = createPointLightEntity({
position: {
x: 2,
y: 3,
z: 4
},
colorHex: "#ccddee",
intensity: 1.5,
distance: 9
});
2026-04-03 00:23:52 +02:00
store.setToolMode("create");
store.executeCommand(
createUpsertEntityCommand({
entity: pointLight,
label: "Place point light"
})
);
expect(store.getState().toolMode).toBe("select");
expect(store.getState().selection).toEqual({
kind: "entities",
ids: [pointLight.id]
});
expect(store.getState().document.entities[pointLight.id]).toEqual(pointLight);
expect(store.undo()).toBe(true);
2026-04-03 00:23:52 +02:00
expect(store.getState().toolMode).toBe("create");
expect(store.getState().document.entities).toEqual({});
expect(store.redo()).toBe(true);
expect(store.getState().toolMode).toBe("select");
expect(store.getState().document.entities[pointLight.id]).toEqual(pointLight);
});
2026-03-31 05:59:52 +02:00
it("updates an existing Trigger Volume without changing its entity id", () => {
const store = createEditorStore();
const triggerVolume = createTriggerVolumeEntity({
id: "entity-trigger-main",
size: {
x: 2,
y: 2,
z: 2
}
});
const movedTriggerVolume = createTriggerVolumeEntity({
...triggerVolume,
position: {
x: 4,
y: 1,
z: -2
},
size: {
x: 3,
y: 4,
z: 5
},
triggerOnEnter: false,
triggerOnExit: true
});
store.executeCommand(
createUpsertEntityCommand({
entity: triggerVolume,
label: "Place trigger volume"
})
);
2026-04-03 00:23:52 +02:00
store.setToolMode("create");
2026-03-31 05:59:52 +02:00
store.executeCommand(
createUpsertEntityCommand({
entity: movedTriggerVolume,
label: "Update trigger volume"
})
);
expect(store.getState().toolMode).toBe("select");
expect(store.getState().document.entities[triggerVolume.id]).toEqual(movedTriggerVolume);
expect(store.undo()).toBe(true);
2026-04-03 00:23:52 +02:00
expect(store.getState().toolMode).toBe("create");
2026-03-31 05:59:52 +02:00
expect(store.getState().document.entities[triggerVolume.id]).toEqual(triggerVolume);
expect(store.redo()).toBe(true);
expect(store.getState().document.entities[triggerVolume.id]).toEqual(movedTriggerVolume);
});
it("updates an existing Spot Light without changing its entity id", () => {
const store = createEditorStore();
const spotLight = createSpotLightEntity({
id: "entity-spot-main",
position: {
x: -3,
y: 4,
z: 2
}
});
const movedSpotLight = createSpotLightEntity({
...spotLight,
position: {
x: 5,
y: 6,
z: -4
},
direction: {
x: 0.5,
y: -1,
z: 0.25
},
colorHex: "#aaccee",
intensity: 2.25,
distance: 14,
angleDegrees: 50
});
store.executeCommand(
createUpsertEntityCommand({
entity: spotLight,
label: "Place spot light"
})
);
2026-04-03 00:23:52 +02:00
store.setToolMode("create");
store.executeCommand(
createUpsertEntityCommand({
entity: movedSpotLight,
label: "Update spot light"
})
);
expect(store.getState().toolMode).toBe("select");
expect(store.getState().document.entities[spotLight.id]).toEqual(movedSpotLight);
expect(store.undo()).toBe(true);
2026-04-03 00:23:52 +02:00
expect(store.getState().toolMode).toBe("create");
expect(store.getState().document.entities[spotLight.id]).toEqual(spotLight);
expect(store.redo()).toBe(true);
expect(store.getState().document.entities[spotLight.id]).toEqual(movedSpotLight);
});
2026-03-31 05:59:52 +02:00
});