Files
healer-man/src/game/dungeonSpawnSelection.test.ts
T
2026-09-06 14:38:59 -04:00

47 lines
1.9 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { dungeonSpawnSelected, selectDungeonSessionPopulation } from "./dungeonSpawnSelection";
describe("dungeon spawn selection", () => {
it("keeps ordinary spawns and honors source chance boundaries", () => {
expect(dungeonSpawnSelected("deadmines", 1, { id: "ordinary" })).toBe(true);
expect(dungeonSpawnSelected("deadmines", 1, { id: "never", spawnChance: 0 })).toBe(false);
expect(dungeonSpawnSelected("deadmines", 1, { id: "always", spawnChance: 1 })).toBe(true);
});
it("selects rare spawns deterministically within a dungeon session", () => {
const results = Array.from({ length: 100 }, (_, sessionRevision) => (
dungeonSpawnSelected("blackrock-spire", sessionRevision, {
id: "creature-43519",
spawnChance: 0.15,
})
));
expect(results.some(Boolean)).toBe(true);
expect(results.some((selected) => !selected)).toBe(true);
expect(results).toEqual(Array.from({ length: 100 }, (_, sessionRevision) => (
dungeonSpawnSelected("blackrock-spire", sessionRevision, {
id: "creature-43519",
spawnChance: 0.15,
})
)));
});
it("filters static and roaming source populations with the same session rule", () => {
const population = selectDungeonSessionPopulation("stockades", 4, [
{ id: "ordinary", entityId: "guard", position: [0, 0, 0] },
{ id: "removed", entityId: "rare", position: [1, 0, 0], spawnChance: 0 },
], [{
id: "removed-patrol",
name: "Rare Patrol",
speed: 1,
formationSource: "database-solo",
spawnChance: 0,
waypoints: [[0, 0, 0], [1, 0, 0]],
members: [{ id: "member", entityId: "rare", role: "leader", formationOffset: [0, 0, 0] }],
}]);
expect(population.staticSpawns.map((spawn) => spawn.id)).toEqual(["ordinary"]);
expect(population.roamingPacks).toEqual([]);
});
});