refactor: add rng & seeding

This commit is contained in:
2026-04-07 15:32:06 +08:00
parent 6b736ab083
commit 10393f45b6
6 changed files with 98 additions and 46 deletions
+27 -15
View File
@@ -1,7 +1,8 @@
import { describe, it, expect, beforeEach } from 'vitest';
import {
registry,
createInitialState,
import {
registry,
createInitialState,
initializeCards,
OnitamaState,
createPawns,
createCards,
@@ -13,6 +14,7 @@ import type { PromptEvent } from '@/utils/command';
function createTestContext() {
const ctx = createGameContext(registry, createInitialState());
initializeCards(ctx);
return { registry, ctx };
}
@@ -71,18 +73,19 @@ function waitForPrompt(ctx: ReturnType<typeof createTestContext>['ctx']): Promis
describe('Onitama Game', () => {
describe('Setup', () => {
it('should create initial state correctly', () => {
const state = createInitialState();
const ctx = createGameContext(registry, createInitialState());
const stateBefore = ctx.value;
expect(state.currentPlayer).toBeDefined();
expect(state.winner).toBeNull();
expect(state.regions.board).toBeDefined();
expect(state.regions.red).toBeDefined();
expect(state.regions.black).toBeDefined();
expect(state.regions.spare).toBeDefined();
expect(stateBefore.currentPlayer).toBeDefined();
expect(stateBefore.winner).toBeNull();
expect(stateBefore.regions.board).toBeDefined();
expect(stateBefore.regions.red).toBeDefined();
expect(stateBefore.regions.black).toBeDefined();
expect(stateBefore.regions.spare).toBeDefined();
// Should have 10 pawns (5 per player)
const redPawns = Object.values(state.pawns).filter(p => p.owner === 'red');
const blackPawns = Object.values(state.pawns).filter(p => p.owner === 'black');
const redPawns = Object.values(stateBefore.pawns).filter(p => p.owner === 'red');
const blackPawns = Object.values(stateBefore.pawns).filter(p => p.owner === 'black');
expect(redPawns.length).toBe(5);
expect(blackPawns.length).toBe(5);
@@ -96,10 +99,19 @@ describe('Onitama Game', () => {
expect(redMaster?.position[0]).toBe(2);
expect(redMaster?.position[1]).toBe(0);
// Cards should not be distributed yet
expect(stateBefore.redCards.length).toBe(0);
expect(stateBefore.blackCards.length).toBe(0);
expect(stateBefore.spareCard).toBe('');
// Initialize cards
initializeCards(ctx);
const stateAfter = ctx.value;
// Cards should be distributed: 2 per player + 1 spare
expect(state.redCards.length).toBe(2);
expect(state.blackCards.length).toBe(2);
expect(state.spareCard).toBeDefined();
expect(stateAfter.redCards.length).toBe(2);
expect(stateAfter.blackCards.length).toBe(2);
expect(stateAfter.spareCard).toBeDefined();
});
it('should create pawns in correct positions', () => {