@omnitronix/happy-panda-game-engine 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +732 -0
- package/dist/__tests__/bonus-sequence.test.d.ts +7 -0
- package/dist/__tests__/bonus-sequence.test.d.ts.map +1 -0
- package/dist/__tests__/bonus-sequence.test.js +381 -0
- package/dist/__tests__/bonus-sequence.test.js.map +1 -0
- package/dist/__tests__/cherry-frequency.test.d.ts +8 -0
- package/dist/__tests__/cherry-frequency.test.d.ts.map +1 -0
- package/dist/__tests__/cherry-frequency.test.js +128 -0
- package/dist/__tests__/cherry-frequency.test.js.map +1 -0
- package/dist/__tests__/comprehensive.test.d.ts +16 -0
- package/dist/__tests__/comprehensive.test.d.ts.map +1 -0
- package/dist/__tests__/comprehensive.test.js +491 -0
- package/dist/__tests__/comprehensive.test.js.map +1 -0
- package/dist/__tests__/counter-manager.test.d.ts +7 -0
- package/dist/__tests__/counter-manager.test.d.ts.map +1 -0
- package/dist/__tests__/counter-manager.test.js +317 -0
- package/dist/__tests__/counter-manager.test.js.map +1 -0
- package/dist/__tests__/coverage-boost.test.d.ts +13 -0
- package/dist/__tests__/coverage-boost.test.d.ts.map +1 -0
- package/dist/__tests__/coverage-boost.test.js +606 -0
- package/dist/__tests__/coverage-boost.test.js.map +1 -0
- package/dist/__tests__/cpp-parity.test.d.ts +39 -0
- package/dist/__tests__/cpp-parity.test.d.ts.map +1 -0
- package/dist/__tests__/cpp-parity.test.js +392 -0
- package/dist/__tests__/cpp-parity.test.js.map +1 -0
- package/dist/__tests__/debug-trigger-bonus.test.d.ts +8 -0
- package/dist/__tests__/debug-trigger-bonus.test.d.ts.map +1 -0
- package/dist/__tests__/debug-trigger-bonus.test.js +359 -0
- package/dist/__tests__/debug-trigger-bonus.test.js.map +1 -0
- package/dist/__tests__/fixtures/cpp-parity-vectors.json +457 -0
- package/dist/__tests__/gdd-validation-1000.test.d.ts +14 -0
- package/dist/__tests__/gdd-validation-1000.test.d.ts.map +1 -0
- package/dist/__tests__/gdd-validation-1000.test.js +418 -0
- package/dist/__tests__/gdd-validation-1000.test.js.map +1 -0
- package/dist/__tests__/happy-panda-engine.test.d.ts +7 -0
- package/dist/__tests__/happy-panda-engine.test.d.ts.map +1 -0
- package/dist/__tests__/happy-panda-engine.test.js +414 -0
- package/dist/__tests__/happy-panda-engine.test.js.map +1 -0
- package/dist/__tests__/jackpot-manager.test.d.ts +8 -0
- package/dist/__tests__/jackpot-manager.test.d.ts.map +1 -0
- package/dist/__tests__/jackpot-manager.test.js +313 -0
- package/dist/__tests__/jackpot-manager.test.js.map +1 -0
- package/dist/__tests__/jackpot-trigger-trace.test.d.ts +6 -0
- package/dist/__tests__/jackpot-trigger-trace.test.d.ts.map +1 -0
- package/dist/__tests__/jackpot-trigger-trace.test.js +146 -0
- package/dist/__tests__/jackpot-trigger-trace.test.js.map +1 -0
- package/dist/__tests__/rng-gli19-compliance.test.d.ts +21 -0
- package/dist/__tests__/rng-gli19-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/rng-gli19-compliance.test.js +480 -0
- package/dist/__tests__/rng-gli19-compliance.test.js.map +1 -0
- package/dist/__tests__/rng-seed-security.test.d.ts +19 -0
- package/dist/__tests__/rng-seed-security.test.d.ts.map +1 -0
- package/dist/__tests__/rng-seed-security.test.js +518 -0
- package/dist/__tests__/rng-seed-security.test.js.map +1 -0
- package/dist/__tests__/rng-seed-type.test.d.ts +16 -0
- package/dist/__tests__/rng-seed-type.test.d.ts.map +1 -0
- package/dist/__tests__/rng-seed-type.test.js +285 -0
- package/dist/__tests__/rng-seed-type.test.js.map +1 -0
- package/dist/__tests__/rng-stress-boundary.test.d.ts +15 -0
- package/dist/__tests__/rng-stress-boundary.test.d.ts.map +1 -0
- package/dist/__tests__/rng-stress-boundary.test.js +590 -0
- package/dist/__tests__/rng-stress-boundary.test.js.map +1 -0
- package/dist/__tests__/rtp-1million.test.d.ts +8 -0
- package/dist/__tests__/rtp-1million.test.d.ts.map +1 -0
- package/dist/__tests__/rtp-1million.test.js +156 -0
- package/dist/__tests__/rtp-1million.test.js.map +1 -0
- package/dist/__tests__/rtp-analysis.test.d.ts +8 -0
- package/dist/__tests__/rtp-analysis.test.d.ts.map +1 -0
- package/dist/__tests__/rtp-analysis.test.js +138 -0
- package/dist/__tests__/rtp-analysis.test.js.map +1 -0
- package/dist/__tests__/rtp-diagnostic.test.d.ts +6 -0
- package/dist/__tests__/rtp-diagnostic.test.d.ts.map +1 -0
- package/dist/__tests__/rtp-diagnostic.test.js +141 -0
- package/dist/__tests__/rtp-diagnostic.test.js.map +1 -0
- package/dist/__tests__/rtp-simulation.test.d.ts +8 -0
- package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -0
- package/dist/__tests__/rtp-simulation.test.js +411 -0
- package/dist/__tests__/rtp-simulation.test.js.map +1 -0
- package/dist/__tests__/special-wins.test.d.ts +7 -0
- package/dist/__tests__/special-wins.test.d.ts.map +1 -0
- package/dist/__tests__/special-wins.test.js +179 -0
- package/dist/__tests__/special-wins.test.js.map +1 -0
- package/dist/__tests__/spin-generator.test.d.ts +7 -0
- package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
- package/dist/__tests__/spin-generator.test.js +297 -0
- package/dist/__tests__/spin-generator.test.js.map +1 -0
- package/dist/__tests__/spin-handler.test.d.ts +7 -0
- package/dist/__tests__/spin-handler.test.d.ts.map +1 -0
- package/dist/__tests__/spin-handler.test.js +210 -0
- package/dist/__tests__/spin-handler.test.js.map +1 -0
- package/dist/__tests__/symbol-distribution.test.d.ts +6 -0
- package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
- package/dist/__tests__/symbol-distribution.test.js +119 -0
- package/dist/__tests__/symbol-distribution.test.js.map +1 -0
- package/dist/__tests__/test-protocol-10000-spin.test.d.ts +14 -0
- package/dist/__tests__/test-protocol-10000-spin.test.d.ts.map +1 -0
- package/dist/__tests__/test-protocol-10000-spin.test.js +359 -0
- package/dist/__tests__/test-protocol-10000-spin.test.js.map +1 -0
- package/dist/__tests__/weighted-random.test.d.ts +7 -0
- package/dist/__tests__/weighted-random.test.d.ts.map +1 -0
- package/dist/__tests__/weighted-random.test.js +165 -0
- package/dist/__tests__/weighted-random.test.js.map +1 -0
- package/dist/__tests__/win-evaluator.test.d.ts +7 -0
- package/dist/__tests__/win-evaluator.test.d.ts.map +1 -0
- package/dist/__tests__/win-evaluator.test.js +264 -0
- package/dist/__tests__/win-evaluator.test.js.map +1 -0
- package/dist/config/happy-panda.config.d.ts +217 -0
- package/dist/config/happy-panda.config.d.ts.map +1 -0
- package/dist/config/happy-panda.config.js +721 -0
- package/dist/config/happy-panda.config.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +21 -0
- package/dist/config/index.js.map +1 -0
- package/dist/debug/debug-command-definitions.d.ts +38 -0
- package/dist/debug/debug-command-definitions.d.ts.map +1 -0
- package/dist/debug/debug-command-definitions.js +80 -0
- package/dist/debug/debug-command-definitions.js.map +1 -0
- package/dist/domain/debug-trigger-bonus-command.d.ts +17 -0
- package/dist/domain/debug-trigger-bonus-command.d.ts.map +1 -0
- package/dist/domain/debug-trigger-bonus-command.js +3 -0
- package/dist/domain/debug-trigger-bonus-command.js.map +1 -0
- package/dist/domain/index.d.ts +5 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +21 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/types.d.ts +228 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +30 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/engine/happy-panda-engine.d.ts +64 -0
- package/dist/engine/happy-panda-engine.d.ts.map +1 -0
- package/dist/engine/happy-panda-engine.js +324 -0
- package/dist/engine/happy-panda-engine.js.map +1 -0
- package/dist/engine/index.d.ts +5 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +21 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/game-engine.interface.d.ts +19 -0
- package/dist/game-engine.interface.d.ts.map +1 -0
- package/dist/game-engine.interface.js +9 -0
- package/dist/game-engine.interface.js.map +1 -0
- package/dist/happy-panda-v1.game-engine.d.ts +60 -0
- package/dist/happy-panda-v1.game-engine.d.ts.map +1 -0
- package/dist/happy-panda-v1.game-engine.js +524 -0
- package/dist/happy-panda-v1.game-engine.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/logic/handlers/index.d.ts +5 -0
- package/dist/logic/handlers/index.d.ts.map +1 -0
- package/dist/logic/handlers/index.js +21 -0
- package/dist/logic/handlers/index.js.map +1 -0
- package/dist/logic/handlers/spin-handler.d.ts +58 -0
- package/dist/logic/handlers/spin-handler.d.ts.map +1 -0
- package/dist/logic/handlers/spin-handler.js +265 -0
- package/dist/logic/handlers/spin-handler.js.map +1 -0
- package/dist/logic/index.d.ts +6 -0
- package/dist/logic/index.d.ts.map +1 -0
- package/dist/logic/index.js +22 -0
- package/dist/logic/index.js.map +1 -0
- package/dist/logic/services/counter-manager.d.ts +60 -0
- package/dist/logic/services/counter-manager.d.ts.map +1 -0
- package/dist/logic/services/counter-manager.js +268 -0
- package/dist/logic/services/counter-manager.js.map +1 -0
- package/dist/logic/services/index.d.ts +7 -0
- package/dist/logic/services/index.d.ts.map +1 -0
- package/dist/logic/services/index.js +23 -0
- package/dist/logic/services/index.js.map +1 -0
- package/dist/logic/services/jackpot-manager.d.ts +59 -0
- package/dist/logic/services/jackpot-manager.d.ts.map +1 -0
- package/dist/logic/services/jackpot-manager.js +142 -0
- package/dist/logic/services/jackpot-manager.js.map +1 -0
- package/dist/logic/services/win-evaluator.d.ts +51 -0
- package/dist/logic/services/win-evaluator.d.ts.map +1 -0
- package/dist/logic/services/win-evaluator.js +463 -0
- package/dist/logic/services/win-evaluator.js.map +1 -0
- package/dist/rng/dummy-rng-client.d.ts +39 -0
- package/dist/rng/dummy-rng-client.d.ts.map +1 -0
- package/dist/rng/dummy-rng-client.js +77 -0
- package/dist/rng/dummy-rng-client.js.map +1 -0
- package/dist/rng/index.d.ts +10 -0
- package/dist/rng/index.d.ts.map +1 -0
- package/dist/rng/index.js +27 -0
- package/dist/rng/index.js.map +1 -0
- package/dist/rng/rng-client.factory.d.ts +33 -0
- package/dist/rng/rng-client.factory.d.ts.map +1 -0
- package/dist/rng/rng-client.factory.js +57 -0
- package/dist/rng/rng-client.factory.js.map +1 -0
- package/dist/rng/rng-client.interface.d.ts +51 -0
- package/dist/rng/rng-client.interface.d.ts.map +1 -0
- package/dist/rng/rng-client.interface.js +9 -0
- package/dist/rng/rng-client.interface.js.map +1 -0
- package/dist/rng/rng-service.d.ts +93 -0
- package/dist/rng/rng-service.d.ts.map +1 -0
- package/dist/rng/rng-service.js +124 -0
- package/dist/rng/rng-service.js.map +1 -0
- package/dist/rng/spin-generator.d.ts +32 -0
- package/dist/rng/spin-generator.d.ts.map +1 -0
- package/dist/rng/spin-generator.js +338 -0
- package/dist/rng/spin-generator.js.map +1 -0
- package/dist/rng/weighted-random.d.ts +30 -0
- package/dist/rng/weighted-random.d.ts.map +1 -0
- package/dist/rng/weighted-random.js +58 -0
- package/dist/rng/weighted-random.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RNG Stress and Boundary Tests
|
|
4
|
+
*
|
|
5
|
+
* This test suite covers:
|
|
6
|
+
* - High volume stress testing
|
|
7
|
+
* - Boundary condition verification
|
|
8
|
+
* - Performance under load
|
|
9
|
+
* - Memory leak detection patterns
|
|
10
|
+
* - Large payload handling
|
|
11
|
+
* - State persistence verification
|
|
12
|
+
*
|
|
13
|
+
* Note: Some tests are designed for CI/CD performance validation
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
const fs = __importStar(require("fs"));
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const happy_panda_v1_game_engine_1 = require("../happy-panda-v1.game-engine");
|
|
52
|
+
const types_1 = require("../domain/types");
|
|
53
|
+
// Results output directory
|
|
54
|
+
const RESULTS_DIR = path.join(__dirname, '../../results');
|
|
55
|
+
// Bet calculation constants - must match spin-handler.ts
|
|
56
|
+
// betGame = baseBet * betStake, where baseBet = 8 for SINGLE, 16 for DOUBLE
|
|
57
|
+
const SINGLE_BASE_BET = 8;
|
|
58
|
+
const DOUBLE_BASE_BET = 16;
|
|
59
|
+
function ensureResultsDir() {
|
|
60
|
+
if (!fs.existsSync(RESULTS_DIR)) {
|
|
61
|
+
fs.mkdirSync(RESULTS_DIR, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function getResultsFileName(gameName, spinCount) {
|
|
65
|
+
const date = new Date().toISOString().split('T')[0];
|
|
66
|
+
const time = new Date().toISOString().split('T')[1].split('.')[0].replace(/:/g, '-');
|
|
67
|
+
return path.join(RESULTS_DIR, `${gameName}-${spinCount}-${date}-${time}.ndjson`);
|
|
68
|
+
}
|
|
69
|
+
describe('RNG Stress and Boundary Tests', () => {
|
|
70
|
+
let engine;
|
|
71
|
+
beforeEach(() => {
|
|
72
|
+
engine = new happy_panda_v1_game_engine_1.HappyPandaV1GameEngine();
|
|
73
|
+
});
|
|
74
|
+
// Helper functions
|
|
75
|
+
async function initSession(betStake = 1) {
|
|
76
|
+
return engine.processCommand(null, null, {
|
|
77
|
+
id: `init-stress-${Math.random().toString(36).slice(2)}`,
|
|
78
|
+
type: 'INIT_SESSION_STATE',
|
|
79
|
+
payload: {
|
|
80
|
+
gameDirection: types_1.GameDirection.SINGLE,
|
|
81
|
+
betStake,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async function executeSpin(publicState, privateState) {
|
|
86
|
+
return engine.processCommand(publicState, privateState, {
|
|
87
|
+
id: `spin-stress-${Math.random().toString(36).slice(2)}`,
|
|
88
|
+
type: 'SPIN',
|
|
89
|
+
payload: { sessionId: 'stress-test-session' },
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function canonicalizeForHash(outcome) {
|
|
93
|
+
const entries = Object.entries(outcome)
|
|
94
|
+
.map(([actionId, record]) => ({
|
|
95
|
+
actionId,
|
|
96
|
+
result: Number(record.result),
|
|
97
|
+
seed: String(record.seed),
|
|
98
|
+
min: Number(record.min),
|
|
99
|
+
max: Number(record.max),
|
|
100
|
+
}))
|
|
101
|
+
.sort((a, b) => a.actionId.localeCompare(b.actionId));
|
|
102
|
+
return JSON.stringify(entries);
|
|
103
|
+
}
|
|
104
|
+
// ============================================================
|
|
105
|
+
// SECTION 1: BOUNDARY CONDITIONS
|
|
106
|
+
// ============================================================
|
|
107
|
+
describe('Boundary Conditions', () => {
|
|
108
|
+
describe('Integer Boundaries', () => {
|
|
109
|
+
it('should handle seed exactly at Number.MAX_SAFE_INTEGER', () => {
|
|
110
|
+
const outcome = {
|
|
111
|
+
test: { result: 5, seed: Number.MAX_SAFE_INTEGER, min: 0, max: 10 },
|
|
112
|
+
};
|
|
113
|
+
const canonical = canonicalizeForHash(outcome);
|
|
114
|
+
expect(canonical).toContain('"seed":"9007199254740991"');
|
|
115
|
+
// Verify round-trip
|
|
116
|
+
const parsed = JSON.parse(canonical);
|
|
117
|
+
expect(Number(parsed[0].seed)).toBe(Number.MAX_SAFE_INTEGER);
|
|
118
|
+
});
|
|
119
|
+
it('should handle seed exactly at Number.MIN_SAFE_INTEGER', () => {
|
|
120
|
+
const outcome = {
|
|
121
|
+
test: { result: 5, seed: Number.MIN_SAFE_INTEGER, min: -100, max: 100 },
|
|
122
|
+
};
|
|
123
|
+
const canonical = canonicalizeForHash(outcome);
|
|
124
|
+
expect(canonical).toContain('"seed":"-9007199254740991"');
|
|
125
|
+
const parsed = JSON.parse(canonical);
|
|
126
|
+
expect(Number(parsed[0].seed)).toBe(Number.MIN_SAFE_INTEGER);
|
|
127
|
+
});
|
|
128
|
+
it('should handle seed at MAX_SAFE_INTEGER - 1', () => {
|
|
129
|
+
const value = Number.MAX_SAFE_INTEGER - 1;
|
|
130
|
+
const outcome = { test: { result: 5, seed: value, min: 0, max: 10 } };
|
|
131
|
+
const canonical = canonicalizeForHash(outcome);
|
|
132
|
+
expect(canonical).toContain(`"seed":"${value}"`);
|
|
133
|
+
});
|
|
134
|
+
it('should handle seed at MIN_SAFE_INTEGER + 1', () => {
|
|
135
|
+
const value = Number.MIN_SAFE_INTEGER + 1;
|
|
136
|
+
const outcome = { test: { result: 5, seed: value, min: -100, max: 100 } };
|
|
137
|
+
const canonical = canonicalizeForHash(outcome);
|
|
138
|
+
expect(canonical).toContain(`"seed":"${value}"`);
|
|
139
|
+
});
|
|
140
|
+
it('should handle seed = 0', () => {
|
|
141
|
+
const outcome = { test: { result: 5, seed: 0, min: 0, max: 10 } };
|
|
142
|
+
const canonical = canonicalizeForHash(outcome);
|
|
143
|
+
expect(canonical).toContain('"seed":"0"');
|
|
144
|
+
});
|
|
145
|
+
it('should handle seed = 1', () => {
|
|
146
|
+
const outcome = { test: { result: 5, seed: 1, min: 0, max: 10 } };
|
|
147
|
+
const canonical = canonicalizeForHash(outcome);
|
|
148
|
+
expect(canonical).toContain('"seed":"1"');
|
|
149
|
+
});
|
|
150
|
+
it('should handle seed = -1', () => {
|
|
151
|
+
const outcome = { test: { result: 5, seed: -1, min: -10, max: 10 } };
|
|
152
|
+
const canonical = canonicalizeForHash(outcome);
|
|
153
|
+
expect(canonical).toContain('"seed":"-1"');
|
|
154
|
+
});
|
|
155
|
+
it('should handle result at boundary of range', () => {
|
|
156
|
+
const outcome = { test: { result: 0, seed: 123, min: 0, max: 10 } };
|
|
157
|
+
const canonical = canonicalizeForHash(outcome);
|
|
158
|
+
expect(canonical).toContain('"result":0');
|
|
159
|
+
});
|
|
160
|
+
it('should handle result at max of range', () => {
|
|
161
|
+
const outcome = { test: { result: 10, seed: 123, min: 0, max: 10 } };
|
|
162
|
+
const canonical = canonicalizeForHash(outcome);
|
|
163
|
+
expect(canonical).toContain('"result":10');
|
|
164
|
+
});
|
|
165
|
+
it('should handle min = max (single valid value)', () => {
|
|
166
|
+
const outcome = { test: { result: 5, seed: 123, min: 5, max: 5 } };
|
|
167
|
+
const canonical = canonicalizeForHash(outcome);
|
|
168
|
+
expect(canonical).toContain('"min":5');
|
|
169
|
+
expect(canonical).toContain('"max":5');
|
|
170
|
+
});
|
|
171
|
+
it('should handle negative range', () => {
|
|
172
|
+
const outcome = { test: { result: -5, seed: 123, min: -10, max: -1 } };
|
|
173
|
+
const canonical = canonicalizeForHash(outcome);
|
|
174
|
+
expect(canonical).toContain('"result":-5');
|
|
175
|
+
expect(canonical).toContain('"min":-10');
|
|
176
|
+
expect(canonical).toContain('"max":-1');
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
describe('String Length Boundaries', () => {
|
|
180
|
+
it('should handle empty actionId', () => {
|
|
181
|
+
const outcome = { '': { result: 5, seed: 123, min: 0, max: 10 } };
|
|
182
|
+
const canonical = canonicalizeForHash(outcome);
|
|
183
|
+
expect(canonical).toContain('"actionId":""');
|
|
184
|
+
});
|
|
185
|
+
it('should handle single character actionId', () => {
|
|
186
|
+
const outcome = { 'a': { result: 5, seed: 123, min: 0, max: 10 } };
|
|
187
|
+
const canonical = canonicalizeForHash(outcome);
|
|
188
|
+
expect(canonical).toContain('"actionId":"a"');
|
|
189
|
+
});
|
|
190
|
+
it('should handle long actionId (1000 characters)', () => {
|
|
191
|
+
const longId = 'a'.repeat(1000);
|
|
192
|
+
const outcome = { [longId]: { result: 5, seed: 123, min: 0, max: 10 } };
|
|
193
|
+
const canonical = canonicalizeForHash(outcome);
|
|
194
|
+
const parsed = JSON.parse(canonical);
|
|
195
|
+
expect(parsed[0].actionId.length).toBe(1000);
|
|
196
|
+
});
|
|
197
|
+
it('should handle very long actionId (10000 characters)', () => {
|
|
198
|
+
const longId = 'action_'.repeat(1428); // ~10000 chars
|
|
199
|
+
const outcome = { [longId]: { result: 5, seed: 123, min: 0, max: 10 } };
|
|
200
|
+
expect(() => canonicalizeForHash(outcome)).not.toThrow();
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
describe('Collection Size Boundaries', () => {
|
|
204
|
+
it('should handle empty outcome', () => {
|
|
205
|
+
const outcome = {};
|
|
206
|
+
const canonical = canonicalizeForHash(outcome);
|
|
207
|
+
expect(canonical).toBe('[]');
|
|
208
|
+
});
|
|
209
|
+
it('should handle single record outcome', () => {
|
|
210
|
+
const outcome = { single: { result: 5, seed: 123, min: 0, max: 10 } };
|
|
211
|
+
const canonical = canonicalizeForHash(outcome);
|
|
212
|
+
const parsed = JSON.parse(canonical);
|
|
213
|
+
expect(parsed.length).toBe(1);
|
|
214
|
+
});
|
|
215
|
+
it('should handle 100 records', () => {
|
|
216
|
+
const outcome = {};
|
|
217
|
+
for (let i = 0; i < 100; i++) {
|
|
218
|
+
outcome[`action_${i.toString().padStart(3, '0')}`] = {
|
|
219
|
+
result: i % 10,
|
|
220
|
+
seed: i * 1000,
|
|
221
|
+
min: 0,
|
|
222
|
+
max: 9,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
const canonical = canonicalizeForHash(outcome);
|
|
226
|
+
const parsed = JSON.parse(canonical);
|
|
227
|
+
expect(parsed.length).toBe(100);
|
|
228
|
+
});
|
|
229
|
+
it('should handle 1000 records', () => {
|
|
230
|
+
const outcome = {};
|
|
231
|
+
for (let i = 0; i < 1000; i++) {
|
|
232
|
+
outcome[`action_${i.toString().padStart(4, '0')}`] = {
|
|
233
|
+
result: i % 10,
|
|
234
|
+
seed: i * 1000,
|
|
235
|
+
min: 0,
|
|
236
|
+
max: 9,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
const canonical = canonicalizeForHash(outcome);
|
|
240
|
+
const parsed = JSON.parse(canonical);
|
|
241
|
+
expect(parsed.length).toBe(1000);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
// ============================================================
|
|
246
|
+
// SECTION 2: STRESS TESTS
|
|
247
|
+
// ============================================================
|
|
248
|
+
describe('Stress Tests', () => {
|
|
249
|
+
it('should handle 500 consecutive spins without error', async () => {
|
|
250
|
+
const init = await initSession();
|
|
251
|
+
let currentPublic = init.publicState;
|
|
252
|
+
let currentPrivate = init.privateState;
|
|
253
|
+
const results = [];
|
|
254
|
+
for (let i = 0; i < 500; i++) {
|
|
255
|
+
const spin = await executeSpin(currentPublic, currentPrivate);
|
|
256
|
+
results.push(spin.success);
|
|
257
|
+
currentPublic = spin.publicState;
|
|
258
|
+
currentPrivate = spin.privateState;
|
|
259
|
+
}
|
|
260
|
+
expect(results.every(r => r === true)).toBe(true);
|
|
261
|
+
}, 60000); // 60 second timeout
|
|
262
|
+
it('should maintain consistent rngOutcome structure across 500 spins', async () => {
|
|
263
|
+
const init = await initSession();
|
|
264
|
+
let currentPublic = init.publicState;
|
|
265
|
+
let currentPrivate = init.privateState;
|
|
266
|
+
for (let i = 0; i < 500; i++) {
|
|
267
|
+
const spin = await executeSpin(currentPublic, currentPrivate);
|
|
268
|
+
expect(spin.rngOutcome).toBeDefined();
|
|
269
|
+
for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
|
|
270
|
+
expect(typeof record.seed).toBe('number');
|
|
271
|
+
expect(typeof record.result).toBe('number');
|
|
272
|
+
expect(typeof record.min).toBe('number');
|
|
273
|
+
expect(typeof record.max).toBe('number');
|
|
274
|
+
}
|
|
275
|
+
currentPublic = spin.publicState;
|
|
276
|
+
currentPrivate = spin.privateState;
|
|
277
|
+
}
|
|
278
|
+
}, 60000);
|
|
279
|
+
it('should handle rapid session initialization', async () => {
|
|
280
|
+
const results = [];
|
|
281
|
+
for (let i = 0; i < 100; i++) {
|
|
282
|
+
const init = await initSession();
|
|
283
|
+
results.push(init.success);
|
|
284
|
+
}
|
|
285
|
+
expect(results.every(r => r === true)).toBe(true);
|
|
286
|
+
}, 30000);
|
|
287
|
+
it('should handle alternating init/spin pattern', async () => {
|
|
288
|
+
for (let i = 0; i < 100; i++) {
|
|
289
|
+
const init = await initSession();
|
|
290
|
+
expect(init.success).toBe(true);
|
|
291
|
+
const spin = await executeSpin(init.publicState, init.privateState);
|
|
292
|
+
expect(spin.success).toBe(true);
|
|
293
|
+
expect(spin.rngOutcome).toBeDefined();
|
|
294
|
+
}
|
|
295
|
+
}, 30000);
|
|
296
|
+
it('should process canonicalization for 10000 outcomes efficiently', () => {
|
|
297
|
+
const outcomes = [];
|
|
298
|
+
// Create 10000 outcomes
|
|
299
|
+
for (let i = 0; i < 10000; i++) {
|
|
300
|
+
outcomes.push({
|
|
301
|
+
[`action_${i}`]: { result: i % 10, seed: i * 1000, min: 0, max: 9 },
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
const startTime = Date.now();
|
|
305
|
+
// Process all canonicalizations
|
|
306
|
+
const canonicals = outcomes.map(o => canonicalizeForHash(o));
|
|
307
|
+
const endTime = Date.now();
|
|
308
|
+
const duration = endTime - startTime;
|
|
309
|
+
// Should complete in reasonable time (< 5 seconds)
|
|
310
|
+
expect(duration).toBeLessThan(5000);
|
|
311
|
+
expect(canonicals.length).toBe(10000);
|
|
312
|
+
});
|
|
313
|
+
it('should handle 10000 consecutive spins without error', async () => {
|
|
314
|
+
ensureResultsDir();
|
|
315
|
+
const resultsFile = getResultsFileName('happy-panda', 10000);
|
|
316
|
+
const writeStream = fs.createWriteStream(resultsFile);
|
|
317
|
+
const init = await initSession();
|
|
318
|
+
let currentPublic = init.publicState;
|
|
319
|
+
let currentPrivate = init.privateState;
|
|
320
|
+
let totalSpins = 0;
|
|
321
|
+
let failures = 0;
|
|
322
|
+
// Correct bet calculation: betGame = baseBet * betStake
|
|
323
|
+
// initSession uses betStake=1 and SINGLE direction (baseBet=8)
|
|
324
|
+
const betStake = 1;
|
|
325
|
+
const betGame = SINGLE_BASE_BET * betStake; // = 8
|
|
326
|
+
console.log(`\nWriting results to: ${resultsFile}\n`);
|
|
327
|
+
for (let i = 0; i < 10000; i++) {
|
|
328
|
+
const spin = await executeSpin(currentPublic, currentPrivate);
|
|
329
|
+
totalSpins++;
|
|
330
|
+
let won = 0;
|
|
331
|
+
let jackpotWon = 0;
|
|
332
|
+
let poolJackpotWon = 0;
|
|
333
|
+
if (!spin.success) {
|
|
334
|
+
failures++;
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
// Happy Panda returns win in outcome.wins.totalPayout + jackpots
|
|
338
|
+
const outcome = spin.outcome;
|
|
339
|
+
if (outcome) {
|
|
340
|
+
won = outcome.wins?.totalPayout || 0;
|
|
341
|
+
jackpotWon = outcome.jackpotWon || 0;
|
|
342
|
+
poolJackpotWon = outcome.poolJackpotWon || 0;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Write result to NDJSON file
|
|
346
|
+
const record = {
|
|
347
|
+
spin: totalSpins,
|
|
348
|
+
wagered: betGame, // Use actual betGame (8), not betStake (1)
|
|
349
|
+
won: won + jackpotWon + poolJackpotWon,
|
|
350
|
+
baseWin: won,
|
|
351
|
+
jackpotWon,
|
|
352
|
+
poolJackpotWon,
|
|
353
|
+
bonusTriggered: jackpotWon > 0 || poolJackpotWon > 0,
|
|
354
|
+
bonusWon: jackpotWon + poolJackpotWon,
|
|
355
|
+
success: spin.success,
|
|
356
|
+
};
|
|
357
|
+
writeStream.write(JSON.stringify(record) + '\n');
|
|
358
|
+
currentPublic = spin.publicState;
|
|
359
|
+
currentPrivate = spin.privateState;
|
|
360
|
+
// Progress indicator every 1000 spins
|
|
361
|
+
if (totalSpins % 1000 === 0) {
|
|
362
|
+
console.log(`Progress: ${totalSpins} spins completed...`);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
writeStream.end();
|
|
366
|
+
console.log(`\n=== 10000 Spins Test - Happy Panda ===`);
|
|
367
|
+
console.log(`Total spins: ${totalSpins}`);
|
|
368
|
+
console.log(`Total failures: ${failures}`);
|
|
369
|
+
console.log(`Results saved to: ${resultsFile}`);
|
|
370
|
+
console.log(`\nTo calculate RTP, run:`);
|
|
371
|
+
console.log(` node /opt/omnitronix/omnitronix-docs/scripts/calculate-rtp.js ${resultsFile}`);
|
|
372
|
+
expect(failures).toBe(0);
|
|
373
|
+
expect(totalSpins).toBe(10000);
|
|
374
|
+
}, 600000); // 10 minute timeout
|
|
375
|
+
it('should handle 100000 consecutive spins without error', async () => {
|
|
376
|
+
const init = await initSession();
|
|
377
|
+
let currentPublic = init.publicState;
|
|
378
|
+
let currentPrivate = init.privateState;
|
|
379
|
+
let totalSpins = 0;
|
|
380
|
+
let failures = 0;
|
|
381
|
+
let totalWagered = 0;
|
|
382
|
+
let totalWon = 0;
|
|
383
|
+
// Correct bet calculation: betGame = baseBet * betStake
|
|
384
|
+
const betStake = 1;
|
|
385
|
+
const betGame = SINGLE_BASE_BET * betStake; // = 8
|
|
386
|
+
for (let i = 0; i < 100000; i++) {
|
|
387
|
+
const spin = await executeSpin(currentPublic, currentPrivate);
|
|
388
|
+
totalSpins++;
|
|
389
|
+
totalWagered += betGame; // Use actual betGame (8), not betStake (1)
|
|
390
|
+
if (!spin.success) {
|
|
391
|
+
failures++;
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
// Happy Panda returns win in outcome.wins.totalPayout + jackpots
|
|
395
|
+
const outcome = spin.outcome;
|
|
396
|
+
if (outcome) {
|
|
397
|
+
totalWon += outcome.wins?.totalPayout || 0;
|
|
398
|
+
totalWon += outcome.jackpotWon || 0;
|
|
399
|
+
totalWon += outcome.poolJackpotWon || 0;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
currentPublic = spin.publicState;
|
|
403
|
+
currentPrivate = spin.privateState;
|
|
404
|
+
}
|
|
405
|
+
const rtp = totalWagered > 0 ? (totalWon / totalWagered) * 100 : 0;
|
|
406
|
+
console.log(`\n=== 100000 Spins Test - Happy Panda ===`);
|
|
407
|
+
console.log(`Total spins: ${totalSpins}`);
|
|
408
|
+
console.log(`Total failures: ${failures}`);
|
|
409
|
+
console.log(`Total wagered: ${totalWagered.toFixed(2)}`);
|
|
410
|
+
console.log(`Total won: ${totalWon.toFixed(2)}`);
|
|
411
|
+
console.log(`Calculated RTP: ${rtp.toFixed(2)}%`);
|
|
412
|
+
expect(failures).toBe(0);
|
|
413
|
+
expect(totalSpins).toBe(100000);
|
|
414
|
+
}, 1800000); // 30 minute timeout
|
|
415
|
+
});
|
|
416
|
+
// ============================================================
|
|
417
|
+
// SECTION 3: MEMORY AND PERFORMANCE
|
|
418
|
+
// ============================================================
|
|
419
|
+
describe('Memory and Performance', () => {
|
|
420
|
+
it('should not leak memory during repeated canonicalization', () => {
|
|
421
|
+
const outcome = {
|
|
422
|
+
action_1: { result: 5, seed: 123, min: 0, max: 10 },
|
|
423
|
+
action_2: { result: 6, seed: 456, min: 0, max: 10 },
|
|
424
|
+
action_3: { result: 7, seed: 789, min: 0, max: 10 },
|
|
425
|
+
};
|
|
426
|
+
// Process many times
|
|
427
|
+
for (let i = 0; i < 10000; i++) {
|
|
428
|
+
const canonical = canonicalizeForHash(outcome);
|
|
429
|
+
expect(canonical.length).toBeGreaterThan(0);
|
|
430
|
+
}
|
|
431
|
+
// If we get here without crash, memory is being managed
|
|
432
|
+
expect(true).toBe(true);
|
|
433
|
+
});
|
|
434
|
+
it('should handle large canonical output efficiently', () => {
|
|
435
|
+
// Create outcome that will produce ~1MB canonical output
|
|
436
|
+
const outcome = {};
|
|
437
|
+
const longActionId = 'action_'.repeat(100); // ~700 chars per entry
|
|
438
|
+
for (let i = 0; i < 1000; i++) {
|
|
439
|
+
outcome[`${longActionId}_${i}`] = {
|
|
440
|
+
result: i % 100,
|
|
441
|
+
seed: i * 12345,
|
|
442
|
+
min: 0,
|
|
443
|
+
max: 99,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
const startTime = Date.now();
|
|
447
|
+
const canonical = canonicalizeForHash(outcome);
|
|
448
|
+
const endTime = Date.now();
|
|
449
|
+
// Should complete within 1 second
|
|
450
|
+
expect(endTime - startTime).toBeLessThan(1000);
|
|
451
|
+
expect(canonical.length).toBeGreaterThan(100000); // At least 100KB
|
|
452
|
+
});
|
|
453
|
+
it('should maintain consistent performance across iterations', async () => {
|
|
454
|
+
const init = await initSession();
|
|
455
|
+
let currentPublic = init.publicState;
|
|
456
|
+
let currentPrivate = init.privateState;
|
|
457
|
+
const durations = [];
|
|
458
|
+
for (let i = 0; i < 100; i++) {
|
|
459
|
+
const start = Date.now();
|
|
460
|
+
const spin = await executeSpin(currentPublic, currentPrivate);
|
|
461
|
+
const duration = Date.now() - start;
|
|
462
|
+
durations.push(duration);
|
|
463
|
+
currentPublic = spin.publicState;
|
|
464
|
+
currentPrivate = spin.privateState;
|
|
465
|
+
}
|
|
466
|
+
// Calculate average and max
|
|
467
|
+
const avgDuration = durations.reduce((a, b) => a + b, 0) / durations.length;
|
|
468
|
+
const maxDuration = Math.max(...durations);
|
|
469
|
+
// No single spin should take more than 5x the average
|
|
470
|
+
expect(maxDuration).toBeLessThan(avgDuration * 5 + 100); // +100ms buffer
|
|
471
|
+
}, 30000);
|
|
472
|
+
});
|
|
473
|
+
// ============================================================
|
|
474
|
+
// SECTION 4: STATE PERSISTENCE
|
|
475
|
+
// ============================================================
|
|
476
|
+
describe('State Persistence', () => {
|
|
477
|
+
it('should maintain state correctly across 100 spins', async () => {
|
|
478
|
+
const init = await initSession();
|
|
479
|
+
let currentPublic = init.publicState;
|
|
480
|
+
let currentPrivate = init.privateState;
|
|
481
|
+
const states = [];
|
|
482
|
+
for (let i = 0; i < 100; i++) {
|
|
483
|
+
const spin = await executeSpin(currentPublic, currentPrivate);
|
|
484
|
+
states.push({
|
|
485
|
+
public: spin.publicState,
|
|
486
|
+
private: spin.privateState,
|
|
487
|
+
});
|
|
488
|
+
currentPublic = spin.publicState;
|
|
489
|
+
currentPrivate = spin.privateState;
|
|
490
|
+
}
|
|
491
|
+
// All states should be defined
|
|
492
|
+
expect(states.every(s => s.public !== undefined && s.private !== undefined)).toBe(true);
|
|
493
|
+
});
|
|
494
|
+
it('should handle state serialization round-trip', async () => {
|
|
495
|
+
const init = await initSession();
|
|
496
|
+
const spin = await executeSpin(init.publicState, init.privateState);
|
|
497
|
+
// Serialize and deserialize state
|
|
498
|
+
const serializedPublic = JSON.stringify(spin.publicState);
|
|
499
|
+
const serializedPrivate = JSON.stringify(spin.privateState);
|
|
500
|
+
const restoredPublic = JSON.parse(serializedPublic);
|
|
501
|
+
const restoredPrivate = JSON.parse(serializedPrivate);
|
|
502
|
+
// Use restored state for next spin
|
|
503
|
+
const nextSpin = await executeSpin(restoredPublic, restoredPrivate);
|
|
504
|
+
expect(nextSpin.success).toBe(true);
|
|
505
|
+
expect(nextSpin.rngOutcome).toBeDefined();
|
|
506
|
+
});
|
|
507
|
+
it('should maintain rngOutcome integrity through state transitions', async () => {
|
|
508
|
+
const init = await initSession();
|
|
509
|
+
let currentPublic = init.publicState;
|
|
510
|
+
let currentPrivate = init.privateState;
|
|
511
|
+
const allOutcomes = [];
|
|
512
|
+
for (let i = 0; i < 50; i++) {
|
|
513
|
+
const spin = await executeSpin(currentPublic, currentPrivate);
|
|
514
|
+
if (spin.rngOutcome) {
|
|
515
|
+
allOutcomes.push({ ...spin.rngOutcome });
|
|
516
|
+
}
|
|
517
|
+
currentPublic = spin.publicState;
|
|
518
|
+
currentPrivate = spin.privateState;
|
|
519
|
+
}
|
|
520
|
+
// Verify all outcomes maintain structure
|
|
521
|
+
for (const outcome of allOutcomes) {
|
|
522
|
+
for (const [actionId, record] of Object.entries(outcome)) {
|
|
523
|
+
expect(typeof record.seed).toBe('number');
|
|
524
|
+
expect(Number.isSafeInteger(record.seed)).toBe(true);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
});
|
|
528
|
+
});
|
|
529
|
+
// ============================================================
|
|
530
|
+
// SECTION 5: SORTING VERIFICATION
|
|
531
|
+
// ============================================================
|
|
532
|
+
describe('Sorting Verification', () => {
|
|
533
|
+
it('should sort actionIds alphabetically', () => {
|
|
534
|
+
const outcome = {
|
|
535
|
+
zebra: { result: 1, seed: 100, min: 0, max: 10 },
|
|
536
|
+
apple: { result: 2, seed: 200, min: 0, max: 10 },
|
|
537
|
+
mango: { result: 3, seed: 300, min: 0, max: 10 },
|
|
538
|
+
};
|
|
539
|
+
const canonical = canonicalizeForHash(outcome);
|
|
540
|
+
const parsed = JSON.parse(canonical);
|
|
541
|
+
expect(parsed[0].actionId).toBe('apple');
|
|
542
|
+
expect(parsed[1].actionId).toBe('mango');
|
|
543
|
+
expect(parsed[2].actionId).toBe('zebra');
|
|
544
|
+
});
|
|
545
|
+
it('should handle numeric actionId sorting as strings', () => {
|
|
546
|
+
const outcome = {
|
|
547
|
+
'10': { result: 1, seed: 100, min: 0, max: 10 },
|
|
548
|
+
'2': { result: 2, seed: 200, min: 0, max: 10 },
|
|
549
|
+
'1': { result: 3, seed: 300, min: 0, max: 10 },
|
|
550
|
+
};
|
|
551
|
+
const canonical = canonicalizeForHash(outcome);
|
|
552
|
+
const parsed = JSON.parse(canonical);
|
|
553
|
+
// String sort: "1" < "10" < "2"
|
|
554
|
+
expect(parsed[0].actionId).toBe('1');
|
|
555
|
+
expect(parsed[1].actionId).toBe('10');
|
|
556
|
+
expect(parsed[2].actionId).toBe('2');
|
|
557
|
+
});
|
|
558
|
+
it('should handle mixed alphanumeric actionIds', () => {
|
|
559
|
+
const outcome = {
|
|
560
|
+
'reel_10': { result: 1, seed: 100, min: 0, max: 10 },
|
|
561
|
+
'reel_2': { result: 2, seed: 200, min: 0, max: 10 },
|
|
562
|
+
'reel_1': { result: 3, seed: 300, min: 0, max: 10 },
|
|
563
|
+
};
|
|
564
|
+
const canonical = canonicalizeForHash(outcome);
|
|
565
|
+
const parsed = JSON.parse(canonical);
|
|
566
|
+
// String sort: "reel_1" < "reel_10" < "reel_2"
|
|
567
|
+
expect(parsed[0].actionId).toBe('reel_1');
|
|
568
|
+
expect(parsed[1].actionId).toBe('reel_10');
|
|
569
|
+
expect(parsed[2].actionId).toBe('reel_2');
|
|
570
|
+
});
|
|
571
|
+
it('should maintain stable sort with many entries', () => {
|
|
572
|
+
const outcome = {};
|
|
573
|
+
for (let i = 0; i < 100; i++) {
|
|
574
|
+
outcome[`action_${String.fromCharCode(65 + (i % 26))}_${i}`] = {
|
|
575
|
+
result: i % 10,
|
|
576
|
+
seed: i * 1000,
|
|
577
|
+
min: 0,
|
|
578
|
+
max: 9,
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
const canonical1 = canonicalizeForHash(outcome);
|
|
582
|
+
const canonical2 = canonicalizeForHash(outcome);
|
|
583
|
+
const canonical3 = canonicalizeForHash(outcome);
|
|
584
|
+
// Sorting must be stable
|
|
585
|
+
expect(canonical1).toBe(canonical2);
|
|
586
|
+
expect(canonical2).toBe(canonical3);
|
|
587
|
+
});
|
|
588
|
+
});
|
|
589
|
+
});
|
|
590
|
+
//# sourceMappingURL=rng-stress-boundary.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rng-stress-boundary.test.js","sourceRoot":"","sources":["../../src/__tests__/rng-stress-boundary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtp-1million.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rtp-1million.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|