import { describe, expect, test } from 'bun:test'; import { SeededRng, createSeed, seedFromHex, seedToHex } from './rng'; describe('SeededRng', () => { test('is deterministic for the same seed', () => { const a = SeededRng.fromSeed([1, 2, 3, 4]); const b = SeededRng.fromSeed([1, 2, 3, 4]); for (let i = 0; i < 100; i++) expect(a.nextUint32()).toBe(b.nextUint32()); }); test('state can be saved and resumed', () => { const a = SeededRng.fromSeed([9, 8, 7, 6]); a.int(10); const resumed = new SeededRng(a.state()); expect(resumed.int(1000)).toBe(a.int(1000)); }); test('int stays in range and is roughly uniform', () => { const r = SeededRng.fromSeed([5, 5, 5, 5]); const counts = new Array(6).fill(0); for (let i = 0; i < 60000; i++) counts[r.int(6)]++; for (const c of counts) expect(Math.abs(c - 10000)).toBeLessThan(500); }); test('shuffle is a permutation', () => { const r = SeededRng.fromSeed(createSeed()); const arr = Array.from({ length: 52 }, (_, i) => i); const s = r.shuffle(arr); expect(s.slice().sort((x, y) => x - y)).toEqual(arr); }); test('hex round trip', () => { const seed = createSeed(); expect(seedFromHex(seedToHex(seed))).toEqual(seed); }); });