import { beforeAll, describe, expect, test } from "bun:test"; import { initCards } from "./cards.js"; import { checkCombatEnd, resolveEnemyTurn, startTurn } from "./combat.js"; import { initEnemies } from "./enemies.js"; import { createCombatState } from "./state.js"; beforeAll(async () => { await Promise.all([initCards(), initEnemies()]); }); describe("startTurn", () => { test("resets energy and block, draws 5 cards", () => { let state = createCombatState("ironclad", "jaw_worm"); state = { ...state, player: { ...state.player, energy: 0, block: 5 }, }; const next = startTurn(state); expect(next.player.energy).toBe(3); expect(next.player.block).toBe(0); expect(next.player.hand).toHaveLength(5); expect(next.combat.dieResult).toBeGreaterThanOrEqual(1); expect(next.combat.dieResult).toBeLessThanOrEqual(6); }); }); describe("resolveEnemyTurn", () => { test("enemy attacks reduce player hp or block", () => { let state = createCombatState("ironclad", "jaw_worm"); state = { ...state, combat: { ...state.combat, dieResult: 1 } }; const next = resolveEnemyTurn(state); expect(next.combat.phase).toBe("player_turn"); expect(next.combat.turn).toBe(state.combat.turn + 1); }); test("enemy block resets before acting", () => { let state = createCombatState("ironclad", "jaw_worm"); state = { ...state, enemy: { ...state.enemy, block: 5 }, combat: { ...state.combat, dieResult: 1 }, }; const next = resolveEnemyTurn(state); // die result 1 maps to a defend action (3 hit + 1 block), block resets then regains 1 expect(next.enemy.block).toBe(1); }); }); describe("checkCombatEnd", () => { test("returns 'victory' when enemy hp is 0", () => { let state = createCombatState("ironclad", "jaw_worm"); state = { ...state, enemy: { ...state.enemy, hp: 0 } }; expect(checkCombatEnd(state)).toBe("victory"); }); test("returns 'defeat' when player hp is 0", () => { let state = createCombatState("ironclad", "jaw_worm"); state = { ...state, player: { ...state.player, hp: 0 } }; expect(checkCombatEnd(state)).toBe("defeat"); }); test("returns null when combat continues", () => { const state = createCombatState("ironclad", "jaw_worm"); expect(checkCombatEnd(state)).toBeNull(); }); });