import { describe, expect, it } from 'vitest'; import { CURRENT_RULES, SPECTATOR, createGame } from './state'; import { viewFor } from './view'; /** Three wizards; B's first gestures were hidden from C alone. */ function tableWithASecret() { const s = createGame({ A: 'Aldric', B: 'Bryn', C: 'Cass' }, 1); s.wizards.B.history.push({ left: 'P', right: 'S', turn: 0, phase: 'main', hiddenFrom: ['C'] }); s.log.push({ turn: 0, kind: 'gesture', text: 'Bryn: left proffered palm, right snap.', hiddenFrom: ['C'] }); s.log.push({ turn: 0, kind: 'info', text: 'Nothing else happened.' }); return s; } describe('the view a room sends', () => { it('shows a hidden gesture to the wizards who could see it', () => { const view = viewFor(tableWithASecret(), 'A'); expect(view.wizards.B.history[0].left).toBe('P'); expect(view.log).toHaveLength(2); }); it('withholds it from the wizard it was hidden from', () => { const view = viewFor(tableWithASecret(), 'C'); expect(view.wizards.B.history[0].left).toBe('-'); expect(view.log.map((l) => l.text)).toEqual(['Nothing else happened.']); }); it('withholds from the gallery anything hidden from anyone', () => { const view = viewFor(tableWithASecret(), SPECTATOR); expect(view.wizards.B.history[0].left).toBe('-'); expect(view.log.map((l) => l.text)).toEqual(['Nothing else happened.']); }); }); describe('the rules revision', () => { it('is stamped on a new duel and kept from a ledger that recorded one', () => { expect(createGame({ A: 'Aldric', B: 'Bryn' }).rules).toBe(CURRENT_RULES); expect(createGame({ A: 'Aldric', B: 'Bryn' }, 1, 1).rules).toBe(1); }); });