import { describe, expect, it } from 'vitest'; import { CURRENT_RULES, createGame, game, resolveRound } from './index'; describe('High Card', () => { it('scores the highest number named by exactly one seat', () => { let s = createGame({ A: 'Ann', B: 'Bo', C: 'Cy' }, 1); s = resolveRound(s, { A: { pick: 5 }, B: { pick: 5 }, C: { pick: 2 } }); expect(s.rounds[0].scorer).toBe('C'); expect(s.players.C.points).toBe(1); }); it('ends when a seat reaches the target', () => { let s = createGame({ A: 'Ann', B: 'Bo' }, 1); for (let i = 0; i < 3; i++) s = resolveRound(s, { A: { pick: 3 }, B: { pick: 1 } }); expect(s.over?.winner).toBe('A'); expect(game.needsInput(s, 'A')).toBe(false); }); it('draws the same bot picks from the same seed, and different ones as rounds pass', () => { const a = createGame({ A: 'Ann', B: 'Bo' }, 42); const b = createGame({ A: 'Ann', B: 'Bo' }, 42); expect(game.botInput(a, 'B')).toEqual(game.botInput(b, 'B')); const picks = new Set(); let s = a; for (let i = 0; i < 12; i++) { picks.add(game.botInput(s, 'B').pick); s = resolveRound(s, { A: { pick: 1 }, B: game.botInput(s, 'B') }); } expect(picks.size).toBeGreaterThan(1); }); it('stamps the rules revision', () => { expect(createGame({ A: 'Ann', B: 'Bo' }).rules).toBe(CURRENT_RULES); expect(createGame({ A: 'Ann', B: 'Bo' }, 1, 1).rules).toBe(1); }); });