@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.
- package/README.md +10 -0
- package/dist/__tests__/base-game.test.d.ts +2 -0
- package/dist/__tests__/base-game.test.d.ts.map +1 -0
- package/dist/__tests__/base-game.test.js +262 -0
- package/dist/__tests__/base-game.test.js.map +1 -0
- package/dist/__tests__/bonus-handlers.test.d.ts +2 -0
- package/dist/__tests__/bonus-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/bonus-handlers.test.js +243 -0
- package/dist/__tests__/bonus-handlers.test.js.map +1 -0
- package/dist/__tests__/error-paths.test.d.ts +2 -0
- package/dist/__tests__/error-paths.test.d.ts.map +1 -0
- package/dist/__tests__/error-paths.test.js +328 -0
- package/dist/__tests__/error-paths.test.js.map +1 -0
- package/dist/__tests__/free-spins-handler.test.d.ts +2 -0
- package/dist/__tests__/free-spins-handler.test.d.ts.map +1 -0
- package/dist/__tests__/free-spins-handler.test.js +410 -0
- package/dist/__tests__/free-spins-handler.test.js.map +1 -0
- package/dist/__tests__/helpers/test-engine-factory.d.ts +98 -0
- package/dist/__tests__/helpers/test-engine-factory.d.ts.map +1 -0
- package/dist/__tests__/helpers/test-engine-factory.js +236 -0
- package/dist/__tests__/helpers/test-engine-factory.js.map +1 -0
- package/dist/__tests__/hold-win-handler.test.d.ts +2 -0
- package/dist/__tests__/hold-win-handler.test.d.ts.map +1 -0
- package/dist/__tests__/hold-win-handler.test.js +481 -0
- package/dist/__tests__/hold-win-handler.test.js.map +1 -0
- package/dist/__tests__/rng-gli19-compliance.test.d.ts +0 -4
- package/dist/__tests__/rng-gli19-compliance.test.d.ts.map +1 -1
- package/dist/__tests__/rng-gli19-compliance.test.js +232 -198
- package/dist/__tests__/rng-gli19-compliance.test.js.map +1 -1
- package/dist/__tests__/rng-security.test.d.ts +2 -0
- package/dist/__tests__/rng-security.test.d.ts.map +1 -0
- package/dist/__tests__/rng-security.test.js +379 -0
- package/dist/__tests__/rng-security.test.js.map +1 -0
- package/dist/__tests__/rtp-diagnostic.test.d.ts +6 -0
- package/dist/__tests__/rtp-diagnostic.test.d.ts.map +1 -0
- package/dist/__tests__/rtp-diagnostic.test.js +216 -0
- package/dist/__tests__/rtp-diagnostic.test.js.map +1 -0
- package/dist/__tests__/rtp-simulation.test.d.ts +0 -4
- package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -1
- package/dist/__tests__/rtp-simulation.test.js +228 -153
- package/dist/__tests__/rtp-simulation.test.js.map +1 -1
- package/dist/__tests__/spin-generator.test.d.ts +2 -0
- package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
- package/dist/__tests__/spin-generator.test.js +375 -0
- package/dist/__tests__/spin-generator.test.js.map +1 -0
- package/dist/__tests__/state-transitions.test.d.ts +2 -0
- package/dist/__tests__/state-transitions.test.d.ts.map +1 -0
- package/dist/__tests__/state-transitions.test.js +249 -0
- package/dist/__tests__/state-transitions.test.js.map +1 -0
- package/dist/__tests__/symbol-distribution.test.d.ts +2 -0
- package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
- package/dist/__tests__/symbol-distribution.test.js +210 -0
- package/dist/__tests__/symbol-distribution.test.js.map +1 -0
- package/dist/__tests__/win-calculator.test.d.ts +2 -0
- package/dist/__tests__/win-calculator.test.d.ts.map +1 -0
- package/dist/__tests__/win-calculator.test.js +516 -0
- package/dist/__tests__/win-calculator.test.js.map +1 -0
- package/dist/config/game-logic-config/game-logic-config.d.ts.map +1 -1
- package/dist/config/game-logic-config/game-logic-config.js +27 -17
- package/dist/config/game-logic-config/game-logic-config.js.map +1 -1
- package/dist/logic/handlers/free-spins.handler.d.ts +2 -0
- package/dist/logic/handlers/free-spins.handler.d.ts.map +1 -1
- package/dist/logic/handlers/free-spins.handler.js +74 -6
- package/dist/logic/handlers/free-spins.handler.js.map +1 -1
- package/package.json +4 -2
- package/dist/__tests__/rng-seed-security.test.d.ts +0 -6
- package/dist/__tests__/rng-seed-security.test.d.ts.map +0 -1
- package/dist/__tests__/rng-seed-security.test.js +0 -263
- package/dist/__tests__/rng-seed-security.test.js.map +0 -1
- package/dist/__tests__/rng-seed-type.test.d.ts +0 -16
- package/dist/__tests__/rng-seed-type.test.d.ts.map +0 -1
- package/dist/__tests__/rng-seed-type.test.js +0 -288
- package/dist/__tests__/rng-seed-type.test.js.map +0 -1
- package/dist/__tests__/rng-stress-boundary.test.d.ts +0 -5
- package/dist/__tests__/rng-stress-boundary.test.d.ts.map +0 -1
- package/dist/__tests__/rng-stress-boundary.test.js +0 -395
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"state-transitions.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/state-transitions.test.ts"],"names":[],"mappings":""}
|