Files
Dune/tests/victory-calendar.test.ts

39 lines
1.9 KiB
TypeScript

import assert from 'node:assert/strict';
import test from 'node:test';
import { continueVictoryCalendar, victoryFinalTurn, VictoryCalendarError } from '../game/victory-calendar';
void test('an unstamped game retains turn ten as its final turn without mutation', () => {
const game = { turn: 4 };
assert.equal(victoryFinalTurn(game), 10);
assert.equal(continueVictoryCalendar(game), 10);
assert.deepEqual(game, { turn: 4 });
});
void test('unanimous continuation at the final turn moves the fallback one full turn', () => {
assert.equal(continueVictoryCalendar({ turn: 10 }), 11);
assert.equal(victoryFinalTurn({ turn: 11, victoryFinalTurn: 11 }), 11);
assert.equal(continueVictoryCalendar({ turn: 11, victoryFinalTurn: 11 }), 12);
assert.equal(continueVictoryCalendar({ turn: 10, victoryFinalTurn: 11 }), 11);
});
void test('an extended final-turn stamp survives an ordinary JSON continuation', () => {
const saved = JSON.parse(JSON.stringify({ turn: 11, victoryFinalTurn: 12 }));
assert.equal(victoryFinalTurn(saved), 12);
assert.equal(continueVictoryCalendar(saved), 12);
});
void test('invalid or expired calendars reject rather than silently extending', () => {
for (const game of [
{ turn: 0 }, { turn: 1.5 }, { turn: 11 },
{ turn: 10, victoryFinalTurn: 9 }, { turn: 11, victoryFinalTurn: 10 },
{ turn: 11, victoryFinalTurn: 11.5 }, { turn: NaN, victoryFinalTurn: 10 },
]) assert.throws(() => victoryFinalTurn(game), VictoryCalendarError);
assert.throws(() => victoryFinalTurn({ turn: 1, victoryFinalTurn: null } as never), VictoryCalendarError);
});
void test('extension rejects safe-integer overflow without changing the saved calendar', () => {
const game = { turn: Number.MAX_SAFE_INTEGER, victoryFinalTurn: Number.MAX_SAFE_INTEGER };
assert.throws(() => continueVictoryCalendar(game), VictoryCalendarError);
assert.equal(game.victoryFinalTurn, Number.MAX_SAFE_INTEGER);
});