aboutsummaryrefslogtreecommitdiff
path: root/test/mersenne.spec.ts
blob: 35fd445a04f45d7ececb193a4ca2c175d0a39cf5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import { beforeAll, beforeEach, describe, expect, it } from 'vitest';
import type { Mersenne } from '../src/internal/mersenne/mersenne';
import mersenneFn from '../src/internal/mersenne/mersenne';
import { seededRuns } from './support/seededRuns';

const NON_SEEDED_BASED_RUN = 25;

describe('mersenne twister', () => {
  const mersenne: Mersenne = mersenneFn();

  for (const seed of [...seededRuns, [42, 1, 2], [1337, 1, 2], [1211, 1, 2]]) {
    describe(`seed: ${JSON.stringify(seed)}`, () => {
      beforeEach(() => {
        mersenne.seed(seed);
      });

      it(`should return deterministic value for next()`, () => {
        const actual = mersenne.next();

        expect(actual).toMatchSnapshot();
      });
    });
  }

  // Create and log-back the seed for debug purposes
  const seeds = [
    Math.ceil(Math.random() * 1_000_000_000),
    [
      Math.ceil(Math.random() * 1_000_000_000),
      Math.ceil(Math.random() * 1_000_000_000),
    ],
  ];

  for (const seed of seeds) {
    describe(`random seeded tests ${JSON.stringify(seed)}`, () => {
      beforeAll(() => {
        mersenne.seed(seed);
      });

      for (let i = 1; i <= NON_SEEDED_BASED_RUN; i++) {
        describe('next', () => {
          it('should return random number from interval [0, 1)', () => {
            const actual = mersenne.next();

            expect(actual).toBeGreaterThanOrEqual(0);
            expect(actual).toBeLessThan(1);
          });
        });
      }
    });
  }
});