@omnitronix/happy-panda-game-engine 0.0.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 (71) hide show
  1. package/README.md +212 -0
  2. package/dist/__tests__/bonus-sequence.test.js +337 -0
  3. package/dist/__tests__/bonus-sequence.test.js.map +1 -0
  4. package/dist/__tests__/cherry-frequency.test.js +128 -0
  5. package/dist/__tests__/cherry-frequency.test.js.map +1 -0
  6. package/dist/__tests__/counter-manager.test.js +316 -0
  7. package/dist/__tests__/counter-manager.test.js.map +1 -0
  8. package/dist/__tests__/cpp-parity.test.js +368 -0
  9. package/dist/__tests__/cpp-parity.test.js.map +1 -0
  10. package/dist/__tests__/fixtures/cpp-parity-vectors.json +438 -0
  11. package/dist/__tests__/happy-panda-engine.test.js +367 -0
  12. package/dist/__tests__/happy-panda-engine.test.js.map +1 -0
  13. package/dist/__tests__/jackpot-manager.test.js +313 -0
  14. package/dist/__tests__/jackpot-manager.test.js.map +1 -0
  15. package/dist/__tests__/jackpot-trigger-trace.test.js +146 -0
  16. package/dist/__tests__/jackpot-trigger-trace.test.js.map +1 -0
  17. package/dist/__tests__/rtp-1million.test.js +156 -0
  18. package/dist/__tests__/rtp-1million.test.js.map +1 -0
  19. package/dist/__tests__/rtp-analysis.test.js +138 -0
  20. package/dist/__tests__/rtp-analysis.test.js.map +1 -0
  21. package/dist/__tests__/rtp-diagnostic.test.js +126 -0
  22. package/dist/__tests__/rtp-diagnostic.test.js.map +1 -0
  23. package/dist/__tests__/rtp-simulation.test.js +409 -0
  24. package/dist/__tests__/rtp-simulation.test.js.map +1 -0
  25. package/dist/__tests__/special-wins.test.js +179 -0
  26. package/dist/__tests__/special-wins.test.js.map +1 -0
  27. package/dist/__tests__/spin-generator.test.js +250 -0
  28. package/dist/__tests__/spin-generator.test.js.map +1 -0
  29. package/dist/__tests__/spin-handler.test.js +210 -0
  30. package/dist/__tests__/spin-handler.test.js.map +1 -0
  31. package/dist/__tests__/symbol-distribution.test.js +119 -0
  32. package/dist/__tests__/symbol-distribution.test.js.map +1 -0
  33. package/dist/__tests__/weighted-random.test.js +165 -0
  34. package/dist/__tests__/weighted-random.test.js.map +1 -0
  35. package/dist/__tests__/win-evaluator.test.js +254 -0
  36. package/dist/__tests__/win-evaluator.test.js.map +1 -0
  37. package/dist/config/happy-panda.config.js +714 -0
  38. package/dist/config/happy-panda.config.js.map +1 -0
  39. package/dist/config/index.js +21 -0
  40. package/dist/config/index.js.map +1 -0
  41. package/dist/domain/index.js +21 -0
  42. package/dist/domain/index.js.map +1 -0
  43. package/dist/domain/types.js +28 -0
  44. package/dist/domain/types.js.map +1 -0
  45. package/dist/engine/happy-panda-engine.js +197 -0
  46. package/dist/engine/happy-panda-engine.js.map +1 -0
  47. package/dist/engine/index.js +21 -0
  48. package/dist/engine/index.js.map +1 -0
  49. package/dist/index.js +34 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/logic/handlers/index.js +21 -0
  52. package/dist/logic/handlers/index.js.map +1 -0
  53. package/dist/logic/handlers/spin-handler.js +256 -0
  54. package/dist/logic/handlers/spin-handler.js.map +1 -0
  55. package/dist/logic/index.js +22 -0
  56. package/dist/logic/index.js.map +1 -0
  57. package/dist/logic/services/counter-manager.js +265 -0
  58. package/dist/logic/services/counter-manager.js.map +1 -0
  59. package/dist/logic/services/index.js +23 -0
  60. package/dist/logic/services/index.js.map +1 -0
  61. package/dist/logic/services/jackpot-manager.js +142 -0
  62. package/dist/logic/services/jackpot-manager.js.map +1 -0
  63. package/dist/logic/services/win-evaluator.js +470 -0
  64. package/dist/logic/services/win-evaluator.js.map +1 -0
  65. package/dist/rng/index.js +22 -0
  66. package/dist/rng/index.js.map +1 -0
  67. package/dist/rng/spin-generator.js +341 -0
  68. package/dist/rng/spin-generator.js.map +1 -0
  69. package/dist/rng/weighted-random.js +58 -0
  70. package/dist/rng/weighted-random.js.map +1 -0
  71. package/package.json +49 -0
@@ -0,0 +1,367 @@
1
+ "use strict";
2
+ /**
3
+ * Happy Panda Engine Tests
4
+ *
5
+ * Integration tests for the engine class - the public API.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const happy_panda_engine_1 = require("../engine/happy-panda-engine");
9
+ const happy_panda_config_1 = require("../config/happy-panda.config");
10
+ const types_1 = require("../domain/types");
11
+ // Deterministic mock RNG
12
+ function createMockRng(values = []) {
13
+ let index = 0;
14
+ return {
15
+ async random(max) {
16
+ const val = values[index % Math.max(values.length, 1)] || 0;
17
+ index++;
18
+ return val % max;
19
+ },
20
+ async randomBatch(count, max) {
21
+ const results = [];
22
+ for (let i = 0; i < count; i++) {
23
+ const val = values[index % Math.max(values.length, 1)] || 0;
24
+ index++;
25
+ results.push(val % max);
26
+ }
27
+ return results;
28
+ },
29
+ };
30
+ }
31
+ describe('HappyPandaEngine', () => {
32
+ let engine;
33
+ let mockRng;
34
+ beforeEach(() => {
35
+ mockRng = createMockRng([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
36
+ engine = new happy_panda_engine_1.HappyPandaEngine(mockRng);
37
+ });
38
+ describe('INIT_SESSION_STATE Command', () => {
39
+ it('should create valid session with SINGLE mode', async () => {
40
+ const request = {
41
+ command: types_1.CommandType.INIT_SESSION_STATE,
42
+ sessionId: 'test-session-1',
43
+ gameDirection: types_1.GameDirection.SINGLE,
44
+ betStake: 1,
45
+ };
46
+ const { response, state } = await engine.handleCommand(request);
47
+ expect(state.sessionId).toBe('test-session-1');
48
+ expect(state.publicState.gameDirection).toBe(types_1.GameDirection.SINGLE);
49
+ expect(state.publicState.betStake).toBe(1);
50
+ expect(state.publicState.betGame).toBe(8); // 8 lines * 1
51
+ expect(state.publicState.currentSpinType).toBe(happy_panda_config_1.SpinType.PAID_SPIN);
52
+ expect(response.betGame).toBe(8);
53
+ });
54
+ it('should create valid session with BOTH mode', async () => {
55
+ const request = {
56
+ command: types_1.CommandType.INIT_SESSION_STATE,
57
+ sessionId: 'test-session-2',
58
+ gameDirection: types_1.GameDirection.BOTH,
59
+ betStake: 5,
60
+ };
61
+ const { response, state } = await engine.handleCommand(request);
62
+ expect(state.publicState.gameDirection).toBe(types_1.GameDirection.BOTH);
63
+ expect(state.publicState.betStake).toBe(5);
64
+ expect(state.publicState.betGame).toBe(80); // 16 lines * 5
65
+ });
66
+ it('should initialize jackpots correctly', async () => {
67
+ const request = {
68
+ command: types_1.CommandType.INIT_SESSION_STATE,
69
+ sessionId: 'test-session-3',
70
+ gameDirection: types_1.GameDirection.SINGLE,
71
+ betStake: 2,
72
+ };
73
+ const { state } = await engine.handleCommand(request);
74
+ // Bonus jackpot starts at 100 * betGame
75
+ expect(state.publicState.bonusJackpotValue).toBe(100 * 16);
76
+ expect(state.publicState.poolJackpotValue).toBe(0);
77
+ });
78
+ it('should initialize counters in private state', async () => {
79
+ const request = {
80
+ command: types_1.CommandType.INIT_SESSION_STATE,
81
+ sessionId: 'test-session-4',
82
+ gameDirection: types_1.GameDirection.SINGLE,
83
+ betStake: 1,
84
+ };
85
+ const { state } = await engine.handleCommand(request);
86
+ expect(state.privateState.counters.jackpot).toBe(1);
87
+ expect(state.privateState.counters.bar1).toBe(1);
88
+ expect(state.privateState.counters.cherry).toBeGreaterThan(0);
89
+ expect(state.privateState.counters.bell).toBeGreaterThan(0);
90
+ });
91
+ it('should initialize empty pending bonuses', async () => {
92
+ const request = {
93
+ command: types_1.CommandType.INIT_SESSION_STATE,
94
+ sessionId: 'test-session-5',
95
+ gameDirection: types_1.GameDirection.SINGLE,
96
+ betStake: 1,
97
+ };
98
+ const { state } = await engine.handleCommand(request);
99
+ expect(state.privateState.pendingBonuses.jackpot).toBe(0);
100
+ expect(state.privateState.pendingBonuses.cherry).toBe(0);
101
+ expect(state.privateState.pendingBonuses.bell).toBe(0);
102
+ expect(state.privateState.pendingBonuses.bar1).toBe(0);
103
+ expect(state.privateState.pendingBonuses.respin).toBe(0);
104
+ });
105
+ });
106
+ describe('SPIN Command', () => {
107
+ let sessionState;
108
+ beforeEach(async () => {
109
+ const initRequest = {
110
+ command: types_1.CommandType.INIT_SESSION_STATE,
111
+ sessionId: 'spin-test-session',
112
+ gameDirection: types_1.GameDirection.SINGLE,
113
+ betStake: 1,
114
+ };
115
+ const result = await engine.handleCommand(initRequest);
116
+ sessionState = result.state;
117
+ });
118
+ it('should execute spin and return valid response', async () => {
119
+ const spinRequest = {
120
+ command: types_1.CommandType.SPIN,
121
+ sessionId: 'spin-test-session',
122
+ };
123
+ const { response, state } = await engine.handleCommand(spinRequest, sessionState);
124
+ expect(response).toHaveProperty('sessionId');
125
+ expect(response).toHaveProperty('grid');
126
+ expect(response).toHaveProperty('wins');
127
+ expect(response).toHaveProperty('state');
128
+ expect(state.sessionId).toBe('spin-test-session');
129
+ });
130
+ it('should generate valid 3x3 grid', async () => {
131
+ const spinRequest = {
132
+ command: types_1.CommandType.SPIN,
133
+ sessionId: 'spin-test-session',
134
+ };
135
+ const { response } = await engine.handleCommand(spinRequest, sessionState);
136
+ const spinResponse = response;
137
+ expect(spinResponse.grid).toHaveLength(3);
138
+ spinResponse.grid.forEach(reel => {
139
+ expect(reel).toHaveLength(3);
140
+ reel.forEach(symbol => {
141
+ expect(symbol).toBeGreaterThanOrEqual(-1); // Symbol.NONE = -1
142
+ });
143
+ });
144
+ });
145
+ it('should return win results', async () => {
146
+ const spinRequest = {
147
+ command: types_1.CommandType.SPIN,
148
+ sessionId: 'spin-test-session',
149
+ };
150
+ const { response } = await engine.handleCommand(spinRequest, sessionState);
151
+ const spinResponse = response;
152
+ expect(spinResponse.wins).toHaveProperty('lineWins');
153
+ expect(spinResponse.wins).toHaveProperty('totalPayout');
154
+ expect(spinResponse.wins.totalPayout).toBeGreaterThanOrEqual(0);
155
+ });
156
+ it('should throw error when no session state provided', async () => {
157
+ const spinRequest = {
158
+ command: types_1.CommandType.SPIN,
159
+ sessionId: 'no-session',
160
+ };
161
+ await expect(engine.handleCommand(spinRequest)).rejects.toThrow('No session state for SPIN command');
162
+ });
163
+ it('should update session state after spin', async () => {
164
+ const spinRequest = {
165
+ command: types_1.CommandType.SPIN,
166
+ sessionId: 'spin-test-session',
167
+ };
168
+ const { state: newState } = await engine.handleCommand(spinRequest, sessionState);
169
+ // State should be updated with new grid
170
+ expect(newState.publicState.grid).toBeDefined();
171
+ expect(newState.updatedAt).toBeDefined();
172
+ });
173
+ it('should handle multiple consecutive spins', async () => {
174
+ const spinRequest = {
175
+ command: types_1.CommandType.SPIN,
176
+ sessionId: 'spin-test-session',
177
+ };
178
+ let currentState = sessionState;
179
+ for (let i = 0; i < 5; i++) {
180
+ const result = await engine.handleCommand(spinRequest, currentState);
181
+ currentState = result.state;
182
+ expect(currentState.publicState.grid).toBeDefined();
183
+ }
184
+ });
185
+ });
186
+ describe('GET_SYMBOLS Command', () => {
187
+ it('should return symbol definitions', async () => {
188
+ const request = {
189
+ command: types_1.CommandType.GET_SYMBOLS,
190
+ sessionId: 'symbols-test',
191
+ };
192
+ const { response } = await engine.handleCommand(request);
193
+ const symbolsResponse = response;
194
+ expect(symbolsResponse.symbols).toBeDefined();
195
+ expect(Array.isArray(symbolsResponse.symbols)).toBe(true);
196
+ expect(symbolsResponse.symbols.length).toBeGreaterThan(0);
197
+ // Check some known symbols exist
198
+ const symbolNames = symbolsResponse.symbols.map(s => s.name);
199
+ expect(symbolNames).toContain('CHERRY');
200
+ expect(symbolNames).toContain('SEVEN');
201
+ expect(symbolNames).toContain('BAR3');
202
+ });
203
+ it('should work without existing session state', async () => {
204
+ const request = {
205
+ command: types_1.CommandType.GET_SYMBOLS,
206
+ sessionId: 'no-session',
207
+ };
208
+ const { response, state } = await engine.handleCommand(request);
209
+ expect(response).toBeDefined();
210
+ expect(state).toBeDefined();
211
+ });
212
+ });
213
+ describe('Unknown Command', () => {
214
+ it('should throw for invalid command type', async () => {
215
+ const request = {
216
+ command: 'INVALID_COMMAND',
217
+ sessionId: 'test',
218
+ }; // Force invalid command through type system
219
+ await expect(engine.handleCommand(request)).rejects.toThrow('Unknown command');
220
+ });
221
+ });
222
+ describe('updateBet', () => {
223
+ let sessionState;
224
+ beforeEach(async () => {
225
+ const initRequest = {
226
+ command: types_1.CommandType.INIT_SESSION_STATE,
227
+ sessionId: 'bet-test-session',
228
+ gameDirection: types_1.GameDirection.SINGLE,
229
+ betStake: 1,
230
+ };
231
+ const result = await engine.handleCommand(initRequest);
232
+ sessionState = result.state;
233
+ });
234
+ it('should update bet correctly', () => {
235
+ const newState = engine.updateBet(sessionState, types_1.GameDirection.BOTH, 5);
236
+ expect(newState.publicState.gameDirection).toBe(types_1.GameDirection.BOTH);
237
+ expect(newState.publicState.betStake).toBe(5);
238
+ expect(newState.publicState.betGame).toBe(80); // 16 * 5
239
+ });
240
+ it('should preserve session ID', () => {
241
+ const newState = engine.updateBet(sessionState, types_1.GameDirection.BOTH, 3);
242
+ expect(newState.sessionId).toBe('bet-test-session');
243
+ });
244
+ it('should throw when changing bet during bonus', () => {
245
+ // Simulate bonus state
246
+ sessionState.publicState.currentSpinType = happy_panda_config_1.SpinType.BONUS_JACKPOT;
247
+ expect(() => engine.updateBet(sessionState, types_1.GameDirection.BOTH, 2)).toThrow('Cannot change bet');
248
+ });
249
+ it('should throw when changing bet with pending bonuses', () => {
250
+ sessionState.privateState.pendingBonuses.jackpot = 1;
251
+ sessionState.publicState.hasPendingBonus = true;
252
+ expect(() => engine.updateBet(sessionState, types_1.GameDirection.BOTH, 2)).toThrow('Cannot change bet');
253
+ });
254
+ });
255
+ describe('canChangeBet', () => {
256
+ let sessionState;
257
+ beforeEach(async () => {
258
+ const initRequest = {
259
+ command: types_1.CommandType.INIT_SESSION_STATE,
260
+ sessionId: 'canchange-test',
261
+ gameDirection: types_1.GameDirection.SINGLE,
262
+ betStake: 1,
263
+ };
264
+ const result = await engine.handleCommand(initRequest);
265
+ sessionState = result.state;
266
+ });
267
+ it('should return true for paid spin with no pending bonuses', () => {
268
+ expect(engine.canChangeBet(sessionState)).toBe(true);
269
+ });
270
+ it('should return false during bonus', () => {
271
+ sessionState.publicState.currentSpinType = happy_panda_config_1.SpinType.BONUS_CHERRY;
272
+ expect(engine.canChangeBet(sessionState)).toBe(false);
273
+ });
274
+ it('should return false with pending bonuses', () => {
275
+ sessionState.publicState.hasPendingBonus = true;
276
+ expect(engine.canChangeBet(sessionState)).toBe(false);
277
+ });
278
+ });
279
+ describe('State Round-Trip', () => {
280
+ it('should preserve state through session creation and reconstruction', async () => {
281
+ const initRequest = {
282
+ command: types_1.CommandType.INIT_SESSION_STATE,
283
+ sessionId: 'roundtrip-test',
284
+ gameDirection: types_1.GameDirection.BOTH,
285
+ betStake: 3,
286
+ };
287
+ const { state: session1 } = await engine.handleCommand(initRequest);
288
+ // Spin to change state
289
+ const spinRequest = {
290
+ command: types_1.CommandType.SPIN,
291
+ sessionId: 'roundtrip-test',
292
+ };
293
+ const { state: session2 } = await engine.handleCommand(spinRequest, session1);
294
+ // Verify state preserved through operations
295
+ expect(session2.publicState.gameDirection).toBe(types_1.GameDirection.BOTH);
296
+ expect(session2.publicState.betStake).toBe(3);
297
+ expect(session2.publicState.betGame).toBe(48); // 16 * 3
298
+ expect(session2.privateState.counters).toBeDefined();
299
+ expect(session2.privateState.pendingBonuses).toBeDefined();
300
+ });
301
+ it('should maintain counter state across spins', async () => {
302
+ const initRequest = {
303
+ command: types_1.CommandType.INIT_SESSION_STATE,
304
+ sessionId: 'counter-test',
305
+ gameDirection: types_1.GameDirection.SINGLE,
306
+ betStake: 1,
307
+ };
308
+ const { state: session1 } = await engine.handleCommand(initRequest);
309
+ const initialCounters = { ...session1.privateState.counters };
310
+ const spinRequest = {
311
+ command: types_1.CommandType.SPIN,
312
+ sessionId: 'counter-test',
313
+ };
314
+ let currentState = session1;
315
+ for (let i = 0; i < 3; i++) {
316
+ const result = await engine.handleCommand(spinRequest, currentState);
317
+ currentState = result.state;
318
+ }
319
+ // Counters should still exist (may have changed based on wins)
320
+ expect(currentState.privateState.counters).toBeDefined();
321
+ expect(currentState.privateState.counters.jackpot).toBeDefined();
322
+ expect(currentState.privateState.counters.cherry).toBeDefined();
323
+ });
324
+ });
325
+ describe('Spin Response Fields', () => {
326
+ let sessionState;
327
+ beforeEach(async () => {
328
+ const initRequest = {
329
+ command: types_1.CommandType.INIT_SESSION_STATE,
330
+ sessionId: 'response-test',
331
+ gameDirection: types_1.GameDirection.SINGLE,
332
+ betStake: 1,
333
+ };
334
+ const result = await engine.handleCommand(initRequest);
335
+ sessionState = result.state;
336
+ });
337
+ it('should include all required response fields', async () => {
338
+ const spinRequest = {
339
+ command: types_1.CommandType.SPIN,
340
+ sessionId: 'response-test',
341
+ };
342
+ const { response } = await engine.handleCommand(spinRequest, sessionState);
343
+ const spinResponse = response;
344
+ expect(spinResponse).toHaveProperty('sessionId');
345
+ expect(spinResponse).toHaveProperty('grid');
346
+ expect(spinResponse).toHaveProperty('wins');
347
+ expect(spinResponse).toHaveProperty('state');
348
+ expect(spinResponse).toHaveProperty('jackpotWon');
349
+ expect(spinResponse).toHaveProperty('poolJackpotWon');
350
+ expect(spinResponse).toHaveProperty('bonusTriggered');
351
+ expect(spinResponse).toHaveProperty('isBonusComplete');
352
+ });
353
+ it('should have correct jackpot/pool types', async () => {
354
+ const spinRequest = {
355
+ command: types_1.CommandType.SPIN,
356
+ sessionId: 'response-test',
357
+ };
358
+ const { response } = await engine.handleCommand(spinRequest, sessionState);
359
+ const spinResponse = response;
360
+ expect(typeof spinResponse.jackpotWon).toBe('number');
361
+ expect(typeof spinResponse.poolJackpotWon).toBe('number');
362
+ expect(spinResponse.jackpotWon).toBeGreaterThanOrEqual(0);
363
+ expect(spinResponse.poolJackpotWon).toBeGreaterThanOrEqual(0);
364
+ });
365
+ });
366
+ });
367
+ //# sourceMappingURL=happy-panda-engine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"happy-panda-engine.test.js","sourceRoot":"","sources":["../../src/__tests__/happy-panda-engine.test.ts"],"names":[],"mappings":"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"}