slaywithfriends/src/combat.test.js

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();
});
});