49 lines
1.6 KiB
JavaScript
49 lines
1.6 KiB
JavaScript
import { TestCase } from "./framework/test_case.js";
|
|
import { Random, randomSeed, mulberry32 } from "../shared/rng.js";
|
|
|
|
export class RngTest extends TestCase {
|
|
test_mulberry32_is_deterministic_and_unit_interval() {
|
|
const a = mulberry32(42);
|
|
const b = mulberry32(42);
|
|
for (let i = 0; i < 100; i++) {
|
|
const value = a();
|
|
this.assertEqual(value, b(), "same seed yields the same stream");
|
|
this.assert(value >= 0 && value < 1, `value in [0,1): ${value}`);
|
|
}
|
|
}
|
|
|
|
test_random_range_is_inclusive() {
|
|
const random = new Random(1);
|
|
const seen = new Set();
|
|
for (let i = 0; i < 500; i++) {
|
|
const value = random.range(2, 5);
|
|
this.assert(value >= 2 && value <= 5, `range out of bounds: ${value}`);
|
|
seen.add(value);
|
|
}
|
|
this.assertEqual(seen.size, 4, "all four values were produced");
|
|
}
|
|
|
|
test_random_float_in_unit_interval() {
|
|
const random = new Random(9);
|
|
for (let i = 0; i < 100; i++) {
|
|
const value = random.float();
|
|
this.assert(value >= 0 && value < 1, `float in [0,1): ${value}`);
|
|
}
|
|
}
|
|
|
|
test_shuffle_preserves_elements_and_is_deterministic() {
|
|
const values = [1, 2, 3, 4, 5, 6, 7, 8];
|
|
const shuffled = new Random(5).shuffle(values.slice());
|
|
this.assertEqual(shuffled.slice().sort((a, b) => a - b), values);
|
|
this.assertEqual(shuffled, new Random(5).shuffle(values.slice()));
|
|
}
|
|
|
|
test_random_seed_is_a_nonzero_integer() {
|
|
for (let i = 0; i < 20; i++) {
|
|
const seed = randomSeed();
|
|
this.assertTrue(Number.isInteger(seed), "seed is an integer");
|
|
this.assertNotEqual(seed, 0);
|
|
}
|
|
}
|
|
}
|