import assert from 'node:assert/strict'; import test from 'node:test'; import { DUKE_VIDAL_ID } from '../game/duke-vidal'; import { nextDukeCaptureUncertainty as next, type DukeCapturePublicSource } from '../game/duke-capture-uncertainty'; const known: DukeCapturePublicSource = { publicController:'guild', loser:'guild', revealedLeader:'other-leader', publicPlanKnown:true, }; void test('publicly possible held or just-used Duke makes the capture uncertain', () => { assert.equal(next(false, known), true); assert.equal(next(false, {...known, publicController:null, revealedLeader:DUKE_VIDAL_ID}), true); assert.equal(next(false, {...known, publicController:'ecaz', revealedLeader:'other-leader'}), false); assert.equal(next(false, {...known, publicController:null, revealedLeader:null}), false); }); void test('uncertainty persists and unstamped historical games are not rewritten', () => { assert.equal(next(true, {...known, publicController:null}), true); assert.equal(next(undefined, known), undefined); assert.equal(next(undefined, {...known, publicController:undefined}), undefined); }); void test('incomplete or invalid public sources cannot prove Duke was excluded', () => { for (const source of [ {...known, publicController:undefined}, {...known, loser:undefined}, {...known, loser:''}, {...known, revealedLeader:undefined}, {...known, revealedLeader:''}, {...known, publicPlanKnown:false}, ]) assert.equal(next(false, source), true); }); void test('publicly equivalent captures stay equivalent regardless of actual selection', () => { const dukeSelected = {...known, actualSelected:DUKE_VIDAL_ID, concealed:true}; const otherSelected = {...known, actualSelected:'other-leader', concealed:false}; assert.equal(next(false, dukeSelected), next(false, otherSelected)); assert.equal(next(false, dukeSelected), true); });