-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathtest.js
114 lines (91 loc) · 2.25 KB
/
test.js
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import test from 'ava';
import ParkMiller from './index.js';
const MAX_INT32 = 2147483647;
const ITERATIONS = 10000;
function assertInteger(t, seed) {
const random = new ParkMiller(seed);
for (let i = 0; i < ITERATIONS; i++) {
const result = random.integer();
t.true(Number.isInteger(result));
t.true(result <= MAX_INT32);
}
}
function assertIntegerInRange(t, seed) {
const random = new ParkMiller(seed);
const min = 33;
const max = 2242;
for (let i = 0; i < ITERATIONS; i++) {
const result = random.integerInRange(min, max);
t.true(Number.isInteger(result));
t.true(result >= min);
t.true(result <= max);
}
}
function assertFloat(t, seed) {
const random = new ParkMiller(seed);
for (let i = 0; i < ITERATIONS; i++) {
const result = random.float();
t.false(Number.isInteger(result));
t.true(result <= MAX_INT32);
}
}
function assertFloatInRange(t, seed) {
const random = new ParkMiller(seed);
const min = 0.33;
const max = 0.52242;
for (let i = 0; i < ITERATIONS; i++) {
const result = random.floatInRange(min, max);
t.false(Number.isInteger(result));
t.true(result >= min);
t.true(result <= max);
}
}
function assertBoolean(t, seed) {
const random = new ParkMiller(seed);
let average = 0;
for (let i = 0; i < ITERATIONS; i++) {
const result = random.boolean();
t.is(typeof result, 'boolean');
average += result ? 1 : -1;
}
t.true(average < 10000);
}
function runFn(fn) {
const random = new ParkMiller(33);
const values = [];
for (let i = 0; i < ITERATIONS; i++) {
values.push(random[fn]());
}
return values;
}
function runAsserts(t, fn, assertFn) {
const seeds = [
0,
1,
10,
-10,
Number.MIN_SAFE_INTEGER,
Number.MAX_SAFE_INTEGER
];
for (const seed of seeds) {
assertFn(t, seed);
}
// Ensure it generates numbers deterministically
t.deepEqual(runFn(fn), runFn(fn));
t.deepEqual(runFn(fn), runFn(fn));
}
test('.integer()', t => {
runAsserts(t, 'integer', assertInteger);
});
test('.integerInRange()', t => {
runAsserts(t, 'integerInRange', assertIntegerInRange);
});
test('.float()', t => {
runAsserts(t, 'float', assertFloat);
});
test('.floatInRange()', t => {
runAsserts(t, 'floatInRange', assertFloatInRange);
});
test('.boolean()', t => {
runAsserts(t, 'boolean', assertBoolean);
});