131 lines
3.9 KiB
TypeScript
131 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,
|
|
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.");
|
|
});
|
|
});
|