Files
core2026/packages/common/test/test-rngs.test.ts
T

75 lines
2.5 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { ConstantRNG, MidpointRNG, SequenceRNG, SineRNG } from '../src/index.js';
const toArray = (bytes: Uint8Array): number[] => Array.from(bytes);
describe('TestRNG:Constant', () => {
it('returns fixed 0', () => {
const rng = new ConstantRNG(0);
expect(rng.nextFloat1()).toBe(0);
expect(rng.nextInt(10)).toBe(0);
expect(toArray(rng.nextBytes(3))).toEqual([0, 0, 0]);
expect(toArray(rng.nextBits(3))).toEqual([0]);
});
it('returns fixed 1', () => {
const rng = new ConstantRNG(1);
expect(rng.nextFloat1()).toBe(1);
expect(rng.nextInt(10)).toBe(10);
expect(toArray(rng.nextBytes(2))).toEqual([255, 255]);
expect(toArray(rng.nextBits(3))).toEqual([7]);
});
});
describe('TestRNG:Midpoint', () => {
it('returns midpoint for int/float', () => {
const rng = new MidpointRNG();
expect(rng.nextFloat1()).toBe(0.5);
expect(rng.nextInt(9)).toBe(4);
expect(rng.nextInt(10)).toBe(5);
});
it('alternates bits', () => {
const rng = new MidpointRNG();
expect(toArray(rng.nextBits(4))).toEqual([10]);
expect(toArray(rng.nextBits(4))).toEqual([10]);
});
});
describe('TestRNG:Sine', () => {
it('follows sine wave with period/amplitude', () => {
const rng = new SineRNG(4, 0.5, 0);
expect(rng.nextFloat1()).toBeCloseTo(0.5, 8);
expect(rng.nextFloat1()).toBeCloseTo(1, 8);
expect(rng.nextFloat1()).toBeCloseTo(0.5, 8);
expect(rng.nextFloat1()).toBeCloseTo(0, 8);
});
it('maps float to int range', () => {
const rng = new SineRNG(4, 0.5, 0);
expect(rng.nextInt(9)).toBe(5);
expect(rng.nextInt(9)).toBe(9);
});
});
describe('TestRNG:Sequence', () => {
it('cycles fixed sequence', () => {
const rng = new SequenceRNG([0, 0.25, 0.5, 0.75, 1]);
expect(rng.nextFloat1()).toBe(0);
expect(rng.nextFloat1()).toBe(0.25);
expect(rng.nextFloat1()).toBe(0.5);
expect(rng.nextFloat1()).toBe(0.75);
expect(rng.nextFloat1()).toBe(1);
expect(rng.nextFloat1()).toBe(0);
});
it('converts sequence to bytes and ints', () => {
const rng = new SequenceRNG([0, 0.5, 1]);
expect(toArray(rng.nextBytes(3))).toEqual([0, 128, 255]);
expect(rng.nextInt(8)).toBe(0);
expect(rng.nextInt(8)).toBe(4);
expect(rng.nextInt(8)).toBe(8);
});
});