import { describe, expect, it } from "vitest"; import { deletePlayerCharacter } from "../delete-player-character.js"; import type { PlayerCharacter } from "../player-character-types.js"; import { playerCharacterId } from "../player-character-types.js"; import { isDomainError } from "../types.js"; import { expectDomainError } from "./test-helpers.js"; const id1 = playerCharacterId("pc-1"); const id2 = playerCharacterId("pc-2"); function makePC(overrides?: Partial): PlayerCharacter { return { id: id1, name: "Aragorn", ac: 16, maxHp: 120, color: "green", icon: "sword", ...overrides, }; } describe("deletePlayerCharacter", () => { it("deletes an existing character", () => { const result = deletePlayerCharacter([makePC()], id1); if (isDomainError(result)) throw new Error(result.message); expect(result.characters).toHaveLength(0); }); it("returns error for not-found id", () => { const result = deletePlayerCharacter([makePC()], id2); expectDomainError(result, "player-character-not-found"); }); it("emits PlayerCharacterDeleted event", () => { const result = deletePlayerCharacter([makePC()], id1); if (isDomainError(result)) throw new Error(result.message); expect(result.events).toHaveLength(1); expect(result.events[0].type).toBe("PlayerCharacterDeleted"); }); it("preserves other characters when deleting one", () => { const pc1 = makePC({ id: id1, name: "Aragorn" }); const pc2 = makePC({ id: id2, name: "Legolas" }); const result = deletePlayerCharacter([pc1, pc2], id1); if (isDomainError(result)) throw new Error(result.message); expect(result.characters).toHaveLength(1); expect(result.characters[0].name).toBe("Legolas"); }); it("event includes deleted character name", () => { const result = deletePlayerCharacter([makePC()], id1); if (isDomainError(result)) throw new Error(result.message); const event = result.events[0]; if (event.type !== "PlayerCharacterDeleted") throw new Error("wrong event"); expect(event.name).toBe("Aragorn"); }); });