@omnitronix/lucky-sharky-game-engine 1.0.9 → 1.2.0

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 (108) hide show
  1. package/README.md +10 -0
  2. package/dist/__tests__/base-game.test.d.ts +2 -0
  3. package/dist/__tests__/base-game.test.d.ts.map +1 -0
  4. package/dist/__tests__/base-game.test.js +262 -0
  5. package/dist/__tests__/base-game.test.js.map +1 -0
  6. package/dist/__tests__/bonus-handlers.test.d.ts +2 -0
  7. package/dist/__tests__/bonus-handlers.test.d.ts.map +1 -0
  8. package/dist/__tests__/bonus-handlers.test.js +243 -0
  9. package/dist/__tests__/bonus-handlers.test.js.map +1 -0
  10. package/dist/__tests__/error-paths.test.d.ts +2 -0
  11. package/dist/__tests__/error-paths.test.d.ts.map +1 -0
  12. package/dist/__tests__/error-paths.test.js +328 -0
  13. package/dist/__tests__/error-paths.test.js.map +1 -0
  14. package/dist/__tests__/free-spins-handler.test.d.ts +2 -0
  15. package/dist/__tests__/free-spins-handler.test.d.ts.map +1 -0
  16. package/dist/__tests__/free-spins-handler.test.js +410 -0
  17. package/dist/__tests__/free-spins-handler.test.js.map +1 -0
  18. package/dist/__tests__/helpers/test-engine-factory.d.ts +98 -0
  19. package/dist/__tests__/helpers/test-engine-factory.d.ts.map +1 -0
  20. package/dist/__tests__/helpers/test-engine-factory.js +236 -0
  21. package/dist/__tests__/helpers/test-engine-factory.js.map +1 -0
  22. package/dist/__tests__/hold-win-handler.test.d.ts +2 -0
  23. package/dist/__tests__/hold-win-handler.test.d.ts.map +1 -0
  24. package/dist/__tests__/hold-win-handler.test.js +481 -0
  25. package/dist/__tests__/hold-win-handler.test.js.map +1 -0
  26. package/dist/__tests__/rng-gli19-compliance.test.d.ts +0 -4
  27. package/dist/__tests__/rng-gli19-compliance.test.d.ts.map +1 -1
  28. package/dist/__tests__/rng-gli19-compliance.test.js +232 -198
  29. package/dist/__tests__/rng-gli19-compliance.test.js.map +1 -1
  30. package/dist/__tests__/rng-security.test.d.ts +2 -0
  31. package/dist/__tests__/rng-security.test.d.ts.map +1 -0
  32. package/dist/__tests__/rng-security.test.js +379 -0
  33. package/dist/__tests__/rng-security.test.js.map +1 -0
  34. package/dist/__tests__/rtp-simulation.test.d.ts +0 -4
  35. package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -1
  36. package/dist/__tests__/rtp-simulation.test.js +228 -153
  37. package/dist/__tests__/rtp-simulation.test.js.map +1 -1
  38. package/dist/__tests__/spin-generator.test.d.ts +2 -0
  39. package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
  40. package/dist/__tests__/spin-generator.test.js +375 -0
  41. package/dist/__tests__/spin-generator.test.js.map +1 -0
  42. package/dist/__tests__/state-transitions.test.d.ts +2 -0
  43. package/dist/__tests__/state-transitions.test.d.ts.map +1 -0
  44. package/dist/__tests__/state-transitions.test.js +249 -0
  45. package/dist/__tests__/state-transitions.test.js.map +1 -0
  46. package/dist/__tests__/symbol-distribution.test.d.ts +2 -0
  47. package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
  48. package/dist/__tests__/symbol-distribution.test.js +210 -0
  49. package/dist/__tests__/symbol-distribution.test.js.map +1 -0
  50. package/dist/__tests__/win-calculator.test.d.ts +2 -0
  51. package/dist/__tests__/win-calculator.test.d.ts.map +1 -0
  52. package/dist/__tests__/win-calculator.test.js +516 -0
  53. package/dist/__tests__/win-calculator.test.js.map +1 -0
  54. package/dist/config/game-logic-config/game-logic-config.d.ts.map +1 -1
  55. package/dist/config/game-logic-config/game-logic-config.js +0 -25
  56. package/dist/config/game-logic-config/game-logic-config.js.map +1 -1
  57. package/dist/config/reel-strips-config/reels-BASE.csv +0 -0
  58. package/dist/config/reel-strips-config/reels-FREESPINS.csv +0 -0
  59. package/dist/game-engine.interface.d.ts +2 -0
  60. package/dist/game-engine.interface.d.ts.map +1 -1
  61. package/dist/index.d.ts +1 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/logic/game-logic-config.interface.d.ts +0 -8
  64. package/dist/logic/game-logic-config.interface.d.ts.map +1 -1
  65. package/dist/logic/handlers/base-game.handler.d.ts.map +1 -1
  66. package/dist/logic/handlers/base-game.handler.js +3 -6
  67. package/dist/logic/handlers/base-game.handler.js.map +1 -1
  68. package/dist/logic/handlers/free-spins.handler.d.ts.map +1 -1
  69. package/dist/logic/handlers/free-spins.handler.js +2 -2
  70. package/dist/logic/handlers/free-spins.handler.js.map +1 -1
  71. package/dist/logic/handlers/hold-win-bonus.handler.d.ts +0 -5
  72. package/dist/logic/handlers/hold-win-bonus.handler.d.ts.map +1 -1
  73. package/dist/logic/handlers/hold-win-bonus.handler.js +28 -181
  74. package/dist/logic/handlers/hold-win-bonus.handler.js.map +1 -1
  75. package/dist/logic/lucky-sharky.spin-generator.d.ts +2 -2
  76. package/dist/logic/lucky-sharky.spin-generator.d.ts.map +1 -1
  77. package/dist/logic/lucky-sharky.spin-generator.js +61 -161
  78. package/dist/logic/lucky-sharky.spin-generator.js.map +1 -1
  79. package/dist/logic/lucky-sharky.types.d.ts +0 -6
  80. package/dist/logic/lucky-sharky.types.d.ts.map +1 -1
  81. package/dist/logic/lucky-sharky.types.js.map +1 -1
  82. package/dist/logic/lucky-sharky.win-calculator.d.ts.map +1 -1
  83. package/dist/logic/lucky-sharky.win-calculator.js +4 -9
  84. package/dist/logic/lucky-sharky.win-calculator.js.map +1 -1
  85. package/dist/lucky-sharky-v1.game-engine.d.ts +2 -2
  86. package/dist/lucky-sharky-v1.game-engine.d.ts.map +1 -1
  87. package/dist/lucky-sharky-v1.game-engine.js +2 -2
  88. package/dist/lucky-sharky-v1.game-engine.js.map +1 -1
  89. package/dist/rng/rng-client.factory.d.ts.map +1 -1
  90. package/dist/rng/rng-client.factory.js +1 -45
  91. package/dist/rng/rng-client.factory.js.map +1 -1
  92. package/package.json +4 -3
  93. package/dist/__tests__/rng-seed-security.test.d.ts +0 -6
  94. package/dist/__tests__/rng-seed-security.test.d.ts.map +0 -1
  95. package/dist/__tests__/rng-seed-security.test.js +0 -263
  96. package/dist/__tests__/rng-seed-security.test.js.map +0 -1
  97. package/dist/__tests__/rng-seed-type.test.d.ts +0 -16
  98. package/dist/__tests__/rng-seed-type.test.d.ts.map +0 -1
  99. package/dist/__tests__/rng-seed-type.test.js +0 -288
  100. package/dist/__tests__/rng-seed-type.test.js.map +0 -1
  101. package/dist/__tests__/rng-stress-boundary.test.d.ts +0 -5
  102. package/dist/__tests__/rng-stress-boundary.test.d.ts.map +0 -1
  103. package/dist/__tests__/rng-stress-boundary.test.js +0 -395
  104. package/dist/__tests__/rng-stress-boundary.test.js.map +0 -1
  105. package/dist/logger/logger.d.ts +0 -9
  106. package/dist/logger/logger.d.ts.map +0 -1
  107. package/dist/logger/logger.js +0 -35
  108. package/dist/logger/logger.js.map +0 -1
package/README.md CHANGED
@@ -124,6 +124,16 @@ const result = await engine.processCommand(
124
124
 
125
125
  **Returns:** Updated state with bonus pending. Execute `START_BONUS_ROUND` to begin the bonus.
126
126
 
127
+ ## Testing
128
+
129
+ This engine uses [@omnitronix/game-test-utils](https://github.com/omnitronix/game-test-utils) for comprehensive testing including:
130
+ - GLI-19 compliance validation
131
+ - RNG security testing
132
+ - Statistical RTP simulation
133
+ - Symbol distribution analysis
134
+
135
+ Run tests: `npm test`
136
+
127
137
  ## Development
128
138
 
129
139
  ```bash
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base-game.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-game.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/base-game.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Base Game Logic Tests — Lucky Sharky
5
+ *
6
+ * Tests the core base game mechanics:
7
+ * - Screen generation (5x3 grid)
8
+ * - Win calculation (payline evaluation)
9
+ * - Booster progression (levels 0-9)
10
+ * - Scatter/gold coin detection
11
+ * - Coin collection mechanics
12
+ * - Bet amount handling
13
+ */
14
+ const test_engine_factory_1 = require("./helpers/test-engine-factory");
15
+ describe('Base Game Logic — Lucky Sharky', () => {
16
+ beforeEach(() => {
17
+ (0, test_engine_factory_1.resetCommandIdCounter)();
18
+ });
19
+ describe('Screen Generation', () => {
20
+ it('should generate a 5x3 screen on each spin', async () => {
21
+ const engine = (0, test_engine_factory_1.createEngine)();
22
+ const session = await (0, test_engine_factory_1.initSession)(engine);
23
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
24
+ expect(result.success).toBe(true);
25
+ const screen = result.outcome?.screen || result.privateState.screen;
26
+ expect(screen).toBeDefined();
27
+ expect(screen.length).toBe(5);
28
+ for (const reel of screen) {
29
+ expect(reel.length).toBe(3);
30
+ }
31
+ });
32
+ it('should produce valid symbol IDs on screen', async () => {
33
+ const engine = (0, test_engine_factory_1.createEngine)();
34
+ const session = await (0, test_engine_factory_1.initSession)(engine);
35
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
36
+ expect(result.success).toBe(true);
37
+ const screen = result.outcome?.screen || result.privateState.screen;
38
+ for (const reel of screen) {
39
+ for (const symbol of reel) {
40
+ expect(typeof symbol).toBe('number');
41
+ expect(symbol).toBeGreaterThanOrEqual(0);
42
+ }
43
+ }
44
+ });
45
+ it('should produce different screens across multiple spins', async () => {
46
+ const engine = (0, test_engine_factory_1.createEngine)();
47
+ const session = await (0, test_engine_factory_1.initSession)(engine);
48
+ const results = await (0, test_engine_factory_1.executeSpins)(engine, session.publicState, session.privateState, 10);
49
+ const screens = results.map(r => JSON.stringify(r.outcome?.screen || r.privateState.screen));
50
+ const unique = new Set(screens);
51
+ // With random RNG, highly likely to have different screens
52
+ expect(unique.size).toBeGreaterThan(1);
53
+ });
54
+ });
55
+ describe('Win Calculation', () => {
56
+ it('should report playerWinning as non-negative number', async () => {
57
+ const engine = (0, test_engine_factory_1.createEngine)();
58
+ const session = await (0, test_engine_factory_1.initSession)(engine);
59
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
60
+ expect(result.success).toBe(true);
61
+ if (result.outcome?.playerWinning !== undefined) {
62
+ expect(result.outcome.playerWinning).toBeGreaterThanOrEqual(0);
63
+ expect(typeof result.outcome.playerWinning).toBe('number');
64
+ }
65
+ });
66
+ it('should include winResult in spin outcome', async () => {
67
+ const engine = (0, test_engine_factory_1.createEngine)();
68
+ const session = await (0, test_engine_factory_1.initSession)(engine);
69
+ let pub = session.publicState;
70
+ let priv = session.privateState;
71
+ let foundWinResult = false;
72
+ for (let i = 0; i < 20; i++) {
73
+ if (priv.nextSpinType !== 'BASE_GAME_SPIN')
74
+ break;
75
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, pub, priv);
76
+ expect(result.success).toBe(true);
77
+ if (result.outcome?.winResult) {
78
+ foundWinResult = true;
79
+ expect(result.outcome.winResult).toBeDefined();
80
+ break;
81
+ }
82
+ pub = result.publicState;
83
+ priv = result.privateState;
84
+ }
85
+ // Win result should be present in outcome structure
86
+ // (may be empty if no wins, but should exist)
87
+ });
88
+ it('should scale wins with bet amount', async () => {
89
+ const engine = (0, test_engine_factory_1.createEngine)();
90
+ // Run spins at bet 1.0
91
+ const session1 = await (0, test_engine_factory_1.initSession)(engine, 1.0);
92
+ let totalWin1 = 0;
93
+ let pub = session1.publicState;
94
+ let priv = session1.privateState;
95
+ for (let i = 0; i < 50; i++) {
96
+ if (priv.nextSpinType !== 'BASE_GAME_SPIN')
97
+ break;
98
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, pub, priv, 1.0);
99
+ expect(result.success).toBe(true);
100
+ totalWin1 += result.outcome?.playerWinning || 0;
101
+ pub = result.publicState;
102
+ priv = result.privateState;
103
+ }
104
+ // Run spins at bet 2.0
105
+ const engine2 = (0, test_engine_factory_1.createEngine)();
106
+ const session2 = await (0, test_engine_factory_1.initSession)(engine2, 2.0);
107
+ let totalWin2 = 0;
108
+ pub = session2.publicState;
109
+ priv = session2.privateState;
110
+ for (let i = 0; i < 50; i++) {
111
+ if (priv.nextSpinType !== 'BASE_GAME_SPIN')
112
+ break;
113
+ const result = await (0, test_engine_factory_1.executeSpin)(engine2, pub, priv, 2.0);
114
+ expect(result.success).toBe(true);
115
+ totalWin2 += result.outcome?.playerWinning || 0;
116
+ pub = result.publicState;
117
+ priv = result.privateState;
118
+ }
119
+ // Both should produce non-negative wins (statistical test, not exact)
120
+ expect(totalWin1).toBeGreaterThanOrEqual(0);
121
+ expect(totalWin2).toBeGreaterThanOrEqual(0);
122
+ });
123
+ });
124
+ describe('Booster Progression', () => {
125
+ it('should start at booster level 0', async () => {
126
+ const engine = (0, test_engine_factory_1.createEngine)();
127
+ const session = await (0, test_engine_factory_1.initSession)(engine);
128
+ expect(session.publicState.boosterLevel).toBe(0);
129
+ });
130
+ it('should maintain booster level between 0 and 9', async () => {
131
+ const engine = (0, test_engine_factory_1.createEngine)();
132
+ const session = await (0, test_engine_factory_1.initSession)(engine);
133
+ let pub = session.publicState;
134
+ let priv = session.privateState;
135
+ for (let i = 0; i < 50; i++) {
136
+ if (priv.nextSpinType !== 'BASE_GAME_SPIN')
137
+ break;
138
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, pub, priv);
139
+ expect(result.success).toBe(true);
140
+ expect(result.publicState.boosterLevel).toBeGreaterThanOrEqual(0);
141
+ expect(result.publicState.boosterLevel).toBeLessThanOrEqual(9);
142
+ pub = result.publicState;
143
+ priv = result.privateState;
144
+ }
145
+ });
146
+ it('should reflect booster level in both public and private state', async () => {
147
+ const engine = (0, test_engine_factory_1.createEngine)();
148
+ const session = await (0, test_engine_factory_1.initSession)(engine);
149
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
150
+ expect(result.success).toBe(true);
151
+ expect(result.publicState.boosterLevel).toBe(result.privateState.boosterLevel);
152
+ });
153
+ });
154
+ describe('RNG Outcome Tracking', () => {
155
+ it('should produce valid RNG outcome on each spin', async () => {
156
+ const engine = (0, test_engine_factory_1.createEngine)();
157
+ const session = await (0, test_engine_factory_1.initSession)(engine);
158
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
159
+ expect(result.success).toBe(true);
160
+ expect(result.rngOutcome).toBeDefined();
161
+ const validation = (0, test_engine_factory_1.validateRngOutcome)(result.rngOutcome);
162
+ expect(validation.valid).toBe(true);
163
+ });
164
+ it('should include all RNG actions in outcome', async () => {
165
+ const engine = (0, test_engine_factory_1.createEngine)();
166
+ const session = await (0, test_engine_factory_1.initSession)(engine);
167
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
168
+ expect(result.success).toBe(true);
169
+ const rng = result.rngOutcome;
170
+ if (rng) {
171
+ const actionCount = Object.keys(rng).length;
172
+ expect(actionCount).toBeGreaterThan(0);
173
+ }
174
+ });
175
+ });
176
+ describe('Mock RNG Determinism', () => {
177
+ it('should produce deterministic results with mock RNG', async () => {
178
+ const { engine: engine1 } = (0, test_engine_factory_1.createEngineWithMockRng)([42, 42, 42, 42, 42]);
179
+ const { engine: engine2 } = (0, test_engine_factory_1.createEngineWithMockRng)([42, 42, 42, 42, 42]);
180
+ const session1 = await (0, test_engine_factory_1.initSession)(engine1);
181
+ const session2 = await (0, test_engine_factory_1.initSession)(engine2);
182
+ const result1 = await (0, test_engine_factory_1.executeSpin)(engine1, session1.publicState, session1.privateState);
183
+ const result2 = await (0, test_engine_factory_1.executeSpin)(engine2, session2.publicState, session2.privateState);
184
+ expect(result1.success).toBe(true);
185
+ expect(result2.success).toBe(true);
186
+ // Same mock RNG values should produce same screens
187
+ const screen1 = result1.outcome?.screen || result1.privateState.screen;
188
+ const screen2 = result2.outcome?.screen || result2.privateState.screen;
189
+ expect(JSON.stringify(screen1)).toBe(JSON.stringify(screen2));
190
+ });
191
+ it('should produce different results with different mock values', async () => {
192
+ const { engine: engine1 } = (0, test_engine_factory_1.createEngineWithMockRng)([0, 0, 0, 0, 0]);
193
+ const { engine: engine2 } = (0, test_engine_factory_1.createEngineWithMockRng)([99, 99, 99, 99, 99]);
194
+ const session1 = await (0, test_engine_factory_1.initSession)(engine1);
195
+ const session2 = await (0, test_engine_factory_1.initSession)(engine2);
196
+ const result1 = await (0, test_engine_factory_1.executeSpin)(engine1, session1.publicState, session1.privateState);
197
+ const result2 = await (0, test_engine_factory_1.executeSpin)(engine2, session2.publicState, session2.privateState);
198
+ expect(result1.success).toBe(true);
199
+ expect(result2.success).toBe(true);
200
+ // Different mock values should produce different screens
201
+ const screen1 = JSON.stringify(result1.outcome?.screen || result1.privateState.screen);
202
+ const screen2 = JSON.stringify(result2.outcome?.screen || result2.privateState.screen);
203
+ expect(screen1).not.toBe(screen2);
204
+ });
205
+ });
206
+ describe('Bet Amount Handling', () => {
207
+ it('should accept different bet amounts', async () => {
208
+ const engine = (0, test_engine_factory_1.createEngine)();
209
+ const session = await (0, test_engine_factory_1.initSession)(engine, 0.2);
210
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState, 0.2);
211
+ expect(result.success).toBe(true);
212
+ });
213
+ it('should handle bet amount change during session', async () => {
214
+ const engine = (0, test_engine_factory_1.createEngine)();
215
+ const session = await (0, test_engine_factory_1.initSession)(engine, 1.0);
216
+ const result1 = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState, 1.0);
217
+ expect(result1.success).toBe(true);
218
+ if (result1.privateState.nextSpinType === 'BASE_GAME_SPIN') {
219
+ // Change bet amount
220
+ const result2 = await (0, test_engine_factory_1.executeSpin)(engine, result1.publicState, result1.privateState, 2.0);
221
+ expect(result2.success).toBe(true);
222
+ }
223
+ });
224
+ });
225
+ describe('Multiple Spin Stability', () => {
226
+ it('should handle 50 consecutive base game spins', async () => {
227
+ const engine = (0, test_engine_factory_1.createEngine)();
228
+ const session = await (0, test_engine_factory_1.initSession)(engine);
229
+ let pub = session.publicState;
230
+ let priv = session.privateState;
231
+ let spinCount = 0;
232
+ for (let i = 0; i < 50; i++) {
233
+ if (priv.nextSpinType !== 'BASE_GAME_SPIN')
234
+ break;
235
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, pub, priv);
236
+ expect(result.success).toBe(true);
237
+ spinCount++;
238
+ pub = result.publicState;
239
+ priv = result.privateState;
240
+ }
241
+ expect(spinCount).toBeGreaterThan(0);
242
+ });
243
+ it('should maintain valid state through long spin sequences', async () => {
244
+ const engine = (0, test_engine_factory_1.createEngine)();
245
+ const session = await (0, test_engine_factory_1.initSession)(engine);
246
+ let pub = session.publicState;
247
+ let priv = session.privateState;
248
+ for (let i = 0; i < 30; i++) {
249
+ if (priv.nextSpinType !== 'BASE_GAME_SPIN')
250
+ break;
251
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, pub, priv);
252
+ expect(result.success).toBe(true);
253
+ expect(result.publicState).toBeDefined();
254
+ expect(result.privateState).toBeDefined();
255
+ expect(result.privateState.nextSpinType).toBeDefined();
256
+ pub = result.publicState;
257
+ priv = result.privateState;
258
+ }
259
+ });
260
+ });
261
+ });
262
+ //# sourceMappingURL=base-game.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-game.test.js","sourceRoot":"","sources":["../../src/__tests__/base-game.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bonus-handlers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bonus-handlers.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/bonus-handlers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Bonus Handler Tests — Lucky Sharky
5
+ *
6
+ * Tests Free Spins and Hold-Win bonus mechanics:
7
+ * - Free spins: trigger, execution, retrigger, booster save/restore
8
+ * - Hold-Win: trigger, respins, jackpots, full screen bonus
9
+ * - Debug trigger → START_BONUS_ROUND flow
10
+ * - Win amounts during bonuses
11
+ */
12
+ const test_engine_factory_1 = require("./helpers/test-engine-factory");
13
+ describe('Bonus Handlers — Lucky Sharky', () => {
14
+ beforeEach(() => {
15
+ (0, test_engine_factory_1.resetCommandIdCounter)();
16
+ });
17
+ describe('Free Spins Bonus', () => {
18
+ it('should trigger free spins via debug and complete successfully', async () => {
19
+ const engine = (0, test_engine_factory_1.createEngine)();
20
+ const session = await (0, test_engine_factory_1.initSession)(engine);
21
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'FREE_SPINS');
22
+ expect(debugResult.success).toBe(true);
23
+ expect(debugResult.privateState.pendingBonuses.length).toBeGreaterThan(0);
24
+ const bonus = debugResult.privateState.pendingBonuses[0];
25
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
26
+ expect(bonusResult.success).toBe(true);
27
+ });
28
+ it('should return to BASE_GAME_SPIN after free spins complete', async () => {
29
+ const engine = (0, test_engine_factory_1.createEngine)();
30
+ const session = await (0, test_engine_factory_1.initSession)(engine);
31
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'FREE_SPINS');
32
+ if (!debugResult.success)
33
+ return;
34
+ const bonus = debugResult.privateState.pendingBonuses[0];
35
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
36
+ expect(bonusResult.success).toBe(true);
37
+ expect(bonusResult.privateState.nextSpinType).toBe('BASE_GAME_SPIN');
38
+ });
39
+ it('should produce non-negative total winnings from free spins', async () => {
40
+ const engine = (0, test_engine_factory_1.createEngine)();
41
+ const session = await (0, test_engine_factory_1.initSession)(engine);
42
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'FREE_SPINS');
43
+ if (!debugResult.success)
44
+ return;
45
+ const bonus = debugResult.privateState.pendingBonuses[0];
46
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
47
+ expect(bonusResult.success).toBe(true);
48
+ // The outcome should contain bonus results with non-negative winnings
49
+ if (bonusResult.outcome) {
50
+ const outcomes = Array.isArray(bonusResult.outcome)
51
+ ? bonusResult.outcome
52
+ : [bonusResult.outcome];
53
+ for (const o of outcomes) {
54
+ if (o.playerWinning !== undefined) {
55
+ expect(o.playerWinning).toBeGreaterThanOrEqual(0);
56
+ }
57
+ }
58
+ }
59
+ });
60
+ it('should restore booster level after free spins', async () => {
61
+ const engine = (0, test_engine_factory_1.createEngine)();
62
+ const session = await (0, test_engine_factory_1.initSession)(engine);
63
+ const boosterBefore = session.publicState.boosterLevel;
64
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'FREE_SPINS');
65
+ if (!debugResult.success)
66
+ return;
67
+ const bonus = debugResult.privateState.pendingBonuses[0];
68
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
69
+ expect(bonusResult.success).toBe(true);
70
+ // After free spins, booster should be restored to pre-bonus level
71
+ // (or possibly higher if it wasn't saved properly, but not lower)
72
+ expect(bonusResult.publicState.boosterLevel).toBeGreaterThanOrEqual(0);
73
+ expect(bonusResult.publicState.boosterLevel).toBeLessThanOrEqual(9);
74
+ });
75
+ it('should include RNG outcome in free spins', async () => {
76
+ const engine = (0, test_engine_factory_1.createEngine)();
77
+ const session = await (0, test_engine_factory_1.initSession)(engine);
78
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'FREE_SPINS');
79
+ if (!debugResult.success)
80
+ return;
81
+ const bonus = debugResult.privateState.pendingBonuses[0];
82
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
83
+ expect(bonusResult.success).toBe(true);
84
+ expect(bonusResult.rngOutcome).toBeDefined();
85
+ });
86
+ it('should allow normal play after free spins complete', async () => {
87
+ const engine = (0, test_engine_factory_1.createEngine)();
88
+ const session = await (0, test_engine_factory_1.initSession)(engine);
89
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'FREE_SPINS');
90
+ if (!debugResult.success)
91
+ return;
92
+ const bonus = debugResult.privateState.pendingBonuses[0];
93
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
94
+ expect(bonusResult.success).toBe(true);
95
+ expect(bonusResult.privateState.nextSpinType).toBe('BASE_GAME_SPIN');
96
+ // Should be able to spin normally after
97
+ const spinResult = await (0, test_engine_factory_1.executeSpin)(engine, bonusResult.publicState, bonusResult.privateState);
98
+ expect(spinResult.success).toBe(true);
99
+ });
100
+ });
101
+ describe('Hold-Win Bonus', () => {
102
+ it('should trigger hold-win via debug and complete successfully', async () => {
103
+ const engine = (0, test_engine_factory_1.createEngine)();
104
+ const session = await (0, test_engine_factory_1.initSession)(engine);
105
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'HOLD_WIN_BONUS');
106
+ expect(debugResult.success).toBe(true);
107
+ expect(debugResult.privateState.pendingBonuses.length).toBeGreaterThan(0);
108
+ const bonus = debugResult.privateState.pendingBonuses[0];
109
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
110
+ expect(bonusResult.success).toBe(true);
111
+ });
112
+ it('should return to BASE_GAME_SPIN after hold-win completes', async () => {
113
+ const engine = (0, test_engine_factory_1.createEngine)();
114
+ const session = await (0, test_engine_factory_1.initSession)(engine);
115
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'HOLD_WIN_BONUS');
116
+ if (!debugResult.success)
117
+ return;
118
+ const bonus = debugResult.privateState.pendingBonuses[0];
119
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
120
+ expect(bonusResult.success).toBe(true);
121
+ expect(bonusResult.privateState.nextSpinType).toBe('BASE_GAME_SPIN');
122
+ });
123
+ it('should produce non-negative total winnings from hold-win', async () => {
124
+ const engine = (0, test_engine_factory_1.createEngine)();
125
+ const session = await (0, test_engine_factory_1.initSession)(engine);
126
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'HOLD_WIN_BONUS');
127
+ if (!debugResult.success)
128
+ return;
129
+ const bonus = debugResult.privateState.pendingBonuses[0];
130
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
131
+ expect(bonusResult.success).toBe(true);
132
+ if (bonusResult.outcome) {
133
+ const outcomes = Array.isArray(bonusResult.outcome)
134
+ ? bonusResult.outcome
135
+ : [bonusResult.outcome];
136
+ for (const o of outcomes) {
137
+ if (o.playerWinning !== undefined) {
138
+ expect(o.playerWinning).toBeGreaterThanOrEqual(0);
139
+ }
140
+ }
141
+ }
142
+ });
143
+ it('should include RNG outcome in hold-win', async () => {
144
+ const engine = (0, test_engine_factory_1.createEngine)();
145
+ const session = await (0, test_engine_factory_1.initSession)(engine);
146
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'HOLD_WIN_BONUS');
147
+ if (!debugResult.success)
148
+ return;
149
+ const bonus = debugResult.privateState.pendingBonuses[0];
150
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
151
+ expect(bonusResult.success).toBe(true);
152
+ expect(bonusResult.rngOutcome).toBeDefined();
153
+ });
154
+ it('should allow normal play after hold-win completes', async () => {
155
+ const engine = (0, test_engine_factory_1.createEngine)();
156
+ const session = await (0, test_engine_factory_1.initSession)(engine);
157
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'HOLD_WIN_BONUS');
158
+ if (!debugResult.success)
159
+ return;
160
+ const bonus = debugResult.privateState.pendingBonuses[0];
161
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
162
+ expect(bonusResult.success).toBe(true);
163
+ const spinResult = await (0, test_engine_factory_1.executeSpin)(engine, bonusResult.publicState, bonusResult.privateState);
164
+ expect(spinResult.success).toBe(true);
165
+ });
166
+ });
167
+ describe('Debug Trigger Mechanics', () => {
168
+ it('should support freeSpins debug trigger type', async () => {
169
+ const engine = (0, test_engine_factory_1.createEngine)();
170
+ const session = await (0, test_engine_factory_1.initSession)(engine);
171
+ const result = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'FREE_SPINS');
172
+ expect(result.success).toBe(true);
173
+ });
174
+ it('should support holdWinBonus debug trigger type', async () => {
175
+ const engine = (0, test_engine_factory_1.createEngine)();
176
+ const session = await (0, test_engine_factory_1.initSession)(engine);
177
+ const result = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'HOLD_WIN_BONUS');
178
+ expect(result.success).toBe(true);
179
+ });
180
+ it('should add bonus to pending list with correct bonusId', async () => {
181
+ const engine = (0, test_engine_factory_1.createEngine)();
182
+ const session = await (0, test_engine_factory_1.initSession)(engine);
183
+ const result = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'FREE_SPINS');
184
+ expect(result.success).toBe(true);
185
+ const bonus = result.privateState.pendingBonuses[0];
186
+ expect(bonus).toBeDefined();
187
+ expect(bonus.bonusId).toBeDefined();
188
+ expect(typeof bonus.bonusId).toBe('string');
189
+ expect(bonus.bonusId.length).toBeGreaterThan(0);
190
+ });
191
+ it('should preserve bet amount in triggered bonus', async () => {
192
+ const engine = (0, test_engine_factory_1.createEngine)();
193
+ const session = await (0, test_engine_factory_1.initSession)(engine, 5.0);
194
+ const result = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'FREE_SPINS', 5.0);
195
+ expect(result.success).toBe(true);
196
+ const bonus = result.privateState.pendingBonuses[0];
197
+ expect(bonus.betAmount).toBe(5.0);
198
+ });
199
+ });
200
+ describe('Bonus Round Win Validation', () => {
201
+ it('should produce finite win amounts in free spins', async () => {
202
+ const engine = (0, test_engine_factory_1.createEngine)();
203
+ const session = await (0, test_engine_factory_1.initSession)(engine);
204
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'FREE_SPINS');
205
+ if (!debugResult.success)
206
+ return;
207
+ const bonus = debugResult.privateState.pendingBonuses[0];
208
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
209
+ expect(bonusResult.success).toBe(true);
210
+ if (bonusResult.outcome) {
211
+ const outcomes = Array.isArray(bonusResult.outcome)
212
+ ? bonusResult.outcome
213
+ : [bonusResult.outcome];
214
+ for (const o of outcomes) {
215
+ if (o.playerWinning !== undefined) {
216
+ expect(Number.isFinite(o.playerWinning)).toBe(true);
217
+ }
218
+ }
219
+ }
220
+ });
221
+ it('should produce finite win amounts in hold-win', async () => {
222
+ const engine = (0, test_engine_factory_1.createEngine)();
223
+ const session = await (0, test_engine_factory_1.initSession)(engine);
224
+ const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'HOLD_WIN_BONUS');
225
+ if (!debugResult.success)
226
+ return;
227
+ const bonus = debugResult.privateState.pendingBonuses[0];
228
+ const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
229
+ expect(bonusResult.success).toBe(true);
230
+ if (bonusResult.outcome) {
231
+ const outcomes = Array.isArray(bonusResult.outcome)
232
+ ? bonusResult.outcome
233
+ : [bonusResult.outcome];
234
+ for (const o of outcomes) {
235
+ if (o.playerWinning !== undefined) {
236
+ expect(Number.isFinite(o.playerWinning)).toBe(true);
237
+ }
238
+ }
239
+ }
240
+ });
241
+ });
242
+ });
243
+ //# sourceMappingURL=bonus-handlers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bonus-handlers.test.js","sourceRoot":"","sources":["../../src/__tests__/bonus-handlers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=error-paths.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-paths.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/error-paths.test.ts"],"names":[],"mappings":""}