@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,414 @@
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.BASE_GAME_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.bambooTriplets).toBe(1);
87
+ expect(state.privateState.counters.fireworks).toBe(1);
88
+ expect(state.privateState.counters.bambooTwins).toBeGreaterThan(0);
89
+ expect(state.privateState.counters.camera).toBeGreaterThan(0);
90
+ });
91
+ it('should include counters in public state via additionalData', async () => {
92
+ const request = {
93
+ command: types_1.CommandType.INIT_SESSION_STATE,
94
+ sessionId: 'test-session-public-counters',
95
+ gameDirection: types_1.GameDirection.SINGLE,
96
+ betStake: 1,
97
+ };
98
+ const { state } = await engine.handleCommand(request);
99
+ // Verify publicState.additionalData.counters is populated
100
+ expect(state.publicState.additionalData).toBeDefined();
101
+ expect(state.publicState.additionalData.counters).toBeDefined();
102
+ // Verify expected structure (bambooTriplets, bambooTwins, camera, fireworks)
103
+ expect(state.publicState.additionalData.counters).toHaveProperty('bambooTriplets');
104
+ expect(state.publicState.additionalData.counters).toHaveProperty('bambooTwins');
105
+ expect(state.publicState.additionalData.counters).toHaveProperty('camera');
106
+ expect(state.publicState.additionalData.counters).toHaveProperty('fireworks');
107
+ // Verify values match privateState.counters
108
+ expect(state.publicState.additionalData.counters.bambooTriplets).toBe(state.privateState.counters.bambooTriplets);
109
+ expect(state.publicState.additionalData.counters.bambooTwins).toBe(state.privateState.counters.bambooTwins);
110
+ expect(state.publicState.additionalData.counters.camera).toBe(state.privateState.counters.camera);
111
+ expect(state.publicState.additionalData.counters.fireworks).toBe(state.privateState.counters.fireworks);
112
+ });
113
+ it('should initialize empty pending bonuses', async () => {
114
+ const request = {
115
+ command: types_1.CommandType.INIT_SESSION_STATE,
116
+ sessionId: 'test-session-5',
117
+ gameDirection: types_1.GameDirection.SINGLE,
118
+ betStake: 1,
119
+ };
120
+ const { state } = await engine.handleCommand(request);
121
+ expect(state.privateState.internalPendingBonuses.bambooTriplets).toBe(0);
122
+ expect(state.privateState.internalPendingBonuses.bambooTwins).toBe(0);
123
+ expect(state.privateState.internalPendingBonuses.camera).toBe(0);
124
+ expect(state.privateState.internalPendingBonuses.fireworks).toBe(0);
125
+ expect(state.privateState.internalPendingBonuses.centerBamboo).toBe(0);
126
+ });
127
+ });
128
+ describe('SPIN Command', () => {
129
+ let sessionState;
130
+ beforeEach(async () => {
131
+ const initRequest = {
132
+ command: types_1.CommandType.INIT_SESSION_STATE,
133
+ sessionId: 'spin-test-session',
134
+ gameDirection: types_1.GameDirection.SINGLE,
135
+ betStake: 1,
136
+ };
137
+ const result = await engine.handleCommand(initRequest);
138
+ sessionState = result.state;
139
+ });
140
+ it('should execute spin and return valid response', async () => {
141
+ const spinRequest = {
142
+ command: types_1.CommandType.SPIN,
143
+ sessionId: 'spin-test-session',
144
+ };
145
+ const { response, state } = await engine.handleCommand(spinRequest, sessionState);
146
+ expect(response).toHaveProperty('screen');
147
+ expect(response).toHaveProperty('wins');
148
+ expect(state.sessionId).toBe('spin-test-session');
149
+ });
150
+ it('should generate valid 3x3 grid', async () => {
151
+ const spinRequest = {
152
+ command: types_1.CommandType.SPIN,
153
+ sessionId: 'spin-test-session',
154
+ };
155
+ const { response } = await engine.handleCommand(spinRequest, sessionState);
156
+ const spinResponse = response;
157
+ expect(spinResponse.screen).toHaveLength(3);
158
+ spinResponse.screen.forEach(reel => {
159
+ expect(reel).toHaveLength(3);
160
+ reel.forEach(symbol => {
161
+ expect(symbol).toBeGreaterThanOrEqual(-1); // Symbol.NONE = -1
162
+ });
163
+ });
164
+ });
165
+ it('should return win results', async () => {
166
+ const spinRequest = {
167
+ command: types_1.CommandType.SPIN,
168
+ sessionId: 'spin-test-session',
169
+ };
170
+ const { response } = await engine.handleCommand(spinRequest, sessionState);
171
+ const spinResponse = response;
172
+ expect(spinResponse.wins).toHaveProperty('lineWins');
173
+ expect(spinResponse.wins).toHaveProperty('totalPayout');
174
+ expect(spinResponse.wins.totalPayout).toBeGreaterThanOrEqual(0);
175
+ });
176
+ it('should throw error when no session state provided', async () => {
177
+ const spinRequest = {
178
+ command: types_1.CommandType.SPIN,
179
+ sessionId: 'no-session',
180
+ };
181
+ await expect(engine.handleCommand(spinRequest)).rejects.toThrow('No session state for SPIN command');
182
+ });
183
+ it('should update session state after spin', async () => {
184
+ const spinRequest = {
185
+ command: types_1.CommandType.SPIN,
186
+ sessionId: 'spin-test-session',
187
+ };
188
+ const { state: newState } = await engine.handleCommand(spinRequest, sessionState);
189
+ // State should be updated with new grid
190
+ expect(newState.publicState.screen).toBeDefined();
191
+ expect(newState.updatedAt).toBeDefined();
192
+ });
193
+ it('should handle multiple consecutive spins', async () => {
194
+ const spinRequest = {
195
+ command: types_1.CommandType.SPIN,
196
+ sessionId: 'spin-test-session',
197
+ };
198
+ let currentState = sessionState;
199
+ for (let i = 0; i < 5; i++) {
200
+ const result = await engine.handleCommand(spinRequest, currentState);
201
+ currentState = result.state;
202
+ expect(currentState.publicState.screen).toBeDefined();
203
+ }
204
+ });
205
+ });
206
+ describe('GET_SYMBOLS Command', () => {
207
+ it('should return symbol definitions', async () => {
208
+ const request = {
209
+ command: types_1.CommandType.GET_SYMBOLS,
210
+ sessionId: 'symbols-test',
211
+ };
212
+ const { response } = await engine.handleCommand(request);
213
+ const symbolsResponse = response;
214
+ expect(symbolsResponse.symbols).toBeDefined();
215
+ expect(Array.isArray(symbolsResponse.symbols)).toBe(true);
216
+ expect(symbolsResponse.symbols.length).toBeGreaterThan(0);
217
+ // Check some known symbols exist
218
+ const symbolNames = symbolsResponse.symbols.map(s => s.name);
219
+ expect(symbolNames).toContain('BAMBOO');
220
+ expect(symbolNames).toContain('RED_PANDA');
221
+ expect(symbolNames).toContain('SLOT_MACHINE');
222
+ });
223
+ it('should work without existing session state', async () => {
224
+ const request = {
225
+ command: types_1.CommandType.GET_SYMBOLS,
226
+ sessionId: 'no-session',
227
+ };
228
+ const { response, state } = await engine.handleCommand(request);
229
+ expect(response).toBeDefined();
230
+ expect(state).toBeDefined();
231
+ });
232
+ });
233
+ describe('Unknown Command', () => {
234
+ it('should throw for invalid command type', async () => {
235
+ const request = {
236
+ command: 'INVALID_COMMAND',
237
+ sessionId: 'test',
238
+ }; // Force invalid command through type system
239
+ await expect(engine.handleCommand(request)).rejects.toThrow('Unknown command');
240
+ });
241
+ });
242
+ describe('updateBet', () => {
243
+ let sessionState;
244
+ beforeEach(async () => {
245
+ const initRequest = {
246
+ command: types_1.CommandType.INIT_SESSION_STATE,
247
+ sessionId: 'bet-test-session',
248
+ gameDirection: types_1.GameDirection.SINGLE,
249
+ betStake: 1,
250
+ };
251
+ const result = await engine.handleCommand(initRequest);
252
+ sessionState = result.state;
253
+ });
254
+ it('should update bet correctly', () => {
255
+ const newState = engine.updateBet(sessionState, types_1.GameDirection.BOTH, 5);
256
+ expect(newState.publicState.gameDirection).toBe(types_1.GameDirection.BOTH);
257
+ expect(newState.publicState.betStake).toBe(5);
258
+ expect(newState.publicState.betGame).toBe(80); // 16 * 5
259
+ });
260
+ it('should preserve session ID', () => {
261
+ const newState = engine.updateBet(sessionState, types_1.GameDirection.BOTH, 3);
262
+ expect(newState.sessionId).toBe('bet-test-session');
263
+ });
264
+ it('should throw when changing bet during bonus', () => {
265
+ // Simulate bonus state
266
+ sessionState.publicState.currentSpinType = happy_panda_config_1.SpinType.BONUS_BAMBOO_TRIPLETS;
267
+ expect(() => engine.updateBet(sessionState, types_1.GameDirection.BOTH, 2)).toThrow('Cannot change bet');
268
+ });
269
+ it('should throw when changing bet with pending bonuses', () => {
270
+ sessionState.privateState.internalPendingBonuses.bambooTriplets = 1;
271
+ sessionState.publicState.hasPendingBonus = true;
272
+ expect(() => engine.updateBet(sessionState, types_1.GameDirection.BOTH, 2)).toThrow('Cannot change bet');
273
+ });
274
+ });
275
+ describe('canChangeBet', () => {
276
+ let sessionState;
277
+ beforeEach(async () => {
278
+ const initRequest = {
279
+ command: types_1.CommandType.INIT_SESSION_STATE,
280
+ sessionId: 'canchange-test',
281
+ gameDirection: types_1.GameDirection.SINGLE,
282
+ betStake: 1,
283
+ };
284
+ const result = await engine.handleCommand(initRequest);
285
+ sessionState = result.state;
286
+ });
287
+ it('should return true for paid spin with no pending bonuses', () => {
288
+ expect(engine.canChangeBet(sessionState)).toBe(true);
289
+ });
290
+ it('should return false during bonus', () => {
291
+ sessionState.publicState.currentSpinType = happy_panda_config_1.SpinType.BONUS_BAMBOO_TWINS;
292
+ expect(engine.canChangeBet(sessionState)).toBe(false);
293
+ });
294
+ it('should return false with pending bonuses', () => {
295
+ sessionState.publicState.hasPendingBonus = true;
296
+ expect(engine.canChangeBet(sessionState)).toBe(false);
297
+ });
298
+ });
299
+ describe('State Round-Trip', () => {
300
+ it('should preserve state through session creation and reconstruction', async () => {
301
+ const initRequest = {
302
+ command: types_1.CommandType.INIT_SESSION_STATE,
303
+ sessionId: 'roundtrip-test',
304
+ gameDirection: types_1.GameDirection.BOTH,
305
+ betStake: 3,
306
+ };
307
+ const { state: session1 } = await engine.handleCommand(initRequest);
308
+ // Spin to change state
309
+ const spinRequest = {
310
+ command: types_1.CommandType.SPIN,
311
+ sessionId: 'roundtrip-test',
312
+ };
313
+ const { state: session2 } = await engine.handleCommand(spinRequest, session1);
314
+ // Verify state preserved through operations
315
+ expect(session2.publicState.gameDirection).toBe(types_1.GameDirection.BOTH);
316
+ expect(session2.publicState.betStake).toBe(3);
317
+ expect(session2.publicState.betGame).toBe(48); // 16 * 3
318
+ expect(session2.privateState.counters).toBeDefined();
319
+ expect(session2.privateState.pendingBonuses).toBeDefined();
320
+ });
321
+ it('should maintain counter state across spins', async () => {
322
+ const initRequest = {
323
+ command: types_1.CommandType.INIT_SESSION_STATE,
324
+ sessionId: 'counter-test',
325
+ gameDirection: types_1.GameDirection.SINGLE,
326
+ betStake: 1,
327
+ };
328
+ const { state: session1 } = await engine.handleCommand(initRequest);
329
+ const initialCounters = { ...session1.privateState.counters };
330
+ const spinRequest = {
331
+ command: types_1.CommandType.SPIN,
332
+ sessionId: 'counter-test',
333
+ };
334
+ let currentState = session1;
335
+ for (let i = 0; i < 3; i++) {
336
+ const result = await engine.handleCommand(spinRequest, currentState);
337
+ currentState = result.state;
338
+ }
339
+ // Counters should still exist (may have changed based on wins)
340
+ expect(currentState.privateState.counters).toBeDefined();
341
+ expect(currentState.privateState.counters.bambooTriplets).toBeDefined();
342
+ expect(currentState.privateState.counters.bambooTwins).toBeDefined();
343
+ });
344
+ it('should keep publicState.additionalData.counters in sync with privateState.counters after spins', async () => {
345
+ const initRequest = {
346
+ command: types_1.CommandType.INIT_SESSION_STATE,
347
+ sessionId: 'counter-sync-test',
348
+ gameDirection: types_1.GameDirection.SINGLE,
349
+ betStake: 1,
350
+ };
351
+ const { state: session1 } = await engine.handleCommand(initRequest);
352
+ // Verify initial sync
353
+ expect(session1.publicState.additionalData.counters.bambooTriplets).toBe(session1.privateState.counters.bambooTriplets);
354
+ expect(session1.publicState.additionalData.counters.bambooTwins).toBe(session1.privateState.counters.bambooTwins);
355
+ expect(session1.publicState.additionalData.counters.camera).toBe(session1.privateState.counters.camera);
356
+ expect(session1.publicState.additionalData.counters.fireworks).toBe(session1.privateState.counters.fireworks);
357
+ const spinRequest = {
358
+ command: types_1.CommandType.SPIN,
359
+ sessionId: 'counter-sync-test',
360
+ };
361
+ let currentState = session1;
362
+ for (let i = 0; i < 5; i++) {
363
+ const result = await engine.handleCommand(spinRequest, currentState);
364
+ currentState = result.state;
365
+ // After each spin, public and private counters should remain in sync
366
+ expect(currentState.publicState.additionalData.counters.bambooTriplets).toBe(currentState.privateState.counters.bambooTriplets);
367
+ expect(currentState.publicState.additionalData.counters.bambooTwins).toBe(currentState.privateState.counters.bambooTwins);
368
+ expect(currentState.publicState.additionalData.counters.camera).toBe(currentState.privateState.counters.camera);
369
+ expect(currentState.publicState.additionalData.counters.fireworks).toBe(currentState.privateState.counters.fireworks);
370
+ }
371
+ });
372
+ });
373
+ describe('Spin Response Fields', () => {
374
+ let sessionState;
375
+ beforeEach(async () => {
376
+ const initRequest = {
377
+ command: types_1.CommandType.INIT_SESSION_STATE,
378
+ sessionId: 'response-test',
379
+ gameDirection: types_1.GameDirection.SINGLE,
380
+ betStake: 1,
381
+ };
382
+ const result = await engine.handleCommand(initRequest);
383
+ sessionState = result.state;
384
+ });
385
+ it('should include all required response fields', async () => {
386
+ const spinRequest = {
387
+ command: types_1.CommandType.SPIN,
388
+ sessionId: 'response-test',
389
+ };
390
+ const { response } = await engine.handleCommand(spinRequest, sessionState);
391
+ const spinResponse = response;
392
+ expect(spinResponse).toHaveProperty('spinType');
393
+ expect(spinResponse).toHaveProperty('screen');
394
+ expect(spinResponse).toHaveProperty('wins');
395
+ expect(spinResponse).toHaveProperty('jackpotWon');
396
+ expect(spinResponse).toHaveProperty('poolJackpotWon');
397
+ expect(spinResponse).toHaveProperty('isBonusComplete');
398
+ expect(spinResponse).toHaveProperty('nextSpinType');
399
+ });
400
+ it('should have correct jackpot/pool types', async () => {
401
+ const spinRequest = {
402
+ command: types_1.CommandType.SPIN,
403
+ sessionId: 'response-test',
404
+ };
405
+ const { response } = await engine.handleCommand(spinRequest, sessionState);
406
+ const spinResponse = response;
407
+ expect(typeof spinResponse.jackpotWon).toBe('number');
408
+ expect(typeof spinResponse.poolJackpotWon).toBe('number');
409
+ expect(spinResponse.jackpotWon).toBeGreaterThanOrEqual(0);
410
+ expect(spinResponse.poolJackpotWon).toBeGreaterThanOrEqual(0);
411
+ });
412
+ });
413
+ });
414
+ //# 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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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Jackpot Manager Tests
3
+ *
4
+ * Tests for progressive and pool jackpot logic.
5
+ * CRITICAL: This is where money comes/goes - must have high coverage.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=jackpot-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jackpot-manager.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/jackpot-manager.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}