Files
webeditor3d/tests/unit/entity-instances.test.ts

132 lines
3.9 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
DEFAULT_POINT_LIGHT_COLOR_HEX,
DEFAULT_POINT_LIGHT_DISTANCE,
DEFAULT_POINT_LIGHT_INTENSITY,
DEFAULT_PLAYER_START_BOX_SIZE,
DEFAULT_PLAYER_START_CAPSULE_HEIGHT,
DEFAULT_PLAYER_START_CAPSULE_RADIUS,
DEFAULT_PLAYER_START_EYE_HEIGHT,
DEFAULT_SPOT_LIGHT_ANGLE_DEGREES,
DEFAULT_SPOT_LIGHT_COLOR_HEX,
DEFAULT_SPOT_LIGHT_DISTANCE,
DEFAULT_SPOT_LIGHT_DIRECTION,
DEFAULT_SPOT_LIGHT_INTENSITY,
DEFAULT_INTERACTABLE_PROMPT,
DEFAULT_SOUND_EMITTER_AUDIO_ASSET_ID,
DEFAULT_SOUND_EMITTER_MAX_DISTANCE,
DEFAULT_SOUND_EMITTER_REF_DISTANCE,
DEFAULT_SOUND_EMITTER_VOLUME,
DEFAULT_TRIGGER_VOLUME_SIZE,
createPointLightEntity,
createDefaultEntityInstance,
createInteractableEntity,
createSpotLightEntity,
getEntityRegistryEntry
} from "../../src/entities/entity-instances";
describe("entity registry defaults", () => {
it("creates explicit typed defaults for each supported entity kind", () => {
expect(createDefaultEntityInstance("playerStart")).toMatchObject({
kind: "playerStart",
position: { x: 0, y: 0, z: 0 },
yawDegrees: 0,
navigationMode: "firstPerson",
collider: {
mode: "capsule",
eyeHeight: DEFAULT_PLAYER_START_EYE_HEIGHT,
capsuleRadius: DEFAULT_PLAYER_START_CAPSULE_RADIUS,
capsuleHeight: DEFAULT_PLAYER_START_CAPSULE_HEIGHT,
boxSize: DEFAULT_PLAYER_START_BOX_SIZE
}
});
expect(createDefaultEntityInstance("pointLight")).toMatchObject({
kind: "pointLight",
position: { x: 0, y: 0, z: 0 },
colorHex: DEFAULT_POINT_LIGHT_COLOR_HEX,
intensity: DEFAULT_POINT_LIGHT_INTENSITY,
distance: DEFAULT_POINT_LIGHT_DISTANCE
});
expect(createDefaultEntityInstance("spotLight")).toMatchObject({
kind: "spotLight",
position: { x: 0, y: 0, z: 0 },
direction: DEFAULT_SPOT_LIGHT_DIRECTION,
colorHex: DEFAULT_SPOT_LIGHT_COLOR_HEX,
intensity: DEFAULT_SPOT_LIGHT_INTENSITY,
distance: DEFAULT_SPOT_LIGHT_DISTANCE,
angleDegrees: DEFAULT_SPOT_LIGHT_ANGLE_DEGREES
});
expect(createDefaultEntityInstance("soundEmitter")).toMatchObject({
kind: "soundEmitter",
position: { x: 0, y: 0, z: 0 },
audioAssetId: DEFAULT_SOUND_EMITTER_AUDIO_ASSET_ID,
volume: DEFAULT_SOUND_EMITTER_VOLUME,
refDistance: DEFAULT_SOUND_EMITTER_REF_DISTANCE,
maxDistance: DEFAULT_SOUND_EMITTER_MAX_DISTANCE,
autoplay: false,
loop: false
});
expect(createDefaultEntityInstance("triggerVolume")).toMatchObject({
kind: "triggerVolume",
position: { x: 0, y: 0, z: 0 },
size: DEFAULT_TRIGGER_VOLUME_SIZE,
triggerOnEnter: true,
triggerOnExit: false
});
expect(createDefaultEntityInstance("teleportTarget")).toMatchObject({
kind: "teleportTarget",
position: { x: 0, y: 0, z: 0 },
yawDegrees: 0
});
expect(createDefaultEntityInstance("interactable")).toMatchObject({
kind: "interactable",
position: { x: 0, y: 0, z: 0 },
radius: 1.5,
prompt: DEFAULT_INTERACTABLE_PROMPT,
enabled: true
});
});
it("keeps entity metadata and prompt validation explicit", () => {
expect(getEntityRegistryEntry("triggerVolume")).toMatchObject({
kind: "triggerVolume",
label: "Trigger Volume"
});
expect(
createInteractableEntity({
prompt: " Open "
}).prompt
).toBe("Open");
expect(() =>
createInteractableEntity({
prompt: " "
})
).toThrow("Interactable prompt must be non-empty.");
expect(() =>
createPointLightEntity({
distance: 0
})
).toThrow("Point Light distance must be a finite number greater than zero.");
expect(() =>
createSpotLightEntity({
direction: {
x: 0,
y: 0,
z: 0
}
})
).toThrow("Spot Light direction must not be the zero vector.");
});
});