import { describe, expect, it } from "vitest"; import { sampleContentPack } from "@/data/sampleContentPack"; import { createRoomStateFromTemplate } from "./rooms"; import { resolveRoomEncounter } from "./encounters"; function createSequenceRoller(values: number[]) { let index = 0; return () => { const next = values[index]; index += 1; return next; }; } describe("encounter resolution", () => { it("marks explicitly empty rooms as having no encounter", () => { const room = createRoomStateFromTemplate( sampleContentPack, "room.level1.small.empty", 1, "room.level1.small.empty-space", ); room.notes.push("Nothing here."); const result = resolveRoomEncounter(sampleContentPack, room); expect(result.encounter?.creatureIds).toEqual([]); expect(result.encounter?.resultLabel).toBe("No encounter"); }); it("uses room context to resolve a guard encounter table", () => { const room = createRoomStateFromTemplate( sampleContentPack, "room.level1.guard-room", 1, "room.level1.normal.guard-room", ); room.notes.push("Use the guards encounter table if occupied."); const result = resolveRoomEncounter( sampleContentPack, room, createSequenceRoller([6]), ); expect(result.lookup?.entry.label).toBe("Guard and Warrior"); expect(result.encounter?.sourceTableCode).toBe("L1G"); expect(result.encounter?.creatureNames).toEqual(["Guard", "Warrior"]); }); it("resolves crate events from room context when the room hints at crate rolls", () => { const room = createRoomStateFromTemplate( sampleContentPack, "room.level1.storage-area", 1, "room.level1.normal.storage-area", ); room.notes.push("Roll for food, drink, or crate events while searching."); const result = resolveRoomEncounter( sampleContentPack, room, createSequenceRoller([2]), ); expect(result.lookup?.entry.label).toBe("Giant Rat Pair"); expect(result.encounter?.sourceTableCode).toBe("L1CE"); expect(result.encounter?.creatureNames).toEqual(["Giant Rat Pair"]); }); });