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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +10 -0
  2. package/dist/__tests__/base-game.test.d.ts +2 -0
  3. package/dist/__tests__/base-game.test.d.ts.map +1 -0
  4. package/dist/__tests__/base-game.test.js +262 -0
  5. package/dist/__tests__/base-game.test.js.map +1 -0
  6. package/dist/__tests__/bonus-handlers.test.d.ts +2 -0
  7. package/dist/__tests__/bonus-handlers.test.d.ts.map +1 -0
  8. package/dist/__tests__/bonus-handlers.test.js +243 -0
  9. package/dist/__tests__/bonus-handlers.test.js.map +1 -0
  10. package/dist/__tests__/error-paths.test.d.ts +2 -0
  11. package/dist/__tests__/error-paths.test.d.ts.map +1 -0
  12. package/dist/__tests__/error-paths.test.js +328 -0
  13. package/dist/__tests__/error-paths.test.js.map +1 -0
  14. package/dist/__tests__/free-spins-handler.test.d.ts +2 -0
  15. package/dist/__tests__/free-spins-handler.test.d.ts.map +1 -0
  16. package/dist/__tests__/free-spins-handler.test.js +410 -0
  17. package/dist/__tests__/free-spins-handler.test.js.map +1 -0
  18. package/dist/__tests__/helpers/test-engine-factory.d.ts +98 -0
  19. package/dist/__tests__/helpers/test-engine-factory.d.ts.map +1 -0
  20. package/dist/__tests__/helpers/test-engine-factory.js +236 -0
  21. package/dist/__tests__/helpers/test-engine-factory.js.map +1 -0
  22. package/dist/__tests__/hold-win-handler.test.d.ts +2 -0
  23. package/dist/__tests__/hold-win-handler.test.d.ts.map +1 -0
  24. package/dist/__tests__/hold-win-handler.test.js +481 -0
  25. package/dist/__tests__/hold-win-handler.test.js.map +1 -0
  26. package/dist/__tests__/rng-gli19-compliance.test.d.ts +0 -4
  27. package/dist/__tests__/rng-gli19-compliance.test.d.ts.map +1 -1
  28. package/dist/__tests__/rng-gli19-compliance.test.js +232 -198
  29. package/dist/__tests__/rng-gli19-compliance.test.js.map +1 -1
  30. package/dist/__tests__/rng-security.test.d.ts +2 -0
  31. package/dist/__tests__/rng-security.test.d.ts.map +1 -0
  32. package/dist/__tests__/rng-security.test.js +379 -0
  33. package/dist/__tests__/rng-security.test.js.map +1 -0
  34. package/dist/__tests__/rtp-diagnostic.test.d.ts +6 -0
  35. package/dist/__tests__/rtp-diagnostic.test.d.ts.map +1 -0
  36. package/dist/__tests__/rtp-diagnostic.test.js +216 -0
  37. package/dist/__tests__/rtp-diagnostic.test.js.map +1 -0
  38. package/dist/__tests__/rtp-simulation.test.d.ts +0 -4
  39. package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -1
  40. package/dist/__tests__/rtp-simulation.test.js +228 -153
  41. package/dist/__tests__/rtp-simulation.test.js.map +1 -1
  42. package/dist/__tests__/spin-generator.test.d.ts +2 -0
  43. package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
  44. package/dist/__tests__/spin-generator.test.js +375 -0
  45. package/dist/__tests__/spin-generator.test.js.map +1 -0
  46. package/dist/__tests__/state-transitions.test.d.ts +2 -0
  47. package/dist/__tests__/state-transitions.test.d.ts.map +1 -0
  48. package/dist/__tests__/state-transitions.test.js +249 -0
  49. package/dist/__tests__/state-transitions.test.js.map +1 -0
  50. package/dist/__tests__/symbol-distribution.test.d.ts +2 -0
  51. package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
  52. package/dist/__tests__/symbol-distribution.test.js +210 -0
  53. package/dist/__tests__/symbol-distribution.test.js.map +1 -0
  54. package/dist/__tests__/win-calculator.test.d.ts +2 -0
  55. package/dist/__tests__/win-calculator.test.d.ts.map +1 -0
  56. package/dist/__tests__/win-calculator.test.js +516 -0
  57. package/dist/__tests__/win-calculator.test.js.map +1 -0
  58. package/dist/config/game-logic-config/game-logic-config.d.ts.map +1 -1
  59. package/dist/config/game-logic-config/game-logic-config.js +27 -17
  60. package/dist/config/game-logic-config/game-logic-config.js.map +1 -1
  61. package/dist/logic/handlers/free-spins.handler.d.ts +2 -0
  62. package/dist/logic/handlers/free-spins.handler.d.ts.map +1 -1
  63. package/dist/logic/handlers/free-spins.handler.js +74 -6
  64. package/dist/logic/handlers/free-spins.handler.js.map +1 -1
  65. package/package.json +4 -2
  66. package/dist/__tests__/rng-seed-security.test.d.ts +0 -6
  67. package/dist/__tests__/rng-seed-security.test.d.ts.map +0 -1
  68. package/dist/__tests__/rng-seed-security.test.js +0 -263
  69. package/dist/__tests__/rng-seed-security.test.js.map +0 -1
  70. package/dist/__tests__/rng-seed-type.test.d.ts +0 -16
  71. package/dist/__tests__/rng-seed-type.test.d.ts.map +0 -1
  72. package/dist/__tests__/rng-seed-type.test.js +0 -288
  73. package/dist/__tests__/rng-seed-type.test.js.map +0 -1
  74. package/dist/__tests__/rng-stress-boundary.test.d.ts +0 -5
  75. package/dist/__tests__/rng-stress-boundary.test.d.ts.map +0 -1
  76. package/dist/__tests__/rng-stress-boundary.test.js +0 -395
  77. package/dist/__tests__/rng-stress-boundary.test.js.map +0 -1
@@ -0,0 +1,375 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Spin Generator Tests — Lucky Sharky
5
+ *
6
+ * Tests the screen generation logic:
7
+ * - Screen generation (5x3 reel layout)
8
+ * - Reel strip usage (base game vs free spins)
9
+ * - Stop position calculation from RNG
10
+ * - Symbol distribution validation
11
+ */
12
+ const lucky_sharky_spin_generator_1 = require("../logic/lucky-sharky.spin-generator");
13
+ const game_logic_config_1 = require("../config/game-logic-config/game-logic-config");
14
+ const rng_service_1 = require("../rng/rng-service");
15
+ const reel_strips_config_1 = require("../domain/reel-strips-config");
16
+ const reel_1 = require("../domain/reel");
17
+ const reel_strip_option_1 = require("../domain/reel-strip-option");
18
+ const lucky_sharky_types_1 = require("../logic/lucky-sharky.types");
19
+ const game_test_utils_1 = require("@omnitronix/game-test-utils");
20
+ describe('Spin Generator — Lucky Sharky', () => {
21
+ const config = game_logic_config_1.luckySharkyGameLogicConfig;
22
+ // Create a simple reel strip config for testing
23
+ function createTestReelStripsConfig() {
24
+ // Create 5 reels, each with 6 options (matching config)
25
+ const reels = [];
26
+ for (let reelIdx = 0; reelIdx < 5; reelIdx++) {
27
+ const options = [];
28
+ // Create 6 reel strip options per reel
29
+ for (let optIdx = 0; optIdx < 6; optIdx++) {
30
+ // Create a reel strip with 50 symbols (matching config.paidSpinsConfig.reelsLength)
31
+ const symbols = [];
32
+ for (let i = 0; i < 50; i++) {
33
+ // Rotate through base symbols (0-7)
34
+ symbols.push((i + reelIdx + optIdx) % 8);
35
+ }
36
+ options.push(new reel_strip_option_1.ReelStripOption(symbols));
37
+ }
38
+ reels.push(new reel_1.Reel(options));
39
+ }
40
+ return new reel_strips_config_1.ReelStripsConfig(reels);
41
+ }
42
+ // Create a reel strip with specific symbols for testing
43
+ function createControlledReelStripsConfig(symbolPattern) {
44
+ const reels = [];
45
+ for (let reelIdx = 0; reelIdx < 5; reelIdx++) {
46
+ const options = [];
47
+ for (let optIdx = 0; optIdx < 6; optIdx++) {
48
+ const symbols = symbolPattern[reelIdx] || [0, 1, 2];
49
+ options.push(new reel_strip_option_1.ReelStripOption(symbols));
50
+ }
51
+ reels.push(new reel_1.Reel(options));
52
+ }
53
+ return new reel_strips_config_1.ReelStripsConfig(reels);
54
+ }
55
+ beforeEach(() => {
56
+ (0, game_test_utils_1.resetCommandIdCounter)();
57
+ });
58
+ describe('Screen Generation - 5x3 Layout', () => {
59
+ it('should generate a 5x3 screen (5 reels, 3 rows)', async () => {
60
+ const mockRng = new game_test_utils_1.MockRngClient([0, 0, 0, 0, 0, 0]); // All zeros for reel option and stops
61
+ const rngService = new rng_service_1.RngService(mockRng);
62
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
63
+ const reelStrips = createTestReelStripsConfig();
64
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
65
+ const screen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
66
+ expect(screen).toBeDefined();
67
+ expect(screen.length).toBe(5); // 5 reels
68
+ for (const reel of screen) {
69
+ expect(reel.length).toBe(3); // 3 rows
70
+ }
71
+ });
72
+ it('should produce valid symbol IDs for all positions', async () => {
73
+ const mockRng = new game_test_utils_1.MockRngClient([0, 5, 10, 15, 20, 25]); // Various positions
74
+ const rngService = new rng_service_1.RngService(mockRng);
75
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
76
+ const reelStrips = createTestReelStripsConfig();
77
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
78
+ const screen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
79
+ for (let reel = 0; reel < screen.length; reel++) {
80
+ for (let row = 0; row < screen[reel].length; row++) {
81
+ const symbol = screen[reel][row];
82
+ expect(typeof symbol).toBe('number');
83
+ expect(symbol).toBeGreaterThanOrEqual(0);
84
+ }
85
+ }
86
+ });
87
+ it('should use consecutive symbols from reel strip (wrapping)', async () => {
88
+ // Create a reel strip with known symbols
89
+ const symbolPattern = [
90
+ [0, 1, 2, 3, 4], // Reel 0
91
+ [5, 6, 7, 0, 1], // Reel 1
92
+ [2, 3, 4, 5, 6], // Reel 2
93
+ [7, 0, 1, 2, 3], // Reel 3
94
+ [4, 5, 6, 7, 0], // Reel 4
95
+ ];
96
+ const reelStrips = createControlledReelStripsConfig(symbolPattern);
97
+ // RNG: option 0, then stop positions 0 for all reels
98
+ const mockRng = new game_test_utils_1.MockRngClient([0, 0, 0, 0, 0, 0]);
99
+ const rngService = new rng_service_1.RngService(mockRng);
100
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
101
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
102
+ const screen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
103
+ // Check reel 0: symbols at positions 0, 1, 2 should be [0, 1, 2]
104
+ expect(screen[0][0]).toBe(0);
105
+ expect(screen[0][1]).toBe(1);
106
+ expect(screen[0][2]).toBe(2);
107
+ });
108
+ });
109
+ describe('Stop Position Calculation', () => {
110
+ it('should calculate stop positions from RNG values', async () => {
111
+ // RNG returns specific values for stop positions
112
+ const mockRng = new game_test_utils_1.MockRngClient([0, 10, 20, 30, 40, 0]); // option=0, then stops
113
+ const rngService = new rng_service_1.RngService(mockRng);
114
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
115
+ const reelStrips = createTestReelStripsConfig();
116
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
117
+ const screen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
118
+ // Screen should be generated without errors
119
+ expect(screen.length).toBe(5);
120
+ });
121
+ it('should wrap stop position when exceeding reel length', async () => {
122
+ // Create short reel strips
123
+ const symbolPattern = [
124
+ [lucky_sharky_types_1.SymbolType.H1, lucky_sharky_types_1.SymbolType.H2, lucky_sharky_types_1.SymbolType.H3], // Only 3 symbols per reel
125
+ [lucky_sharky_types_1.SymbolType.H4, lucky_sharky_types_1.SymbolType.M1, lucky_sharky_types_1.SymbolType.M2],
126
+ [lucky_sharky_types_1.SymbolType.L1, lucky_sharky_types_1.SymbolType.L2, lucky_sharky_types_1.SymbolType.H1],
127
+ [lucky_sharky_types_1.SymbolType.H2, lucky_sharky_types_1.SymbolType.H3, lucky_sharky_types_1.SymbolType.H4],
128
+ [lucky_sharky_types_1.SymbolType.M1, lucky_sharky_types_1.SymbolType.M2, lucky_sharky_types_1.SymbolType.L1],
129
+ ];
130
+ const reelStrips = createControlledReelStripsConfig(symbolPattern);
131
+ // Stop at position 2 (should wrap to show symbols 2, 0, 1)
132
+ const mockRng = new game_test_utils_1.MockRngClient([0, 2, 2, 2, 2, 2]);
133
+ const rngService = new rng_service_1.RngService(mockRng);
134
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
135
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
136
+ const screen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
137
+ // Reel 0: stop at 2, symbols are [H1, H2, H3]
138
+ // Position 2 = H3, Position 3%3=0 = H1, Position 4%3=1 = H2
139
+ expect(screen[0][0]).toBe(lucky_sharky_types_1.SymbolType.H3);
140
+ expect(screen[0][1]).toBe(lucky_sharky_types_1.SymbolType.H1); // Wraps
141
+ expect(screen[0][2]).toBe(lucky_sharky_types_1.SymbolType.H2); // Wraps
142
+ });
143
+ it('should use different stop positions for each reel', async () => {
144
+ // Make RNG return different values for each reel
145
+ const mockRng = new game_test_utils_1.MockRngClient([0, 0, 5, 10, 15, 20]); // Different stops
146
+ const rngService = new rng_service_1.RngService(mockRng);
147
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
148
+ const reelStrips = createTestReelStripsConfig();
149
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
150
+ const screen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
151
+ // Verify we got 5 reels with potentially different symbol combinations
152
+ expect(screen.length).toBe(5);
153
+ // With different stop positions, screens should vary
154
+ });
155
+ });
156
+ describe('Reel Option Selection', () => {
157
+ it('should select reel option based on weighted RNG', async () => {
158
+ // Config has weights: [1, 1, 6, 6, 7, 7]
159
+ // First RNG call selects the option based on total weight (28)
160
+ const mockRng = new game_test_utils_1.MockRngClient([0, 0, 0, 0, 0, 0]); // Select first option
161
+ const rngService = new rng_service_1.RngService(mockRng);
162
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
163
+ const reelStrips = createTestReelStripsConfig();
164
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
165
+ const screen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
166
+ // Should successfully generate screen with option 0
167
+ expect(screen.length).toBe(5);
168
+ });
169
+ it('should handle maximum weight selection', async () => {
170
+ // Test selecting the last option (weight sum = 27)
171
+ const mockRng = new game_test_utils_1.MockRngClient([27, 0, 0, 0, 0, 0]);
172
+ const rngService = new rng_service_1.RngService(mockRng);
173
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
174
+ const reelStrips = createTestReelStripsConfig();
175
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
176
+ const screen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
177
+ expect(screen.length).toBe(5);
178
+ });
179
+ });
180
+ describe('Base Game vs Free Spins Screen Generation', () => {
181
+ it('should generate base game screen', async () => {
182
+ const mockRng = new game_test_utils_1.MockRngClient([0, 0, 0, 0, 0, 0]);
183
+ const rngService = new rng_service_1.RngService(mockRng);
184
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
185
+ const reelStrips = createTestReelStripsConfig();
186
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
187
+ const screen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
188
+ expect(screen).toBeDefined();
189
+ expect(screen.length).toBe(5);
190
+ });
191
+ it('should generate free spin screen', async () => {
192
+ const mockRng = new game_test_utils_1.MockRngClient([0, 0, 0, 0, 0, 0]);
193
+ const rngService = new rng_service_1.RngService(mockRng);
194
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
195
+ const reelStrips = createTestReelStripsConfig();
196
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
197
+ const screen = await spinGenerator.generateFreeSpinScreen(config, reelStrips, commandId, 'free_spin');
198
+ expect(screen).toBeDefined();
199
+ expect(screen.length).toBe(5);
200
+ for (const reel of screen) {
201
+ expect(reel.length).toBe(3);
202
+ }
203
+ });
204
+ });
205
+ describe('Symbol Distribution Validation', () => {
206
+ it('should produce symbols within valid range', async () => {
207
+ const mockRng = new game_test_utils_1.MockRngClient([0, 0, 10, 20, 30, 40]);
208
+ const rngService = new rng_service_1.RngService(mockRng);
209
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
210
+ const reelStrips = createTestReelStripsConfig();
211
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
212
+ const screen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
213
+ for (const reel of screen) {
214
+ for (const symbol of reel) {
215
+ // Base symbols are 0-7 in our test reel strips
216
+ expect(symbol).toBeGreaterThanOrEqual(0);
217
+ expect(symbol).toBeLessThanOrEqual(7);
218
+ }
219
+ }
220
+ });
221
+ it('should use symbols from the reel strip configuration', async () => {
222
+ // Create reel strips with only specific symbols
223
+ const symbolPattern = [
224
+ [100, 101, 102], // Custom symbol IDs
225
+ [103, 104, 105],
226
+ [106, 107, 108],
227
+ [109, 110, 111],
228
+ [112, 113, 114],
229
+ ];
230
+ const reelStrips = createControlledReelStripsConfig(symbolPattern);
231
+ const mockRng = new game_test_utils_1.MockRngClient([0, 0, 0, 0, 0, 0]);
232
+ const rngService = new rng_service_1.RngService(mockRng);
233
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
234
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
235
+ const screen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
236
+ // All symbols should be from our custom range
237
+ for (let reel = 0; reel < 5; reel++) {
238
+ for (const symbol of screen[reel]) {
239
+ expect(symbol).toBeGreaterThanOrEqual(100);
240
+ expect(symbol).toBeLessThanOrEqual(114);
241
+ }
242
+ }
243
+ });
244
+ });
245
+ describe('Special Symbol Application', () => {
246
+ it('should apply special symbols with booster check', async () => {
247
+ // Create base screen first
248
+ const symbolPattern = [
249
+ [lucky_sharky_types_1.SymbolType.H1, lucky_sharky_types_1.SymbolType.H2, lucky_sharky_types_1.SymbolType.H3],
250
+ [lucky_sharky_types_1.SymbolType.H4, lucky_sharky_types_1.SymbolType.M1, lucky_sharky_types_1.SymbolType.M2],
251
+ [lucky_sharky_types_1.SymbolType.L1, lucky_sharky_types_1.SymbolType.L2, lucky_sharky_types_1.SymbolType.H1],
252
+ [lucky_sharky_types_1.SymbolType.H2, lucky_sharky_types_1.SymbolType.H3, lucky_sharky_types_1.SymbolType.H4],
253
+ [lucky_sharky_types_1.SymbolType.M1, lucky_sharky_types_1.SymbolType.M2, lucky_sharky_types_1.SymbolType.L1],
254
+ ];
255
+ const reelStrips = createControlledReelStripsConfig(symbolPattern);
256
+ const mockRng = new game_test_utils_1.MockRngClient([0, 0, 0, 0, 0, 0, 100, 0]); // Last values for special symbol checks
257
+ const rngService = new rng_service_1.RngService(mockRng);
258
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
259
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
260
+ const baseScreen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
261
+ const result = await spinGenerator.applySpecialSymbols(baseScreen, config, lucky_sharky_types_1.SpinType.BASE_GAME_SPIN, 0, // booster level 0
262
+ commandId, 'special_symbols');
263
+ expect(result.screen).toBeDefined();
264
+ expect(result.screen.length).toBe(5);
265
+ expect(typeof result.boosterCount).toBe('number');
266
+ expect(typeof result.collectCount).toBe('number');
267
+ expect(typeof result.scatterCount).toBe('number');
268
+ expect(typeof result.goldCoinCount).toBe('number');
269
+ });
270
+ it('should not add booster when at max level (9)', async () => {
271
+ const symbolPattern = [
272
+ [lucky_sharky_types_1.SymbolType.H1, lucky_sharky_types_1.SymbolType.H2, lucky_sharky_types_1.SymbolType.H3],
273
+ [lucky_sharky_types_1.SymbolType.H4, lucky_sharky_types_1.SymbolType.M1, lucky_sharky_types_1.SymbolType.M2],
274
+ [lucky_sharky_types_1.SymbolType.L1, lucky_sharky_types_1.SymbolType.L2, lucky_sharky_types_1.SymbolType.H1],
275
+ [lucky_sharky_types_1.SymbolType.H2, lucky_sharky_types_1.SymbolType.H3, lucky_sharky_types_1.SymbolType.H4],
276
+ [lucky_sharky_types_1.SymbolType.M1, lucky_sharky_types_1.SymbolType.M2, lucky_sharky_types_1.SymbolType.L1],
277
+ ];
278
+ const reelStrips = createControlledReelStripsConfig(symbolPattern);
279
+ const mockRng = new game_test_utils_1.MockRngClient([0, 0, 0, 0, 0, 0, 0, 0, 0]);
280
+ const rngService = new rng_service_1.RngService(mockRng);
281
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
282
+ const commandId = (0, game_test_utils_1.nextCommandId)('spin');
283
+ const baseScreen = await spinGenerator.generateBaseScreen(config, reelStrips, commandId, 'base_spin');
284
+ const result = await spinGenerator.applySpecialSymbols(baseScreen, config, lucky_sharky_types_1.SpinType.BASE_GAME_SPIN, 9, // max booster level
285
+ commandId, 'special_symbols');
286
+ // At max level, booster should not be added
287
+ expect(result.boosterCount).toBe(0);
288
+ });
289
+ });
290
+ describe('Hold Win Screen Generation', () => {
291
+ it('should generate hold win screen with new symbols for empty positions', async () => {
292
+ // Previous screen with some positions marked as empty (-1)
293
+ const previousScreen = [
294
+ [lucky_sharky_types_1.SymbolType.C11, -1, lucky_sharky_types_1.SymbolType.C13],
295
+ [-1, lucky_sharky_types_1.SymbolType.C15, -1],
296
+ [lucky_sharky_types_1.SymbolType.C21, -1, lucky_sharky_types_1.SymbolType.C23],
297
+ [-1, lucky_sharky_types_1.SymbolType.C25, -1],
298
+ [lucky_sharky_types_1.SymbolType.C31, -1, lucky_sharky_types_1.SymbolType.C33],
299
+ ];
300
+ // RNG values for generating new symbols
301
+ const mockRng = new game_test_utils_1.MockRngClient(Array(50).fill(0));
302
+ const rngService = new rng_service_1.RngService(mockRng);
303
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
304
+ const commandId = (0, game_test_utils_1.nextCommandId)('holdwin');
305
+ const result = await spinGenerator.generateHoldWinScreen(previousScreen, config, commandId, 'hold_win');
306
+ expect(result.screen).toBeDefined();
307
+ expect(result.newSymbols).toBeDefined();
308
+ expect(result.coinValues).toBeDefined();
309
+ // Screen should be 5x3
310
+ expect(result.screen.length).toBe(5);
311
+ expect(result.newSymbols.length).toBe(5);
312
+ expect(result.coinValues.length).toBe(5);
313
+ });
314
+ it('should preserve existing coin symbols in hold win', async () => {
315
+ const previousScreen = [
316
+ [lucky_sharky_types_1.SymbolType.C11, lucky_sharky_types_1.SymbolType.C12, lucky_sharky_types_1.SymbolType.C13],
317
+ [lucky_sharky_types_1.SymbolType.C14, lucky_sharky_types_1.SymbolType.C15, -1],
318
+ [-1, -1, -1],
319
+ [-1, -1, -1],
320
+ [-1, -1, -1],
321
+ ];
322
+ const mockRng = new game_test_utils_1.MockRngClient(Array(50).fill(0));
323
+ const rngService = new rng_service_1.RngService(mockRng);
324
+ const spinGenerator = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService);
325
+ const commandId = (0, game_test_utils_1.nextCommandId)('holdwin');
326
+ const result = await spinGenerator.generateHoldWinScreen(previousScreen, config, commandId, 'hold_win');
327
+ // Existing coins should be preserved
328
+ expect(result.screen[0][0]).toBe(lucky_sharky_types_1.SymbolType.C11);
329
+ expect(result.screen[0][1]).toBe(lucky_sharky_types_1.SymbolType.C12);
330
+ expect(result.screen[0][2]).toBe(lucky_sharky_types_1.SymbolType.C13);
331
+ expect(result.screen[1][0]).toBe(lucky_sharky_types_1.SymbolType.C14);
332
+ expect(result.screen[1][1]).toBe(lucky_sharky_types_1.SymbolType.C15);
333
+ });
334
+ });
335
+ describe('Deterministic Output with Mock RNG', () => {
336
+ it('should produce identical screens with same RNG sequence', async () => {
337
+ const rngValues = [5, 10, 15, 20, 25, 30];
338
+ // First run
339
+ const mockRng1 = new game_test_utils_1.MockRngClient([...rngValues]);
340
+ const rngService1 = new rng_service_1.RngService(mockRng1);
341
+ const spinGenerator1 = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService1);
342
+ const reelStrips = createTestReelStripsConfig();
343
+ const commandId1 = (0, game_test_utils_1.nextCommandId)('spin');
344
+ const screen1 = await spinGenerator1.generateBaseScreen(config, reelStrips, commandId1, 'base_spin');
345
+ // Second run with same RNG values
346
+ (0, game_test_utils_1.resetCommandIdCounter)();
347
+ const mockRng2 = new game_test_utils_1.MockRngClient([...rngValues]);
348
+ const rngService2 = new rng_service_1.RngService(mockRng2);
349
+ const spinGenerator2 = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService2);
350
+ const commandId2 = (0, game_test_utils_1.nextCommandId)('spin');
351
+ const screen2 = await spinGenerator2.generateBaseScreen(config, reelStrips, commandId2, 'base_spin');
352
+ // Screens should be identical
353
+ expect(JSON.stringify(screen1)).toBe(JSON.stringify(screen2));
354
+ });
355
+ it('should produce different screens with different RNG sequences', async () => {
356
+ const reelStrips = createTestReelStripsConfig();
357
+ // First run
358
+ const mockRng1 = new game_test_utils_1.MockRngClient([0, 0, 0, 0, 0, 0]);
359
+ const rngService1 = new rng_service_1.RngService(mockRng1);
360
+ const spinGenerator1 = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService1);
361
+ const commandId1 = (0, game_test_utils_1.nextCommandId)('spin');
362
+ const screen1 = await spinGenerator1.generateBaseScreen(config, reelStrips, commandId1, 'base_spin');
363
+ // Second run with different RNG values
364
+ (0, game_test_utils_1.resetCommandIdCounter)();
365
+ const mockRng2 = new game_test_utils_1.MockRngClient([10, 20, 30, 40, 25, 15]);
366
+ const rngService2 = new rng_service_1.RngService(mockRng2);
367
+ const spinGenerator2 = new lucky_sharky_spin_generator_1.LuckySharkySpinGenerator(rngService2);
368
+ const commandId2 = (0, game_test_utils_1.nextCommandId)('spin');
369
+ const screen2 = await spinGenerator2.generateBaseScreen(config, reelStrips, commandId2, 'base_spin');
370
+ // Screens should be different
371
+ expect(JSON.stringify(screen1)).not.toBe(JSON.stringify(screen2));
372
+ });
373
+ });
374
+ });
375
+ //# sourceMappingURL=spin-generator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spin-generator.test.js","sourceRoot":"","sources":["../../src/__tests__/spin-generator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=state-transitions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-transitions.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/state-transitions.test.ts"],"names":[],"mappings":""}