66 lines
2.3 KiB
JavaScript
66 lines
2.3 KiB
JavaScript
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();
|
|
});
|
|
});
|