CURRENT_RULES is stamped on the start line and the game state, and a ledger replays under the revision it recorded (1 when it has none), so a future fix that changes how a past turn resolves can keep the old path for old duels. The reports desk skill now says when to bump it: only when the deploy gate flags ledgers. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0141G6xqLeNRYEtviLWSB5Up
40 lines
1.6 KiB
TypeScript
40 lines
1.6 KiB
TypeScript
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);
|
|
});
|
|
});
|