@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,359 @@
1
+ "use strict";
2
+ /**
3
+ * DEBUG_TRIGGER_BONUS Command Tests (GLI-19 compliant)
4
+ *
5
+ * Tests for the debug command that allows triggering bonus rounds for dev/testing.
6
+ * This command is used by dev-tools to test bonus flows without waiting for natural triggers.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const happy_panda_v1_game_engine_1 = require("../happy-panda-v1.game-engine");
10
+ const happy_panda_config_1 = require("../config/happy-panda.config");
11
+ const types_1 = require("../domain/types");
12
+ describe('DEBUG_TRIGGER_BONUS Command', () => {
13
+ let engine;
14
+ beforeEach(() => {
15
+ engine = new happy_panda_v1_game_engine_1.HappyPandaV1GameEngine();
16
+ });
17
+ /**
18
+ * Helper function to initialize a session and return the states
19
+ */
20
+ async function initializeSession(sessionId = 'test-session') {
21
+ const initCommand = {
22
+ id: sessionId,
23
+ type: 'INIT_SESSION_STATE',
24
+ payload: {
25
+ gameDirection: types_1.GameDirection.SINGLE,
26
+ betStake: 1,
27
+ },
28
+ };
29
+ const result = await engine.processCommand(null, null, initCommand);
30
+ expect(result.success).toBe(true);
31
+ return {
32
+ publicState: result.publicState,
33
+ privateState: result.privateState,
34
+ };
35
+ }
36
+ describe('BONUS_BAMBOO_TRIPLETS', () => {
37
+ it('should trigger BONUS_BAMBOO_TRIPLETS successfully', async () => {
38
+ const { publicState, privateState } = await initializeSession('jackpot-test');
39
+ const debugCommand = {
40
+ id: 'debug-jackpot-1',
41
+ type: 'DEBUG_TRIGGER_BONUS',
42
+ payload: {
43
+ sessionId: 'jackpot-test',
44
+ bonusType: 'BONUS_BAMBOO_TRIPLETS',
45
+ betAmount: 8,
46
+ },
47
+ };
48
+ const result = await engine.processCommand(publicState, privateState, debugCommand);
49
+ expect(result.success).toBe(true);
50
+ expect(result.message).toBe('Bonus triggered via debug command');
51
+ expect(result.publicState.hasPendingBonus).toBe(true);
52
+ expect(result.privateState.nextSpinType).toBe(happy_panda_config_1.SpinType.BONUS_BAMBOO_TRIPLETS);
53
+ expect(result.privateState.internalPendingBonuses.bambooTriplets).toBe(privateState.internalPendingBonuses.bambooTriplets + 1);
54
+ expect(result.outcome).toBeDefined();
55
+ expect(result.outcome.triggeredBonus.bonusType).toBe('BONUS_BAMBOO_TRIPLETS');
56
+ });
57
+ });
58
+ describe('BONUS_BAMBOO_TWINS', () => {
59
+ it('should trigger BONUS_BAMBOO_TWINS successfully', async () => {
60
+ const { publicState, privateState } = await initializeSession('cherry-test');
61
+ const debugCommand = {
62
+ id: 'debug-cherry-1',
63
+ type: 'DEBUG_TRIGGER_BONUS',
64
+ payload: {
65
+ sessionId: 'cherry-test',
66
+ bonusType: 'BONUS_BAMBOO_TWINS',
67
+ betAmount: 8,
68
+ },
69
+ };
70
+ const result = await engine.processCommand(publicState, privateState, debugCommand);
71
+ expect(result.success).toBe(true);
72
+ expect(result.message).toBe('Bonus triggered via debug command');
73
+ expect(result.publicState.hasPendingBonus).toBe(true);
74
+ expect(result.privateState.nextSpinType).toBe(happy_panda_config_1.SpinType.BONUS_BAMBOO_TWINS);
75
+ expect(result.privateState.internalPendingBonuses.bambooTwins).toBe(privateState.internalPendingBonuses.bambooTwins + 1);
76
+ expect(result.outcome).toBeDefined();
77
+ expect(result.outcome.triggeredBonus.bonusType).toBe('BONUS_BAMBOO_TWINS');
78
+ });
79
+ });
80
+ describe('BONUS_CAMERA', () => {
81
+ it('should trigger BONUS_CAMERA successfully', async () => {
82
+ const { publicState, privateState } = await initializeSession('bell-test');
83
+ const debugCommand = {
84
+ id: 'debug-bell-1',
85
+ type: 'DEBUG_TRIGGER_BONUS',
86
+ payload: {
87
+ sessionId: 'bell-test',
88
+ bonusType: 'BONUS_CAMERA',
89
+ betAmount: 8,
90
+ },
91
+ };
92
+ const result = await engine.processCommand(publicState, privateState, debugCommand);
93
+ expect(result.success).toBe(true);
94
+ expect(result.message).toBe('Bonus triggered via debug command');
95
+ expect(result.publicState.hasPendingBonus).toBe(true);
96
+ expect(result.privateState.nextSpinType).toBe(happy_panda_config_1.SpinType.BONUS_CAMERA);
97
+ expect(result.privateState.internalPendingBonuses.camera).toBe(privateState.internalPendingBonuses.camera + 1);
98
+ expect(result.outcome).toBeDefined();
99
+ expect(result.outcome.triggeredBonus.bonusType).toBe('BONUS_CAMERA');
100
+ });
101
+ });
102
+ describe('BONUS_FIREWORKS', () => {
103
+ it('should trigger BONUS_FIREWORKS successfully', async () => {
104
+ const { publicState, privateState } = await initializeSession('bar1-test');
105
+ const debugCommand = {
106
+ id: 'debug-bar1-1',
107
+ type: 'DEBUG_TRIGGER_BONUS',
108
+ payload: {
109
+ sessionId: 'bar1-test',
110
+ bonusType: 'BONUS_FIREWORKS',
111
+ betAmount: 8,
112
+ },
113
+ };
114
+ const result = await engine.processCommand(publicState, privateState, debugCommand);
115
+ expect(result.success).toBe(true);
116
+ expect(result.message).toBe('Bonus triggered via debug command');
117
+ expect(result.publicState.hasPendingBonus).toBe(true);
118
+ expect(result.privateState.nextSpinType).toBe(happy_panda_config_1.SpinType.BONUS_FIREWORKS);
119
+ expect(result.privateState.internalPendingBonuses.fireworks).toBe(privateState.internalPendingBonuses.fireworks + 1);
120
+ expect(result.outcome).toBeDefined();
121
+ expect(result.outcome.triggeredBonus.bonusType).toBe('BONUS_FIREWORKS');
122
+ });
123
+ });
124
+ describe('RESPIN_CENTER_BAMBOO', () => {
125
+ it('should trigger RESPIN_CENTER_BAMBOO successfully', async () => {
126
+ const { publicState, privateState } = await initializeSession('respin-test');
127
+ const debugCommand = {
128
+ id: 'debug-respin-1',
129
+ type: 'DEBUG_TRIGGER_BONUS',
130
+ payload: {
131
+ sessionId: 'respin-test',
132
+ bonusType: 'RESPIN_CENTER_BAMBOO',
133
+ betAmount: 8,
134
+ },
135
+ };
136
+ const result = await engine.processCommand(publicState, privateState, debugCommand);
137
+ expect(result.success).toBe(true);
138
+ expect(result.message).toBe('Bonus triggered via debug command');
139
+ expect(result.publicState.hasPendingBonus).toBe(true);
140
+ expect(result.privateState.nextSpinType).toBe(happy_panda_config_1.SpinType.RESPIN_CENTER_BAMBOO);
141
+ expect(result.privateState.internalPendingBonuses.centerBamboo).toBe(privateState.internalPendingBonuses.centerBamboo + 1);
142
+ expect(result.outcome).toBeDefined();
143
+ expect(result.outcome.triggeredBonus.bonusType).toBe('RESPIN_CENTER_BAMBOO');
144
+ });
145
+ });
146
+ describe('Error Cases', () => {
147
+ it('should fail with unknown bonusType', async () => {
148
+ const { publicState, privateState } = await initializeSession('unknown-bonus-test');
149
+ const debugCommand = {
150
+ id: 'debug-unknown-1',
151
+ type: 'DEBUG_TRIGGER_BONUS',
152
+ payload: {
153
+ sessionId: 'unknown-bonus-test',
154
+ bonusType: 'INVALID_BONUS_TYPE',
155
+ betAmount: 8,
156
+ },
157
+ };
158
+ const result = await engine.processCommand(publicState, privateState, debugCommand);
159
+ expect(result.success).toBe(false);
160
+ expect(result.message).toContain('Unknown bonus type');
161
+ expect(result.message).toContain('INVALID_BONUS_TYPE');
162
+ // State should remain unchanged
163
+ expect(result.publicState.hasPendingBonus).toBe(publicState.hasPendingBonus);
164
+ });
165
+ it('should fail when state is not initialized (null publicState)', async () => {
166
+ const debugCommand = {
167
+ id: 'debug-null-public-1',
168
+ type: 'DEBUG_TRIGGER_BONUS',
169
+ payload: {
170
+ sessionId: 'null-test',
171
+ bonusType: 'BONUS_BAMBOO_TRIPLETS',
172
+ betAmount: 8,
173
+ },
174
+ };
175
+ const result = await engine.processCommand(null, null, debugCommand);
176
+ expect(result.success).toBe(false);
177
+ expect(result.message).toBe('State not initialized');
178
+ });
179
+ it('should fail when state is not initialized (null privateState)', async () => {
180
+ const { publicState } = await initializeSession('partial-state-test');
181
+ const debugCommand = {
182
+ id: 'debug-null-private-1',
183
+ type: 'DEBUG_TRIGGER_BONUS',
184
+ payload: {
185
+ sessionId: 'partial-state-test',
186
+ bonusType: 'BONUS_BAMBOO_TRIPLETS',
187
+ betAmount: 8,
188
+ },
189
+ };
190
+ const result = await engine.processCommand(publicState, null, debugCommand);
191
+ expect(result.success).toBe(false);
192
+ expect(result.message).toBe('State not initialized');
193
+ });
194
+ });
195
+ describe('Outcome Structure', () => {
196
+ it('should return triggeredBonus with bonusId, bonusType, and betAmount', async () => {
197
+ const { publicState, privateState } = await initializeSession('outcome-test');
198
+ const debugCommand = {
199
+ id: 'debug-outcome-1',
200
+ type: 'DEBUG_TRIGGER_BONUS',
201
+ payload: {
202
+ sessionId: 'outcome-test',
203
+ bonusType: 'BONUS_BAMBOO_TWINS',
204
+ betAmount: 16,
205
+ },
206
+ };
207
+ const result = await engine.processCommand(publicState, privateState, debugCommand);
208
+ expect(result.success).toBe(true);
209
+ expect(result.outcome).toBeDefined();
210
+ const outcome = result.outcome;
211
+ expect(outcome.triggeredBonus).toBeDefined();
212
+ expect(outcome.triggeredBonus.bonusId).toBeDefined();
213
+ expect(typeof outcome.triggeredBonus.bonusId).toBe('string');
214
+ expect(outcome.triggeredBonus.bonusId).toMatch(/^debug-\d+-[a-z0-9]+$/);
215
+ expect(outcome.triggeredBonus.bonusType).toBe('BONUS_BAMBOO_TWINS');
216
+ expect(outcome.triggeredBonus.betAmount).toBe(16);
217
+ });
218
+ it('should return nextSpinType at outcome level for frontend SDK compatibility', async () => {
219
+ const { publicState, privateState } = await initializeSession('nextspintype-outcome-test');
220
+ const debugCommand = {
221
+ id: 'debug-nextspintype-1',
222
+ type: 'DEBUG_TRIGGER_BONUS',
223
+ payload: {
224
+ sessionId: 'nextspintype-outcome-test',
225
+ bonusType: 'BONUS_CAMERA',
226
+ betAmount: 8,
227
+ },
228
+ };
229
+ const result = await engine.processCommand(publicState, privateState, debugCommand);
230
+ expect(result.success).toBe(true);
231
+ expect(result.outcome).toBeDefined();
232
+ // Verify nextSpinType is at the outcome level (frontend SDK expects this)
233
+ const outcome = result.outcome;
234
+ expect(outcome.nextSpinType).toBeDefined();
235
+ expect(outcome.nextSpinType).toBe(happy_panda_config_1.SpinType.BONUS_CAMERA);
236
+ expect(outcome.autoStarted).toBe(false);
237
+ expect(outcome.requiresStartCommand).toBe(true);
238
+ // Also verify privateState has the same value
239
+ expect(result.privateState.nextSpinType).toBe(outcome.nextSpinType);
240
+ });
241
+ });
242
+ describe('State Preservation', () => {
243
+ it('should not modify other pending bonus counters', async () => {
244
+ const { publicState, privateState } = await initializeSession('preserve-test');
245
+ const originalCounters = {
246
+ jackpot: privateState.internalPendingBonuses.bambooTriplets,
247
+ cherry: privateState.internalPendingBonuses.bambooTwins,
248
+ bell: privateState.internalPendingBonuses.camera,
249
+ bar1: privateState.internalPendingBonuses.fireworks,
250
+ respin: privateState.internalPendingBonuses.centerBamboo,
251
+ };
252
+ const debugCommand = {
253
+ id: 'debug-preserve-1',
254
+ type: 'DEBUG_TRIGGER_BONUS',
255
+ payload: {
256
+ sessionId: 'preserve-test',
257
+ bonusType: 'BONUS_CAMERA',
258
+ betAmount: 8,
259
+ },
260
+ };
261
+ const result = await engine.processCommand(publicState, privateState, debugCommand);
262
+ expect(result.success).toBe(true);
263
+ // Bell should be incremented
264
+ expect(result.privateState.internalPendingBonuses.camera).toBe(originalCounters.bell + 1);
265
+ // All others should remain unchanged
266
+ expect(result.privateState.internalPendingBonuses.bambooTriplets).toBe(originalCounters.jackpot);
267
+ expect(result.privateState.internalPendingBonuses.bambooTwins).toBe(originalCounters.cherry);
268
+ expect(result.privateState.internalPendingBonuses.fireworks).toBe(originalCounters.bar1);
269
+ expect(result.privateState.internalPendingBonuses.centerBamboo).toBe(originalCounters.respin);
270
+ });
271
+ it('should preserve other public state fields', async () => {
272
+ const { publicState, privateState } = await initializeSession('public-preserve-test');
273
+ const debugCommand = {
274
+ id: 'debug-public-preserve-1',
275
+ type: 'DEBUG_TRIGGER_BONUS',
276
+ payload: {
277
+ sessionId: 'public-preserve-test',
278
+ bonusType: 'BONUS_BAMBOO_TRIPLETS',
279
+ betAmount: 8,
280
+ },
281
+ };
282
+ const result = await engine.processCommand(publicState, privateState, debugCommand);
283
+ expect(result.success).toBe(true);
284
+ // These should remain unchanged
285
+ expect(result.publicState.gameDirection).toBe(publicState.gameDirection);
286
+ expect(result.publicState.betStake).toBe(publicState.betStake);
287
+ expect(result.publicState.betGame).toBe(publicState.betGame);
288
+ expect(result.publicState.currentSpinType).toBe(publicState.currentSpinType);
289
+ expect(result.publicState.spinsRemaining).toBe(publicState.spinsRemaining);
290
+ expect(result.publicState.screen).toEqual(publicState.screen);
291
+ expect(result.publicState.bonusJackpotValue).toBe(publicState.bonusJackpotValue);
292
+ expect(result.publicState.poolJackpotValue).toBe(publicState.poolJackpotValue);
293
+ // Only hasPendingBonus should change
294
+ expect(result.publicState.hasPendingBonus).toBe(true);
295
+ });
296
+ });
297
+ describe('Multiple Triggers', () => {
298
+ it('should allow triggering multiple bonuses sequentially', async () => {
299
+ const { publicState, privateState } = await initializeSession('multi-test');
300
+ // First trigger
301
+ const debugCommand1 = {
302
+ id: 'debug-multi-1',
303
+ type: 'DEBUG_TRIGGER_BONUS',
304
+ payload: {
305
+ sessionId: 'multi-test',
306
+ bonusType: 'BONUS_BAMBOO_TWINS',
307
+ betAmount: 8,
308
+ },
309
+ };
310
+ const result1 = await engine.processCommand(publicState, privateState, debugCommand1);
311
+ expect(result1.success).toBe(true);
312
+ expect(result1.privateState.internalPendingBonuses.bambooTwins).toBe(1);
313
+ // Second trigger with updated state
314
+ const debugCommand2 = {
315
+ id: 'debug-multi-2',
316
+ type: 'DEBUG_TRIGGER_BONUS',
317
+ payload: {
318
+ sessionId: 'multi-test',
319
+ bonusType: 'BONUS_CAMERA',
320
+ betAmount: 8,
321
+ },
322
+ };
323
+ const result2 = await engine.processCommand(result1.publicState, result1.privateState, debugCommand2);
324
+ expect(result2.success).toBe(true);
325
+ expect(result2.privateState.internalPendingBonuses.bambooTwins).toBe(1);
326
+ expect(result2.privateState.internalPendingBonuses.camera).toBe(1);
327
+ });
328
+ it('should allow stacking the same bonus type', async () => {
329
+ const { publicState, privateState } = await initializeSession('stack-test');
330
+ // First trigger
331
+ const debugCommand1 = {
332
+ id: 'debug-stack-1',
333
+ type: 'DEBUG_TRIGGER_BONUS',
334
+ payload: {
335
+ sessionId: 'stack-test',
336
+ bonusType: 'BONUS_BAMBOO_TRIPLETS',
337
+ betAmount: 8,
338
+ },
339
+ };
340
+ const result1 = await engine.processCommand(publicState, privateState, debugCommand1);
341
+ expect(result1.success).toBe(true);
342
+ expect(result1.privateState.internalPendingBonuses.bambooTriplets).toBe(1);
343
+ // Second trigger of same type
344
+ const debugCommand2 = {
345
+ id: 'debug-stack-2',
346
+ type: 'DEBUG_TRIGGER_BONUS',
347
+ payload: {
348
+ sessionId: 'stack-test',
349
+ bonusType: 'BONUS_BAMBOO_TRIPLETS',
350
+ betAmount: 8,
351
+ },
352
+ };
353
+ const result2 = await engine.processCommand(result1.publicState, result1.privateState, debugCommand2);
354
+ expect(result2.success).toBe(true);
355
+ expect(result2.privateState.internalPendingBonuses.bambooTriplets).toBe(2);
356
+ });
357
+ });
358
+ });
359
+ //# sourceMappingURL=debug-trigger-bonus.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-trigger-bonus.test.js","sourceRoot":"","sources":["../../src/__tests__/debug-trigger-bonus.test.ts"],"names":[],"mappings":"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"}