@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.
Files changed (207) hide show
  1. package/README.md +732 -0
  2. package/dist/__tests__/bonus-sequence.test.d.ts +7 -0
  3. package/dist/__tests__/bonus-sequence.test.d.ts.map +1 -0
  4. package/dist/__tests__/bonus-sequence.test.js +381 -0
  5. package/dist/__tests__/bonus-sequence.test.js.map +1 -0
  6. package/dist/__tests__/cherry-frequency.test.d.ts +8 -0
  7. package/dist/__tests__/cherry-frequency.test.d.ts.map +1 -0
  8. package/dist/__tests__/cherry-frequency.test.js +128 -0
  9. package/dist/__tests__/cherry-frequency.test.js.map +1 -0
  10. package/dist/__tests__/comprehensive.test.d.ts +16 -0
  11. package/dist/__tests__/comprehensive.test.d.ts.map +1 -0
  12. package/dist/__tests__/comprehensive.test.js +491 -0
  13. package/dist/__tests__/comprehensive.test.js.map +1 -0
  14. package/dist/__tests__/counter-manager.test.d.ts +7 -0
  15. package/dist/__tests__/counter-manager.test.d.ts.map +1 -0
  16. package/dist/__tests__/counter-manager.test.js +317 -0
  17. package/dist/__tests__/counter-manager.test.js.map +1 -0
  18. package/dist/__tests__/coverage-boost.test.d.ts +13 -0
  19. package/dist/__tests__/coverage-boost.test.d.ts.map +1 -0
  20. package/dist/__tests__/coverage-boost.test.js +606 -0
  21. package/dist/__tests__/coverage-boost.test.js.map +1 -0
  22. package/dist/__tests__/cpp-parity.test.d.ts +39 -0
  23. package/dist/__tests__/cpp-parity.test.d.ts.map +1 -0
  24. package/dist/__tests__/cpp-parity.test.js +392 -0
  25. package/dist/__tests__/cpp-parity.test.js.map +1 -0
  26. package/dist/__tests__/debug-trigger-bonus.test.d.ts +8 -0
  27. package/dist/__tests__/debug-trigger-bonus.test.d.ts.map +1 -0
  28. package/dist/__tests__/debug-trigger-bonus.test.js +359 -0
  29. package/dist/__tests__/debug-trigger-bonus.test.js.map +1 -0
  30. package/dist/__tests__/fixtures/cpp-parity-vectors.json +457 -0
  31. package/dist/__tests__/gdd-validation-1000.test.d.ts +14 -0
  32. package/dist/__tests__/gdd-validation-1000.test.d.ts.map +1 -0
  33. package/dist/__tests__/gdd-validation-1000.test.js +418 -0
  34. package/dist/__tests__/gdd-validation-1000.test.js.map +1 -0
  35. package/dist/__tests__/happy-panda-engine.test.d.ts +7 -0
  36. package/dist/__tests__/happy-panda-engine.test.d.ts.map +1 -0
  37. package/dist/__tests__/happy-panda-engine.test.js +414 -0
  38. package/dist/__tests__/happy-panda-engine.test.js.map +1 -0
  39. package/dist/__tests__/jackpot-manager.test.d.ts +8 -0
  40. package/dist/__tests__/jackpot-manager.test.d.ts.map +1 -0
  41. package/dist/__tests__/jackpot-manager.test.js +313 -0
  42. package/dist/__tests__/jackpot-manager.test.js.map +1 -0
  43. package/dist/__tests__/jackpot-trigger-trace.test.d.ts +6 -0
  44. package/dist/__tests__/jackpot-trigger-trace.test.d.ts.map +1 -0
  45. package/dist/__tests__/jackpot-trigger-trace.test.js +146 -0
  46. package/dist/__tests__/jackpot-trigger-trace.test.js.map +1 -0
  47. package/dist/__tests__/rng-gli19-compliance.test.d.ts +21 -0
  48. package/dist/__tests__/rng-gli19-compliance.test.d.ts.map +1 -0
  49. package/dist/__tests__/rng-gli19-compliance.test.js +480 -0
  50. package/dist/__tests__/rng-gli19-compliance.test.js.map +1 -0
  51. package/dist/__tests__/rng-seed-security.test.d.ts +19 -0
  52. package/dist/__tests__/rng-seed-security.test.d.ts.map +1 -0
  53. package/dist/__tests__/rng-seed-security.test.js +518 -0
  54. package/dist/__tests__/rng-seed-security.test.js.map +1 -0
  55. package/dist/__tests__/rng-seed-type.test.d.ts +16 -0
  56. package/dist/__tests__/rng-seed-type.test.d.ts.map +1 -0
  57. package/dist/__tests__/rng-seed-type.test.js +285 -0
  58. package/dist/__tests__/rng-seed-type.test.js.map +1 -0
  59. package/dist/__tests__/rng-stress-boundary.test.d.ts +15 -0
  60. package/dist/__tests__/rng-stress-boundary.test.d.ts.map +1 -0
  61. package/dist/__tests__/rng-stress-boundary.test.js +590 -0
  62. package/dist/__tests__/rng-stress-boundary.test.js.map +1 -0
  63. package/dist/__tests__/rtp-1million.test.d.ts +8 -0
  64. package/dist/__tests__/rtp-1million.test.d.ts.map +1 -0
  65. package/dist/__tests__/rtp-1million.test.js +156 -0
  66. package/dist/__tests__/rtp-1million.test.js.map +1 -0
  67. package/dist/__tests__/rtp-analysis.test.d.ts +8 -0
  68. package/dist/__tests__/rtp-analysis.test.d.ts.map +1 -0
  69. package/dist/__tests__/rtp-analysis.test.js +138 -0
  70. package/dist/__tests__/rtp-analysis.test.js.map +1 -0
  71. package/dist/__tests__/rtp-diagnostic.test.d.ts +6 -0
  72. package/dist/__tests__/rtp-diagnostic.test.d.ts.map +1 -0
  73. package/dist/__tests__/rtp-diagnostic.test.js +141 -0
  74. package/dist/__tests__/rtp-diagnostic.test.js.map +1 -0
  75. package/dist/__tests__/rtp-simulation.test.d.ts +8 -0
  76. package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -0
  77. package/dist/__tests__/rtp-simulation.test.js +411 -0
  78. package/dist/__tests__/rtp-simulation.test.js.map +1 -0
  79. package/dist/__tests__/special-wins.test.d.ts +7 -0
  80. package/dist/__tests__/special-wins.test.d.ts.map +1 -0
  81. package/dist/__tests__/special-wins.test.js +179 -0
  82. package/dist/__tests__/special-wins.test.js.map +1 -0
  83. package/dist/__tests__/spin-generator.test.d.ts +7 -0
  84. package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
  85. package/dist/__tests__/spin-generator.test.js +297 -0
  86. package/dist/__tests__/spin-generator.test.js.map +1 -0
  87. package/dist/__tests__/spin-handler.test.d.ts +7 -0
  88. package/dist/__tests__/spin-handler.test.d.ts.map +1 -0
  89. package/dist/__tests__/spin-handler.test.js +210 -0
  90. package/dist/__tests__/spin-handler.test.js.map +1 -0
  91. package/dist/__tests__/symbol-distribution.test.d.ts +6 -0
  92. package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
  93. package/dist/__tests__/symbol-distribution.test.js +119 -0
  94. package/dist/__tests__/symbol-distribution.test.js.map +1 -0
  95. package/dist/__tests__/test-protocol-10000-spin.test.d.ts +14 -0
  96. package/dist/__tests__/test-protocol-10000-spin.test.d.ts.map +1 -0
  97. package/dist/__tests__/test-protocol-10000-spin.test.js +359 -0
  98. package/dist/__tests__/test-protocol-10000-spin.test.js.map +1 -0
  99. package/dist/__tests__/weighted-random.test.d.ts +7 -0
  100. package/dist/__tests__/weighted-random.test.d.ts.map +1 -0
  101. package/dist/__tests__/weighted-random.test.js +165 -0
  102. package/dist/__tests__/weighted-random.test.js.map +1 -0
  103. package/dist/__tests__/win-evaluator.test.d.ts +7 -0
  104. package/dist/__tests__/win-evaluator.test.d.ts.map +1 -0
  105. package/dist/__tests__/win-evaluator.test.js +264 -0
  106. package/dist/__tests__/win-evaluator.test.js.map +1 -0
  107. package/dist/config/happy-panda.config.d.ts +217 -0
  108. package/dist/config/happy-panda.config.d.ts.map +1 -0
  109. package/dist/config/happy-panda.config.js +721 -0
  110. package/dist/config/happy-panda.config.js.map +1 -0
  111. package/dist/config/index.d.ts +5 -0
  112. package/dist/config/index.d.ts.map +1 -0
  113. package/dist/config/index.js +21 -0
  114. package/dist/config/index.js.map +1 -0
  115. package/dist/debug/debug-command-definitions.d.ts +38 -0
  116. package/dist/debug/debug-command-definitions.d.ts.map +1 -0
  117. package/dist/debug/debug-command-definitions.js +80 -0
  118. package/dist/debug/debug-command-definitions.js.map +1 -0
  119. package/dist/domain/debug-trigger-bonus-command.d.ts +17 -0
  120. package/dist/domain/debug-trigger-bonus-command.d.ts.map +1 -0
  121. package/dist/domain/debug-trigger-bonus-command.js +3 -0
  122. package/dist/domain/debug-trigger-bonus-command.js.map +1 -0
  123. package/dist/domain/index.d.ts +5 -0
  124. package/dist/domain/index.d.ts.map +1 -0
  125. package/dist/domain/index.js +21 -0
  126. package/dist/domain/index.js.map +1 -0
  127. package/dist/domain/types.d.ts +228 -0
  128. package/dist/domain/types.d.ts.map +1 -0
  129. package/dist/domain/types.js +30 -0
  130. package/dist/domain/types.js.map +1 -0
  131. package/dist/engine/happy-panda-engine.d.ts +64 -0
  132. package/dist/engine/happy-panda-engine.d.ts.map +1 -0
  133. package/dist/engine/happy-panda-engine.js +324 -0
  134. package/dist/engine/happy-panda-engine.js.map +1 -0
  135. package/dist/engine/index.d.ts +5 -0
  136. package/dist/engine/index.d.ts.map +1 -0
  137. package/dist/engine/index.js +21 -0
  138. package/dist/engine/index.js.map +1 -0
  139. package/dist/game-engine.interface.d.ts +19 -0
  140. package/dist/game-engine.interface.d.ts.map +1 -0
  141. package/dist/game-engine.interface.js +9 -0
  142. package/dist/game-engine.interface.js.map +1 -0
  143. package/dist/happy-panda-v1.game-engine.d.ts +60 -0
  144. package/dist/happy-panda-v1.game-engine.d.ts.map +1 -0
  145. package/dist/happy-panda-v1.game-engine.js +524 -0
  146. package/dist/happy-panda-v1.game-engine.js.map +1 -0
  147. package/dist/index.d.ts +22 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +59 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/logic/handlers/index.d.ts +5 -0
  152. package/dist/logic/handlers/index.d.ts.map +1 -0
  153. package/dist/logic/handlers/index.js +21 -0
  154. package/dist/logic/handlers/index.js.map +1 -0
  155. package/dist/logic/handlers/spin-handler.d.ts +58 -0
  156. package/dist/logic/handlers/spin-handler.d.ts.map +1 -0
  157. package/dist/logic/handlers/spin-handler.js +265 -0
  158. package/dist/logic/handlers/spin-handler.js.map +1 -0
  159. package/dist/logic/index.d.ts +6 -0
  160. package/dist/logic/index.d.ts.map +1 -0
  161. package/dist/logic/index.js +22 -0
  162. package/dist/logic/index.js.map +1 -0
  163. package/dist/logic/services/counter-manager.d.ts +60 -0
  164. package/dist/logic/services/counter-manager.d.ts.map +1 -0
  165. package/dist/logic/services/counter-manager.js +268 -0
  166. package/dist/logic/services/counter-manager.js.map +1 -0
  167. package/dist/logic/services/index.d.ts +7 -0
  168. package/dist/logic/services/index.d.ts.map +1 -0
  169. package/dist/logic/services/index.js +23 -0
  170. package/dist/logic/services/index.js.map +1 -0
  171. package/dist/logic/services/jackpot-manager.d.ts +59 -0
  172. package/dist/logic/services/jackpot-manager.d.ts.map +1 -0
  173. package/dist/logic/services/jackpot-manager.js +142 -0
  174. package/dist/logic/services/jackpot-manager.js.map +1 -0
  175. package/dist/logic/services/win-evaluator.d.ts +51 -0
  176. package/dist/logic/services/win-evaluator.d.ts.map +1 -0
  177. package/dist/logic/services/win-evaluator.js +463 -0
  178. package/dist/logic/services/win-evaluator.js.map +1 -0
  179. package/dist/rng/dummy-rng-client.d.ts +39 -0
  180. package/dist/rng/dummy-rng-client.d.ts.map +1 -0
  181. package/dist/rng/dummy-rng-client.js +77 -0
  182. package/dist/rng/dummy-rng-client.js.map +1 -0
  183. package/dist/rng/index.d.ts +10 -0
  184. package/dist/rng/index.d.ts.map +1 -0
  185. package/dist/rng/index.js +27 -0
  186. package/dist/rng/index.js.map +1 -0
  187. package/dist/rng/rng-client.factory.d.ts +33 -0
  188. package/dist/rng/rng-client.factory.d.ts.map +1 -0
  189. package/dist/rng/rng-client.factory.js +57 -0
  190. package/dist/rng/rng-client.factory.js.map +1 -0
  191. package/dist/rng/rng-client.interface.d.ts +51 -0
  192. package/dist/rng/rng-client.interface.d.ts.map +1 -0
  193. package/dist/rng/rng-client.interface.js +9 -0
  194. package/dist/rng/rng-client.interface.js.map +1 -0
  195. package/dist/rng/rng-service.d.ts +93 -0
  196. package/dist/rng/rng-service.d.ts.map +1 -0
  197. package/dist/rng/rng-service.js +124 -0
  198. package/dist/rng/rng-service.js.map +1 -0
  199. package/dist/rng/spin-generator.d.ts +32 -0
  200. package/dist/rng/spin-generator.d.ts.map +1 -0
  201. package/dist/rng/spin-generator.js +338 -0
  202. package/dist/rng/spin-generator.js.map +1 -0
  203. package/dist/rng/weighted-random.d.ts +30 -0
  204. package/dist/rng/weighted-random.d.ts.map +1 -0
  205. package/dist/rng/weighted-random.js +58 -0
  206. package/dist/rng/weighted-random.js.map +1 -0
  207. 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,8 @@
1
+ /**
2
+ * High-Volume RTP Simulation (100k - 1M Spins)
3
+ *
4
+ * This test validates RTP accuracy with statistical significance.
5
+ * With 1M spins, we expect RTP variance of ±0.5% or less.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=rtp-1million.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtp-1million.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rtp-1million.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}