@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,418 @@
1
+ "use strict";
2
+ /**
3
+ * GDD Validation Test - 1000 Paid Spins
4
+ *
5
+ * Validates that after the Symbol/ScreenWinType rename, all responses
6
+ * still match GDD expectations:
7
+ * - Response shapes match SpinResponse interface
8
+ * - All symbols are from the renamed GDD enum
9
+ * - Bonus triggers use correct GDD SpinType strings
10
+ * - Win evaluations are structurally correct
11
+ * - State transitions are valid
12
+ * - RTP is within a plausible range for 1000 spins
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const happy_panda_engine_1 = require("../engine/happy-panda-engine");
16
+ const happy_panda_config_1 = require("../config/happy-panda.config");
17
+ const types_1 = require("../domain/types");
18
+ // =============================================================================
19
+ // TEST RNG
20
+ // =============================================================================
21
+ function createTestRng(seed = 42) {
22
+ let state = seed;
23
+ function nextInt() {
24
+ state = (state * 1664525 + 1013904223) >>> 0;
25
+ return state;
26
+ }
27
+ return {
28
+ async random(max) {
29
+ return nextInt() % max;
30
+ },
31
+ async randomBatch(count, max) {
32
+ return Array.from({ length: count }, () => nextInt() % max);
33
+ },
34
+ };
35
+ }
36
+ // =============================================================================
37
+ // VALID VALUE SETS
38
+ // =============================================================================
39
+ /** All valid base game symbols (appear on reels) */
40
+ const VALID_BASE_SYMBOLS = new Set([
41
+ happy_panda_config_1.Symbol.GOLDEN_PANDA, happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.SLOT_MACHINE,
42
+ happy_panda_config_1.Symbol.CITY, happy_panda_config_1.Symbol.FIREWORKS_ROCKETS, happy_panda_config_1.Symbol.BACKPACK,
43
+ happy_panda_config_1.Symbol.CAMERA, happy_panda_config_1.Symbol.FOOD_BOWL, happy_panda_config_1.Symbol.CUP,
44
+ happy_panda_config_1.Symbol.BAMBOO, happy_panda_config_1.Symbol.GOLDEN_BAMBOO,
45
+ ]);
46
+ /** Panda piece symbols (appear during BONUS_BAMBOO_TRIPLETS) */
47
+ const PANDA_PIECE_SYMBOLS = new Set([
48
+ happy_panda_config_1.Symbol.PANDA_PIECE_00, happy_panda_config_1.Symbol.PANDA_PIECE_01, happy_panda_config_1.Symbol.PANDA_PIECE_02,
49
+ happy_panda_config_1.Symbol.PANDA_PIECE_10, happy_panda_config_1.Symbol.PANDA_PIECE_11, happy_panda_config_1.Symbol.PANDA_PIECE_12,
50
+ happy_panda_config_1.Symbol.PANDA_PIECE_20, happy_panda_config_1.Symbol.PANDA_PIECE_21, happy_panda_config_1.Symbol.PANDA_PIECE_22,
51
+ ]);
52
+ /** Badge symbols (appear during bonus spins) */
53
+ const BADGE_SYMBOLS = new Set([
54
+ happy_panda_config_1.Symbol.BADGE_YELLOW, happy_panda_config_1.Symbol.BADGE_RED, happy_panda_config_1.Symbol.BADGE_GREEN, happy_panda_config_1.Symbol.BADGE_BLUE,
55
+ ]);
56
+ /** All symbols that can appear on any grid */
57
+ const ALL_VALID_SYMBOLS = new Set([
58
+ ...VALID_BASE_SYMBOLS, ...PANDA_PIECE_SYMBOLS, ...BADGE_SYMBOLS,
59
+ happy_panda_config_1.Symbol.HAT, happy_panda_config_1.Symbol.BAR_MIX,
60
+ ]);
61
+ /** Valid SpinType values */
62
+ const VALID_SPIN_TYPES = new Set([
63
+ happy_panda_config_1.SpinType.BASE_GAME_SPIN,
64
+ happy_panda_config_1.SpinType.BONUS_BAMBOO_TRIPLETS,
65
+ happy_panda_config_1.SpinType.BONUS_BAMBOO_TWINS,
66
+ happy_panda_config_1.SpinType.BONUS_CAMERA,
67
+ happy_panda_config_1.SpinType.BONUS_FIREWORKS,
68
+ happy_panda_config_1.SpinType.RESPIN_CENTER_BAMBOO,
69
+ ]);
70
+ /** Valid bonus trigger strings (SpinType enum values) */
71
+ const VALID_BONUS_TRIGGERS = new Set([
72
+ 'BONUS_BAMBOO_TRIPLETS',
73
+ 'BONUS_BAMBOO_TWINS',
74
+ 'BONUS_CAMERA',
75
+ 'BONUS_FIREWORKS',
76
+ 'RESPIN_CENTER_BAMBOO',
77
+ ]);
78
+ // =============================================================================
79
+ // 1000-SPIN VALIDATION
80
+ // =============================================================================
81
+ describe('GDD Validation - 1000 Paid Spins', () => {
82
+ const NUM_PAID_SPINS = 1000;
83
+ for (const { label, direction } of [
84
+ { label: '8-line (SINGLE)', direction: types_1.GameDirection.SINGLE },
85
+ { label: '16-line (BOTH)', direction: types_1.GameDirection.BOTH },
86
+ ]) {
87
+ describe(`${label} mode`, () => {
88
+ let engine;
89
+ let responses;
90
+ let publicStates;
91
+ let spinTypes;
92
+ let totalSpins;
93
+ let totalBonusSpins;
94
+ let totalWagered;
95
+ let totalWon;
96
+ let bonusTriggers;
97
+ let symbolCounts;
98
+ let lineWinSymbols;
99
+ let wallWinTypes;
100
+ let scatterWinSymbols;
101
+ let specialWinTypes;
102
+ beforeAll(async () => {
103
+ const rng = createTestRng(direction === types_1.GameDirection.SINGLE ? 42 : 99);
104
+ engine = new happy_panda_engine_1.HappyPandaEngine(rng);
105
+ const initReq = {
106
+ command: types_1.CommandType.INIT_SESSION_STATE,
107
+ sessionId: `gdd-val-${direction}`,
108
+ gameDirection: direction,
109
+ betStake: 1,
110
+ };
111
+ let { state } = await engine.handleCommand(initReq);
112
+ const betGame = state.publicState.betGame;
113
+ responses = [];
114
+ publicStates = [];
115
+ spinTypes = [];
116
+ totalSpins = 0;
117
+ totalBonusSpins = 0;
118
+ totalWagered = 0;
119
+ totalWon = 0;
120
+ bonusTriggers = new Map();
121
+ symbolCounts = new Map();
122
+ lineWinSymbols = new Set();
123
+ wallWinTypes = new Set();
124
+ scatterWinSymbols = new Set();
125
+ specialWinTypes = new Set();
126
+ let paidSpins = 0;
127
+ const spinReq = {
128
+ command: types_1.CommandType.SPIN,
129
+ sessionId: initReq.sessionId,
130
+ };
131
+ while (paidSpins < NUM_PAID_SPINS) {
132
+ const isPaid = state.publicState.currentSpinType === happy_panda_config_1.SpinType.BASE_GAME_SPIN;
133
+ if (isPaid) {
134
+ totalWagered += betGame;
135
+ paidSpins++;
136
+ }
137
+ else {
138
+ totalBonusSpins++;
139
+ }
140
+ spinTypes.push(state.publicState.currentSpinType);
141
+ totalSpins++;
142
+ const result = await engine.handleCommand(spinReq, state);
143
+ state = result.state;
144
+ const resp = result.response;
145
+ responses.push(resp);
146
+ publicStates.push(state.publicState);
147
+ // Track wins
148
+ totalWon += resp.wins.totalPayout + resp.jackpotWon + resp.poolJackpotWon;
149
+ // Track bonus triggers
150
+ if (resp.triggeredBonus) {
151
+ const key = resp.triggeredBonus.bonusType;
152
+ bonusTriggers.set(key, (bonusTriggers.get(key) || 0) + 1);
153
+ }
154
+ // Track symbols on screen
155
+ for (const reel of resp.screen) {
156
+ for (const sym of reel) {
157
+ symbolCounts.set(sym, (symbolCounts.get(sym) || 0) + 1);
158
+ }
159
+ }
160
+ // Track win types
161
+ for (const lw of resp.wins.lineWins) {
162
+ lineWinSymbols.add(lw.symbol);
163
+ }
164
+ if (resp.wins.wallWin) {
165
+ wallWinTypes.add(resp.wins.wallWin.wallType);
166
+ }
167
+ for (const sw of resp.wins.scatterWins) {
168
+ scatterWinSymbols.add(sw.symbol);
169
+ }
170
+ for (const spw of resp.wins.specialWins) {
171
+ specialWinTypes.add(spw.winType);
172
+ }
173
+ }
174
+ }, 60000);
175
+ // ---------------------------------------------------------------
176
+ // RESPONSE SHAPE VALIDATION
177
+ // ---------------------------------------------------------------
178
+ it('every response has valid SpinResponse shape', () => {
179
+ for (let i = 0; i < responses.length; i++) {
180
+ const r = responses[i];
181
+ // Required fields exist
182
+ expect(typeof r.spinType).toBe('string');
183
+ expect(VALID_SPIN_TYPES.has(r.spinType)).toBe(true);
184
+ expect(r.screen).toBeDefined();
185
+ expect(r.wins).toBeDefined();
186
+ expect(typeof r.jackpotWon).toBe('number');
187
+ expect(typeof r.poolJackpotWon).toBe('number');
188
+ expect(typeof r.isBonusComplete).toBe('boolean');
189
+ expect(typeof r.playerWinning).toBe('number');
190
+ expect(typeof r.nextSpinType).toBe('string');
191
+ expect(VALID_SPIN_TYPES.has(r.nextSpinType)).toBe(true);
192
+ // triggeredBonus shape (if present)
193
+ if (r.triggeredBonus) {
194
+ expect(typeof r.triggeredBonus.bonusId).toBe('string');
195
+ expect(typeof r.triggeredBonus.bonusType).toBe('string');
196
+ expect(typeof r.triggeredBonus.betAmount).toBe('number');
197
+ expect(VALID_BONUS_TRIGGERS.has(r.triggeredBonus.bonusType)).toBe(true);
198
+ }
199
+ }
200
+ });
201
+ // ---------------------------------------------------------------
202
+ // GRID VALIDATION
203
+ // ---------------------------------------------------------------
204
+ it('every screen is a valid 3x3 grid with GDD symbols', () => {
205
+ for (let i = 0; i < responses.length; i++) {
206
+ const grid = responses[i].screen;
207
+ expect(grid.length).toBe(3);
208
+ for (let reel = 0; reel < 3; reel++) {
209
+ expect(grid[reel].length).toBe(3);
210
+ for (let row = 0; row < 3; row++) {
211
+ const sym = grid[reel][row];
212
+ expect(ALL_VALID_SYMBOLS.has(sym)).toBe(true);
213
+ }
214
+ }
215
+ }
216
+ });
217
+ // ---------------------------------------------------------------
218
+ // PUBLIC STATE VALIDATION
219
+ // ---------------------------------------------------------------
220
+ it('every PublicState has valid GDD field values', () => {
221
+ for (let i = 0; i < publicStates.length; i++) {
222
+ const s = publicStates[i];
223
+ // gameDirection
224
+ expect([types_1.GameDirection.SINGLE, types_1.GameDirection.BOTH]).toContain(s.gameDirection);
225
+ expect(s.gameDirection).toBe(direction);
226
+ // betStake / betGame
227
+ expect(s.betStake).toBe(1);
228
+ const expectedBetGame = direction === types_1.GameDirection.SINGLE ? 8 : 16;
229
+ expect(s.betGame).toBe(expectedBetGame);
230
+ // currentSpinType uses GDD names
231
+ expect(VALID_SPIN_TYPES.has(s.currentSpinType)).toBe(true);
232
+ // spinsRemaining is non-negative
233
+ expect(s.spinsRemaining).toBeGreaterThanOrEqual(0);
234
+ // screen is 3x3
235
+ expect(s.screen.length).toBe(3);
236
+ // jackpot values are non-negative
237
+ expect(s.bonusJackpotValue).toBeGreaterThanOrEqual(0);
238
+ expect(s.poolJackpotValue).toBeGreaterThanOrEqual(0);
239
+ // hasPendingBonus is boolean
240
+ expect(typeof s.hasPendingBonus).toBe('boolean');
241
+ }
242
+ });
243
+ // ---------------------------------------------------------------
244
+ // WIN STRUCTURE VALIDATION
245
+ // ---------------------------------------------------------------
246
+ it('line wins have valid structure and GDD symbol names', () => {
247
+ for (const r of responses) {
248
+ for (const lw of r.wins.lineWins) {
249
+ // lineIndex valid range
250
+ const maxLines = direction === types_1.GameDirection.SINGLE ? 8 : 16;
251
+ expect(lw.lineIndex).toBeGreaterThanOrEqual(0);
252
+ expect(lw.lineIndex).toBeLessThan(maxLines);
253
+ // symbol is a valid enum value
254
+ expect(ALL_VALID_SYMBOLS.has(lw.symbol)).toBe(true);
255
+ // matchLength 1-3
256
+ expect(lw.matchLength).toBeGreaterThanOrEqual(1);
257
+ expect(lw.matchLength).toBeLessThanOrEqual(3);
258
+ // payout non-negative
259
+ expect(lw.payout).toBeGreaterThanOrEqual(0);
260
+ // positions array
261
+ expect(Array.isArray(lw.positions)).toBe(true);
262
+ expect(lw.positions.length).toBe(lw.matchLength);
263
+ for (const pos of lw.positions) {
264
+ expect(pos.reel).toBeGreaterThanOrEqual(0);
265
+ expect(pos.reel).toBeLessThanOrEqual(2);
266
+ expect(pos.row).toBeGreaterThanOrEqual(0);
267
+ expect(pos.row).toBeLessThanOrEqual(2);
268
+ }
269
+ }
270
+ }
271
+ });
272
+ it('scatter wins use GDD PANDA symbols', () => {
273
+ let scatterCount = 0;
274
+ for (const r of responses) {
275
+ for (const sw of r.wins.scatterWins) {
276
+ scatterCount++;
277
+ // Scatter symbols must be RED_PANDA or GOLDEN_PANDA
278
+ expect([happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.GOLDEN_PANDA]).toContain(sw.symbol);
279
+ expect(sw.count).toBeGreaterThanOrEqual(2);
280
+ expect(sw.payout).toBeGreaterThanOrEqual(0);
281
+ expect(Array.isArray(sw.positions)).toBe(true);
282
+ expect(typeof sw.isSuperSevenOnly).toBe('boolean');
283
+ }
284
+ }
285
+ console.log(` ${label}: ${scatterCount} scatter wins in ${totalSpins} total spins`);
286
+ });
287
+ it('wall wins use valid GDD ScreenWinType', () => {
288
+ let wallCount = 0;
289
+ for (const r of responses) {
290
+ if (r.wins.wallWin) {
291
+ wallCount++;
292
+ const ww = r.wins.wallWin;
293
+ // wallType must be a valid ScreenWinType enum value
294
+ expect(Object.values(happy_panda_config_1.ScreenWinType)).toContain(ww.wallType);
295
+ expect(ww.payout).toBeGreaterThanOrEqual(0);
296
+ expect(ww.positions.length).toBe(9); // 3x3 full screen
297
+ }
298
+ }
299
+ console.log(` ${label}: ${wallCount} wall wins in ${totalSpins} total spins`);
300
+ });
301
+ it('special wins use valid GDD ScreenWinType', () => {
302
+ let specialCount = 0;
303
+ for (const r of responses) {
304
+ for (const spw of r.wins.specialWins) {
305
+ specialCount++;
306
+ expect(Object.values(happy_panda_config_1.ScreenWinType)).toContain(spw.winType);
307
+ expect(spw.payout).toBeGreaterThanOrEqual(0);
308
+ expect(Array.isArray(spw.positions)).toBe(true);
309
+ }
310
+ }
311
+ console.log(` ${label}: ${specialCount} special wins in ${totalSpins} total spins`);
312
+ });
313
+ // ---------------------------------------------------------------
314
+ // PAYOUT CONSISTENCY
315
+ // ---------------------------------------------------------------
316
+ it('totalPayout matches sum of individual wins', () => {
317
+ for (let i = 0; i < responses.length; i++) {
318
+ const r = responses[i];
319
+ const lineSum = r.wins.lineWins.reduce((s, w) => s + w.payout, 0);
320
+ const scatterSum = r.wins.scatterWins.reduce((s, w) => s + w.payout, 0);
321
+ const wallSum = r.wins.wallWin ? r.wins.wallWin.payout : 0;
322
+ const specialSum = r.wins.specialWins.reduce((s, w) => s + w.payout, 0);
323
+ const expected = lineSum + scatterSum + wallSum + specialSum;
324
+ expect(r.wins.totalPayout).toBe(expected);
325
+ }
326
+ });
327
+ it('playerWinning = totalPayout + jackpotWon + poolJackpotWon', () => {
328
+ for (const r of responses) {
329
+ expect(r.playerWinning).toBe(r.wins.totalPayout + r.jackpotWon + r.poolJackpotWon);
330
+ }
331
+ });
332
+ // ---------------------------------------------------------------
333
+ // BONUS TRIGGER VALIDATION
334
+ // ---------------------------------------------------------------
335
+ it('bonus triggers use GDD SpinType names only', () => {
336
+ for (const [trigger] of bonusTriggers) {
337
+ expect(VALID_BONUS_TRIGGERS.has(trigger)).toBe(true);
338
+ }
339
+ });
340
+ it('triggeredBonus has valid bonusType when present', () => {
341
+ for (const r of responses) {
342
+ if (r.triggeredBonus) {
343
+ expect(VALID_BONUS_TRIGGERS.has(r.triggeredBonus.bonusType)).toBe(true);
344
+ }
345
+ }
346
+ });
347
+ // ---------------------------------------------------------------
348
+ // STATE TRANSITIONS
349
+ // ---------------------------------------------------------------
350
+ it('no old symbol names appear in any response', () => {
351
+ // Verify none of the old numeric IDs map to wrong names
352
+ // by checking Symbol enum doesn't have old keys
353
+ const symbolKeys = Object.keys(happy_panda_config_1.Symbol).filter(k => isNaN(Number(k)));
354
+ const oldNames = [
355
+ 'CHERRY', 'SUPER_CHERRY', 'SEVEN', 'SUPER_SEVEN',
356
+ 'BAR1', 'BAR2', 'BAR3', 'MELON', 'BELL', 'PRUNE', 'ORANGE',
357
+ 'SUPER_BAR', 'BAR_ANY', 'COLOR_YELLOW', 'COLOR_RED',
358
+ 'COLOR_GREEN', 'COLOR_BLUE',
359
+ ];
360
+ for (const old of oldNames) {
361
+ expect(symbolKeys).not.toContain(old);
362
+ }
363
+ // Verify ScreenWinType enum doesn't have old keys
364
+ const screenKeys = Object.keys(happy_panda_config_1.ScreenWinType).filter(k => isNaN(Number(k)));
365
+ const oldScreenNames = [
366
+ 'SCREEN_CHERRY', 'SCREEN_SEVEN', 'SCREEN_SUPER_SEVEN',
367
+ 'SCREEN_BAR3', 'SCREEN_BAR2', 'SCREEN_BAR1',
368
+ 'SCREEN_MELON', 'SCREEN_BELL', 'SCREEN_PRUNE', 'SCREEN_ORANGE',
369
+ 'SCREEN_SUPER_BAR', 'SCREEN_BAR_ANY', 'SCREEN_FRUIT_ANY',
370
+ 'SCREEN_CHERRY_PIECES', 'SCREEN_BELL_SCATTER',
371
+ 'SCREEN_SUPER_BAR_SCATTER',
372
+ ];
373
+ for (const old of oldScreenNames) {
374
+ expect(screenKeys).not.toContain(old);
375
+ }
376
+ });
377
+ // ---------------------------------------------------------------
378
+ // STATISTICS & RTP
379
+ // ---------------------------------------------------------------
380
+ it('produces wins and bonus spins', () => {
381
+ expect(totalWon).toBeGreaterThan(0);
382
+ // At least some bonus activity in 1000 spins
383
+ const totalBonusTriggers = Array.from(bonusTriggers.values()).reduce((s, v) => s + v, 0);
384
+ expect(totalBonusTriggers).toBeGreaterThan(0);
385
+ });
386
+ it('RTP is within plausible range (50%-150% for 1000 spins)', () => {
387
+ const rtp = (totalWon / totalWagered) * 100;
388
+ // 1000 spins has high variance, so wide range
389
+ expect(rtp).toBeGreaterThan(50);
390
+ expect(rtp).toBeLessThan(150);
391
+ });
392
+ it('logs summary statistics', () => {
393
+ const rtp = (totalWon / totalWagered) * 100;
394
+ const totalBonusTriggerCount = Array.from(bonusTriggers.values()).reduce((s, v) => s + v, 0);
395
+ console.log(`\n === ${label} - 1000 Paid Spin Summary ===`);
396
+ console.log(` Total spins (paid+bonus): ${totalSpins}`);
397
+ console.log(` Paid spins: ${NUM_PAID_SPINS}`);
398
+ console.log(` Bonus spins: ${totalBonusSpins}`);
399
+ console.log(` Total wagered: ${totalWagered}`);
400
+ console.log(` Total won: ${totalWon}`);
401
+ console.log(` RTP: ${rtp.toFixed(2)}%`);
402
+ console.log(` Bonus triggers (${totalBonusTriggerCount} total):`);
403
+ for (const [type, count] of bonusTriggers) {
404
+ console.log(` ${type}: ${count}`);
405
+ }
406
+ console.log(` Unique symbols on screen: ${symbolCounts.size}`);
407
+ console.log(` Symbol distribution (top 11):`);
408
+ const sorted = [...symbolCounts.entries()].sort((a, b) => b[1] - a[1]);
409
+ for (const [sym, count] of sorted.slice(0, 11)) {
410
+ const name = happy_panda_config_1.Symbol[sym] || `?${sym}`;
411
+ const pct = ((count / (totalSpins * 9)) * 100).toFixed(1);
412
+ console.log(` ${name} (${sym}): ${count} (${pct}%)`);
413
+ }
414
+ });
415
+ });
416
+ }
417
+ });
418
+ //# sourceMappingURL=gdd-validation-1000.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gdd-validation-1000.test.js","sourceRoot":"","sources":["../../src/__tests__/gdd-validation-1000.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Happy Panda Engine Tests
3
+ *
4
+ * Integration tests for the engine class - the public API.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=happy-panda-engine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"happy-panda-engine.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/happy-panda-engine.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}