Add integration tests for Act 1 edge cases

This commit is contained in:
Jared Miller 2026-02-25 11:26:27 -05:00
parent 7280af2075
commit cd42652087
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C

106
src/integration.test.js Normal file
View file

@ -0,0 +1,106 @@
import { beforeAll, describe, expect, test } from "bun:test";
import { initCards } from "./cards.js";
import { getEnemy, initEnemies } from "./enemies.js";
import {
campfireRest,
campfireSmith,
createRunState,
endCombat,
pickReward,
revealRewards,
skipRewards,
} from "./run.js";
import { createCombatFromRun } from "./state.js";
beforeAll(async () => {
await Promise.all([initCards(), initEnemies()]);
});
describe("skip all rewards → deck stays at 10", () => {
test("3 combats with skipped rewards leave deck unchanged", () => {
let run = createRunState("ironclad");
expect(run.deck).toHaveLength(10);
for (let i = 0; i < 3; i++) {
const { revealed, run: afterReveal } = revealRewards(run);
run = skipRewards(afterReveal, revealed);
expect(run.deck).toHaveLength(10);
}
});
});
describe("take every reward → deck grows", () => {
test("3 combats with picked rewards add 3 cards to deck", () => {
let run = createRunState("ironclad");
expect(run.deck).toHaveLength(10);
for (let i = 0; i < 3; i++) {
const { revealed, run: afterReveal } = revealRewards(run);
run = pickReward(afterReveal, revealed, 0);
}
expect(run.deck).toHaveLength(13);
});
});
describe("rest at campfires → HP carries into combat", () => {
test("healed HP is reflected in combat player state", () => {
let run = { ...createRunState("ironclad"), hp: 5 };
run = campfireRest(run);
expect(run.hp).toBe(8);
const combat = createCombatFromRun(run, "jaw_worm");
expect(combat.players[0].hp).toBe(8);
});
test("campfireRest caps at maxHp and combat reflects the cap", () => {
let run = { ...createRunState("ironclad"), hp: 10 };
run = campfireRest(run);
expect(run.hp).toBe(11);
const combat = createCombatFromRun(run, "jaw_worm");
expect(combat.players[0].hp).toBe(11);
});
});
describe("smith upgrades change cards in combat", () => {
test("smithed card appears in draw pile when combat is created", () => {
let run = createRunState("ironclad");
run = campfireSmith(run, "strike_r");
expect(run.deck).toContain("strike_r+");
const combat = createCombatFromRun(run, "jaw_worm");
const drawPile = combat.players[0].drawPile;
expect(drawPile).toContain("strike_r+");
});
});
describe("fresh run after death resets everything", () => {
test("death leaves hp 0, new run restores full HP and original deck", () => {
let run = createRunState("ironclad");
// simulate dying: endCombat with 0 HP
// ironclad gets +1 from burning blood, so post-combat hp is 1
run = endCombat(run, 0);
expect(run.hp).toBe(1);
// fresh run represents starting over
const fresh = createRunState("ironclad");
expect(fresh.hp).toBe(11);
expect(fresh.maxHp).toBe(11);
expect(fresh.deck).toHaveLength(10);
expect(fresh.combatCount).toBe(0);
});
});
describe("boss enemies are harder than encounter enemies", () => {
test("all bosses have higher HP than all encounter enemies", () => {
const bosses = ["slime_boss", "the_guardian"].map((id) => getEnemy(id));
const encounters = ["jaw_worm", "cultist"].map((id) => getEnemy(id));
const minBossHp = Math.min(...bosses.map((e) => e.hp));
const maxEncounterHp = Math.max(...encounters.map((e) => e.hp));
expect(minBossHp).toBeGreaterThan(maxEncounterHp);
});
});