88 lines
2.6 KiB
TypeScript
88 lines
2.6 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { sampleContentPack } from "@/data/sampleContentPack";
|
|
|
|
import {
|
|
expandLevelFromExit,
|
|
getUnresolvedExits,
|
|
initializeDungeonLevel,
|
|
} from "./dungeon";
|
|
|
|
function createSequenceRoller(values: number[]) {
|
|
let index = 0;
|
|
|
|
return () => {
|
|
const next = values[index];
|
|
index += 1;
|
|
return next;
|
|
};
|
|
}
|
|
|
|
describe("dungeon state", () => {
|
|
it("initializes level 1 with a generated start room", () => {
|
|
const levelState = initializeDungeonLevel({ content: sampleContentPack });
|
|
|
|
expect(levelState.level).toBe(1);
|
|
expect(levelState.discoveredRoomOrder).toEqual(["room.level1.start"]);
|
|
expect(levelState.rooms["room.level1.start"]?.roomClass).toBe("start");
|
|
});
|
|
|
|
it("lists unresolved traversable exits in discovery order", () => {
|
|
const levelState = initializeDungeonLevel({ content: sampleContentPack });
|
|
|
|
expect(getUnresolvedExits(levelState)).toEqual([
|
|
expect.objectContaining({
|
|
roomId: "room.level1.start",
|
|
direction: "north",
|
|
}),
|
|
]);
|
|
});
|
|
|
|
it("expands the dungeon from a chosen exit and links both rooms", () => {
|
|
const levelState = initializeDungeonLevel({ content: sampleContentPack });
|
|
const result = expandLevelFromExit({
|
|
content: sampleContentPack,
|
|
levelState,
|
|
fromRoomId: "room.level1.start",
|
|
exitDirection: "north",
|
|
roomTableCode: "L1SR",
|
|
roller: createSequenceRoller([3, 3]),
|
|
});
|
|
|
|
expect(result.createdRoom.position).toEqual({ x: 0, y: -1 });
|
|
expect(result.levelState.discoveredRoomOrder).toEqual([
|
|
"room.level1.start",
|
|
"room.level1.small.002",
|
|
]);
|
|
expect(result.fromRoom.exits[0]?.leadsToRoomId).toBe("room.level1.small.002");
|
|
expect(result.createdRoom.exits.some((exit) => exit.leadsToRoomId === "room.level1.start")).toBe(
|
|
true,
|
|
);
|
|
});
|
|
|
|
it("rejects placement into an occupied coordinate", () => {
|
|
const levelState = initializeDungeonLevel({ content: sampleContentPack });
|
|
const expanded = expandLevelFromExit({
|
|
content: sampleContentPack,
|
|
levelState,
|
|
fromRoomId: "room.level1.start",
|
|
exitDirection: "north",
|
|
roomTableCode: "L1SR",
|
|
roomId: "room.level1.small.a",
|
|
roller: createSequenceRoller([3, 3]),
|
|
});
|
|
|
|
expect(() =>
|
|
expandLevelFromExit({
|
|
content: sampleContentPack,
|
|
levelState: expanded.levelState,
|
|
fromRoomId: "room.level1.start",
|
|
exitDirection: "north",
|
|
roomTableCode: "L1SR",
|
|
roomId: "room.level1.small.b",
|
|
roller: createSequenceRoller([4, 4]),
|
|
}),
|
|
).toThrow("already connected");
|
|
});
|
|
});
|