feat: TestRNG 클래스 추가 및 관련 테스트 케이스 작성
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { ConstantRNG, MidpointRNG, SequenceRNG, SineRNG } from '../src/util/TestRNG.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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user