import { semear, sortear, sortearInteiro } from "./rng"; function sequencia(semente: number, n: number): number[] { const p = { rng: semear(semente) }; return Array.from({ length: n }, () => sortear(p)); } describe("semear", () => { it("converte a semente em uint32", () => { expect(semear(5)).toBe(5); expect(semear(2 ** 32 + 7)).toBe(7); expect(semear(-1)).toBe(0xffffffff); }); it("troca a semente 0 por 0x9e3779b9", () => { expect(semear(0)).toBe(0x9e3779b9); }); }); describe("sortear", () => { it("dá a mesma sequência para a mesma semente", () => { expect(sequencia(42, 20)).toEqual(sequencia(42, 20)); }); it("dá sequências diferentes para sementes diferentes", () => { expect(sequencia(1, 20)).not.toEqual(sequencia(2, 20)); }); it("mantém 1000 sorteios em [0, 1)", () => { for (const v of sequencia(7, 1000)) { expect(v).toBeGreaterThanOrEqual(0); expect(v).toBeLessThan(1); } }); it("funciona com a semente 0", () => { const valores = sequencia(0, 10); expect(new Set(valores).size).toBe(10); }); it("avança o estado de p.rng", () => { const p = { rng: semear(9) }; const antes = p.rng; sortear(p); expect(p.rng).not.toBe(antes); }); }); describe("sortearInteiro", () => { it("devolve inteiros de 0 a n-1 e usa todos os valores", () => { const p = { rng: semear(3) }; const vistos = new Set(); for (let i = 0; i < 500; i++) { const v = sortearInteiro(p, 6); expect(Number.isInteger(v)).toBe(true); expect(v).toBeGreaterThanOrEqual(0); expect(v).toBeLessThan(6); vistos.add(v); } expect(vistos.size).toBe(6); }); it("devolve sempre 0 quando n é 1", () => { expect(sortearInteiro({ rng: semear(1) }, 1)).toBe(0); }); });