import { describe, expect, it } from "vitest"; import { deriveDungeonEncounterCombatEvents } from "./dungeonEncounterCombatEvents"; describe("dungeon encounter combat event bridge", () => { it("emits stable engage, descending health, and death edges once", () => { const engaged = deriveDungeonEncounterCombatEvents({}, { boss: { engaged: true, dead: false, despawned: false, health: 1_000, maxHealth: 1_000 }, }, 1); expect(engaged.events).toEqual([{ kind: "entity-engaged", entityId: "boss", now: 1 }]); const damaged = deriveDungeonEncounterCombatEvents(engaged.cursor, { boss: { engaged: true, dead: false, despawned: false, health: 490, maxHealth: 1_000 }, }, 2); expect(damaged.events).toEqual([{ kind: "entity-health", entityId: "boss", healthPercent: 49, now: 2, }]); const unchanged = deriveDungeonEncounterCombatEvents(damaged.cursor, { boss: { engaged: true, dead: false, despawned: false, health: 490, maxHealth: 1_000 }, }, 3); expect(unchanged.events).toEqual([]); const dead = deriveDungeonEncounterCombatEvents(unchanged.cursor, { boss: { engaged: false, dead: true, despawned: false, health: 0, maxHealth: 1_000 }, }, 4); expect(dead.events).toEqual([{ kind: "entity-death", entityId: "boss", now: 4 }]); expect(deriveDungeonEncounterCombatEvents(dead.cursor, { boss: { engaged: false, dead: true, despawned: false, health: 0, maxHealth: 1_000 }, }, 5).events).toEqual([]); }); it("does not treat scripted despawn as death and permits a later respawn edge", () => { const first = deriveDungeonEncounterCombatEvents({}, { add: { engaged: true, dead: false, despawned: false, health: 100, maxHealth: 100 }, }, 1); const despawned = deriveDungeonEncounterCombatEvents(first.cursor, { add: { engaged: false, dead: false, despawned: true, health: 100, maxHealth: 100 }, }, 2); expect(despawned.events).toEqual([]); expect(despawned.cursor).toEqual({}); expect(deriveDungeonEncounterCombatEvents(despawned.cursor, { add: { engaged: true, dead: false, despawned: false, health: 100, maxHealth: 100 }, }, 3).events).toEqual([{ kind: "entity-engaged", entityId: "add", now: 3 }]); }); });