diff --git a/tests/domain/runtime-npc-presence.test.ts b/tests/domain/runtime-npc-presence.test.ts new file mode 100644 index 00000000..0e9e56df --- /dev/null +++ b/tests/domain/runtime-npc-presence.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, it } from "vitest"; + +import { + createNpcAlwaysPresence, + createNpcTimeWindowPresence +} from "../../src/entities/entity-instances"; +import { + hasNpcPresenceActivityChanged, + resolveNpcPresenceActive +} from "../../src/runtime-three/runtime-npc-presence"; + +describe("runtime NPC presence", () => { + it("keeps always-authored NPC presence active at any time of day", () => { + const presence = createNpcAlwaysPresence(); + + expect(resolveNpcPresenceActive(presence, 2)).toBe(true); + expect(resolveNpcPresenceActive(presence, 14.5)).toBe(true); + expect( + hasNpcPresenceActivityChanged(presence, 6, 18) + ).toBe(false); + }); + + it("resolves time-windowed NPC presence across midnight and detects window boundaries", () => { + const presence = createNpcTimeWindowPresence({ + startHour: 22, + endHour: 2 + }); + + expect(resolveNpcPresenceActive(presence, 21.5)).toBe(false); + expect(resolveNpcPresenceActive(presence, 23.5)).toBe(true); + expect(resolveNpcPresenceActive(presence, 1.5)).toBe(true); + expect(resolveNpcPresenceActive(presence, 3)).toBe(false); + + expect(hasNpcPresenceActivityChanged(presence, 21.5, 23)).toBe(true); + expect(hasNpcPresenceActivityChanged(presence, 23, 1)).toBe(false); + expect(hasNpcPresenceActivityChanged(presence, 1.5, 2.5)).toBe(true); + }); +});