75 lines
2.5 KiB
TypeScript
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);
|
|
});
|
|
});
|