@omnitronix/lucky-sharky-game-engine 1.0.2 → 1.0.4
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 +6 -6
- package/dist/__tests__/comprehensive.test.d.ts +15 -0
- package/dist/__tests__/comprehensive.test.d.ts.map +1 -0
- package/dist/__tests__/comprehensive.test.js +510 -0
- package/dist/__tests__/comprehensive.test.js.map +1 -0
- package/dist/__tests__/debug-trigger-bonus.test.d.ts +8 -0
- package/dist/__tests__/debug-trigger-bonus.test.d.ts.map +1 -0
- package/dist/__tests__/{cheat-trigger-bonus.test.js → debug-trigger-bonus.test.js} +74 -74
- package/dist/__tests__/{cheat-trigger-bonus.test.js.map → debug-trigger-bonus.test.js.map} +1 -1
- package/dist/domain/types/debug-trigger-bonus-command.d.ts +10 -0
- package/dist/domain/types/debug-trigger-bonus-command.d.ts.map +1 -0
- package/dist/domain/types/{cheat-trigger-bonus-command.js → debug-trigger-bonus-command.js} +1 -1
- package/dist/domain/types/debug-trigger-bonus-command.js.map +1 -0
- package/dist/logic/lucky-sharky.game-logic.d.ts +10 -5
- package/dist/logic/lucky-sharky.game-logic.d.ts.map +1 -1
- package/dist/logic/lucky-sharky.game-logic.js +37 -5
- package/dist/logic/lucky-sharky.game-logic.js.map +1 -1
- package/dist/logic/lucky-sharky.types.d.ts +1 -0
- package/dist/logic/lucky-sharky.types.d.ts.map +1 -1
- package/dist/logic/lucky-sharky.types.js.map +1 -1
- package/dist/lucky-sharky-v1.game-engine.d.ts.map +1 -1
- package/dist/lucky-sharky-v1.game-engine.js +11 -22
- package/dist/lucky-sharky-v1.game-engine.js.map +1 -1
- package/package.json +1 -1
- package/dist/__tests__/cheat-trigger-bonus.test.d.ts +0 -8
- package/dist/__tests__/cheat-trigger-bonus.test.d.ts.map +0 -1
- package/dist/domain/types/cheat-trigger-bonus-command.d.ts +0 -10
- package/dist/domain/types/cheat-trigger-bonus-command.d.ts.map +0 -1
- package/dist/domain/types/cheat-trigger-bonus-command.js.map +0 -1
package/README.md
CHANGED
|
@@ -81,17 +81,17 @@ const spinResult = await engine.processCommand(
|
|
|
81
81
|
- 4 Jackpots: Mini (30x), Midi (100x), Maxi (500x), Mega (5000x)
|
|
82
82
|
- Full screen bonus: 1000x
|
|
83
83
|
|
|
84
|
-
## Debug
|
|
84
|
+
## Debug Commands (Testing/Admin)
|
|
85
85
|
|
|
86
86
|
The engine supports debug commands for QA testing via the dev-tools service. These commands are **blocked in REAL_MONEY mode**.
|
|
87
87
|
|
|
88
|
-
###
|
|
88
|
+
### DEBUG_TRIGGER_BONUS
|
|
89
89
|
|
|
90
|
-
Force trigger a specific bonus round for testing.
|
|
90
|
+
Force trigger a specific bonus round for testing. GLI-19 compliant terminology.
|
|
91
91
|
|
|
92
92
|
**Payload:**
|
|
93
93
|
```typescript
|
|
94
|
-
interface
|
|
94
|
+
interface DebugTriggerBonusCommand {
|
|
95
95
|
sessionId: string;
|
|
96
96
|
bonusType: 'FREE_SPINS' | 'HOLD_WIN_BONUS';
|
|
97
97
|
betAmount: number;
|
|
@@ -104,8 +104,8 @@ const result = await engine.processCommand(
|
|
|
104
104
|
publicState,
|
|
105
105
|
privateState,
|
|
106
106
|
{
|
|
107
|
-
id: '
|
|
108
|
-
type: '
|
|
107
|
+
id: 'debug-cmd-1',
|
|
108
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
109
109
|
payload: {
|
|
110
110
|
sessionId: 'session-123',
|
|
111
111
|
bonusType: 'FREE_SPINS', // or 'HOLD_WIN_BONUS'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive Test Suite for Lucky Sharky Game Engine
|
|
3
|
+
*
|
|
4
|
+
* Coverage:
|
|
5
|
+
* - Session initialization
|
|
6
|
+
* - Base game spins
|
|
7
|
+
* - FREE_SPINS bonus
|
|
8
|
+
* - HOLD_WIN_BONUS (Hold & Win)
|
|
9
|
+
* - Debug triggers
|
|
10
|
+
* - Reality check flow
|
|
11
|
+
* - Connection loss/resume
|
|
12
|
+
* - Error handling
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=comprehensive.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comprehensive.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/comprehensive.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Comprehensive Test Suite for Lucky Sharky Game Engine
|
|
4
|
+
*
|
|
5
|
+
* Coverage:
|
|
6
|
+
* - Session initialization
|
|
7
|
+
* - Base game spins
|
|
8
|
+
* - FREE_SPINS bonus
|
|
9
|
+
* - HOLD_WIN_BONUS (Hold & Win)
|
|
10
|
+
* - Debug triggers
|
|
11
|
+
* - Reality check flow
|
|
12
|
+
* - Connection loss/resume
|
|
13
|
+
* - Error handling
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
const lucky_sharky_v1_game_engine_1 = require("../lucky-sharky-v1.game-engine");
|
|
17
|
+
describe('Lucky Sharky - Comprehensive Test Suite', () => {
|
|
18
|
+
let engine;
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
engine = new lucky_sharky_v1_game_engine_1.LuckySharkyV1GameEngine();
|
|
21
|
+
});
|
|
22
|
+
// ============================================================
|
|
23
|
+
// SESSION INITIALIZATION
|
|
24
|
+
// ============================================================
|
|
25
|
+
describe('Session Initialization', () => {
|
|
26
|
+
it('should initialize session with default config', async () => {
|
|
27
|
+
const command = {
|
|
28
|
+
id: 'init-1',
|
|
29
|
+
type: 'INIT_SESSION_STATE',
|
|
30
|
+
payload: {
|
|
31
|
+
betAmountThresholds: [0.2, 0.4, 1.0, 2.0, 5.0, 10.0],
|
|
32
|
+
defaultBetAmount: 1.0,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
const result = await engine.processCommand(null, null, command);
|
|
36
|
+
expect(result.success).toBe(true);
|
|
37
|
+
expect(result.publicState).toBeDefined();
|
|
38
|
+
expect(result.privateState).toBeDefined();
|
|
39
|
+
expect(result.message).toBe('Session state initialized');
|
|
40
|
+
});
|
|
41
|
+
it('should initialize with custom bet thresholds', async () => {
|
|
42
|
+
const command = {
|
|
43
|
+
id: 'init-2',
|
|
44
|
+
type: 'INIT_SESSION_STATE',
|
|
45
|
+
payload: {
|
|
46
|
+
betAmountThresholds: [0.5, 1.0, 2.5, 5.0],
|
|
47
|
+
defaultBetAmount: 0.5,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
const result = await engine.processCommand(null, null, command);
|
|
51
|
+
expect(result.success).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
it('should return game engine info', () => {
|
|
54
|
+
const info = engine.getGameEngineInfo();
|
|
55
|
+
expect(info.gameCode).toBe('lucky-sharky');
|
|
56
|
+
expect(info.version).toBeDefined();
|
|
57
|
+
expect(info.rtp).toBeCloseTo(96.17, 1);
|
|
58
|
+
expect(info.gameType).toBe('slot');
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
// ============================================================
|
|
62
|
+
// BASE GAME SPINS
|
|
63
|
+
// ============================================================
|
|
64
|
+
describe('Base Game Spins', () => {
|
|
65
|
+
let publicState;
|
|
66
|
+
let privateState;
|
|
67
|
+
beforeEach(async () => {
|
|
68
|
+
const initResult = await engine.processCommand(null, null, {
|
|
69
|
+
id: 'init',
|
|
70
|
+
type: 'INIT_SESSION_STATE',
|
|
71
|
+
payload: {
|
|
72
|
+
betAmountThresholds: [0.2, 0.4, 1.0, 2.0],
|
|
73
|
+
defaultBetAmount: 1.0,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
publicState = initResult.publicState;
|
|
77
|
+
privateState = initResult.privateState;
|
|
78
|
+
});
|
|
79
|
+
it('should execute a base game spin', async () => {
|
|
80
|
+
const command = {
|
|
81
|
+
id: 'spin-1',
|
|
82
|
+
type: 'SPIN',
|
|
83
|
+
payload: {
|
|
84
|
+
sessionId: 'test-session',
|
|
85
|
+
betAmount: 1.0,
|
|
86
|
+
creditsPerLine: 20,
|
|
87
|
+
gameId: 'lucky-sharky',
|
|
88
|
+
gameVersion: '1.0.0',
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
const result = await engine.processCommand(publicState, privateState, command);
|
|
92
|
+
expect(result.success).toBe(true);
|
|
93
|
+
expect(result.publicState).toBeDefined();
|
|
94
|
+
expect(result.privateState).toBeDefined();
|
|
95
|
+
expect(result.outcome).toBeDefined();
|
|
96
|
+
});
|
|
97
|
+
it('should handle multiple consecutive spins', async () => {
|
|
98
|
+
let currentPublic = publicState;
|
|
99
|
+
let currentPrivate = privateState;
|
|
100
|
+
for (let i = 0; i < 5; i++) {
|
|
101
|
+
const result = await engine.processCommand(currentPublic, currentPrivate, {
|
|
102
|
+
id: `spin-${i}`,
|
|
103
|
+
type: 'SPIN',
|
|
104
|
+
payload: {
|
|
105
|
+
sessionId: 'test-session',
|
|
106
|
+
betAmount: 1.0,
|
|
107
|
+
creditsPerLine: 20,
|
|
108
|
+
gameId: 'lucky-sharky',
|
|
109
|
+
gameVersion: '1.0.0',
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
expect(result.success).toBe(true);
|
|
113
|
+
currentPublic = result.publicState;
|
|
114
|
+
currentPrivate = result.privateState;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
it('should throw error when spinning without initialized state', async () => {
|
|
118
|
+
// Engine throws TypeError when state is null
|
|
119
|
+
// This is expected behavior - state must be initialized
|
|
120
|
+
await expect(engine.processCommand(null, null, {
|
|
121
|
+
id: 'spin-fail',
|
|
122
|
+
type: 'SPIN',
|
|
123
|
+
payload: {
|
|
124
|
+
sessionId: 'test',
|
|
125
|
+
betAmount: 1.0,
|
|
126
|
+
creditsPerLine: 20,
|
|
127
|
+
gameId: 'lucky-sharky',
|
|
128
|
+
gameVersion: '1.0.0',
|
|
129
|
+
},
|
|
130
|
+
})).rejects.toThrow();
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
// ============================================================
|
|
134
|
+
// DEBUG TRIGGER BONUS - FREE_SPINS
|
|
135
|
+
// ============================================================
|
|
136
|
+
describe('DEBUG_TRIGGER_BONUS - FREE_SPINS', () => {
|
|
137
|
+
let publicState;
|
|
138
|
+
let privateState;
|
|
139
|
+
beforeEach(async () => {
|
|
140
|
+
const initResult = await engine.processCommand(null, null, {
|
|
141
|
+
id: 'init',
|
|
142
|
+
type: 'INIT_SESSION_STATE',
|
|
143
|
+
payload: {
|
|
144
|
+
betAmountThresholds: [0.2, 1.0, 2.0],
|
|
145
|
+
defaultBetAmount: 1.0,
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
publicState = initResult.publicState;
|
|
149
|
+
privateState = initResult.privateState;
|
|
150
|
+
});
|
|
151
|
+
it('should trigger FREE_SPINS via debug command', async () => {
|
|
152
|
+
const command = {
|
|
153
|
+
id: 'debug-fs-1',
|
|
154
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
155
|
+
payload: {
|
|
156
|
+
sessionId: 'test-session',
|
|
157
|
+
bonusType: 'FREE_SPINS',
|
|
158
|
+
betAmount: 1.0,
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
const result = await engine.processCommand(publicState, privateState, command);
|
|
162
|
+
expect(result.success).toBe(true);
|
|
163
|
+
expect(result.message).toBe('Bonus triggered via debug command');
|
|
164
|
+
expect(result.outcome).toBeDefined();
|
|
165
|
+
expect(result.outcome.triggeredBonus.bonusType).toBe('FREE_SPINS');
|
|
166
|
+
});
|
|
167
|
+
it('should set correct pending state for FREE_SPINS', async () => {
|
|
168
|
+
const result = await engine.processCommand(publicState, privateState, {
|
|
169
|
+
id: 'debug-fs-2',
|
|
170
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
171
|
+
payload: {
|
|
172
|
+
sessionId: 'test',
|
|
173
|
+
bonusType: 'FREE_SPINS',
|
|
174
|
+
betAmount: 2.0,
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
expect(result.success).toBe(true);
|
|
178
|
+
expect(result.privateState.pendingBonuses.length).toBeGreaterThan(0);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
// ============================================================
|
|
182
|
+
// DEBUG TRIGGER BONUS - HOLD_WIN_BONUS
|
|
183
|
+
// ============================================================
|
|
184
|
+
describe('DEBUG_TRIGGER_BONUS - HOLD_WIN_BONUS', () => {
|
|
185
|
+
let publicState;
|
|
186
|
+
let privateState;
|
|
187
|
+
beforeEach(async () => {
|
|
188
|
+
const initResult = await engine.processCommand(null, null, {
|
|
189
|
+
id: 'init',
|
|
190
|
+
type: 'INIT_SESSION_STATE',
|
|
191
|
+
payload: {
|
|
192
|
+
betAmountThresholds: [0.2, 1.0, 2.0],
|
|
193
|
+
defaultBetAmount: 1.0,
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
publicState = initResult.publicState;
|
|
197
|
+
privateState = initResult.privateState;
|
|
198
|
+
});
|
|
199
|
+
it('should trigger HOLD_WIN_BONUS via debug command', async () => {
|
|
200
|
+
const command = {
|
|
201
|
+
id: 'debug-hw-1',
|
|
202
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
203
|
+
payload: {
|
|
204
|
+
sessionId: 'test-session',
|
|
205
|
+
bonusType: 'HOLD_WIN_BONUS',
|
|
206
|
+
betAmount: 1.0,
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
const result = await engine.processCommand(publicState, privateState, command);
|
|
210
|
+
expect(result.success).toBe(true);
|
|
211
|
+
expect(result.message).toBe('Bonus triggered via debug command');
|
|
212
|
+
expect(result.outcome.triggeredBonus.bonusType).toBe('HOLD_WIN_BONUS');
|
|
213
|
+
});
|
|
214
|
+
it('should set correct pending state for HOLD_WIN_BONUS', async () => {
|
|
215
|
+
const result = await engine.processCommand(publicState, privateState, {
|
|
216
|
+
id: 'debug-hw-2',
|
|
217
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
218
|
+
payload: {
|
|
219
|
+
sessionId: 'test',
|
|
220
|
+
bonusType: 'HOLD_WIN_BONUS',
|
|
221
|
+
betAmount: 5.0,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
expect(result.success).toBe(true);
|
|
225
|
+
expect(result.privateState.pendingBonuses.length).toBeGreaterThan(0);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
// ============================================================
|
|
229
|
+
// DEBUG TRIGGER - ERROR CASES
|
|
230
|
+
// ============================================================
|
|
231
|
+
describe('DEBUG_TRIGGER_BONUS - Error Cases', () => {
|
|
232
|
+
let publicState;
|
|
233
|
+
let privateState;
|
|
234
|
+
beforeEach(async () => {
|
|
235
|
+
const initResult = await engine.processCommand(null, null, {
|
|
236
|
+
id: 'init',
|
|
237
|
+
type: 'INIT_SESSION_STATE',
|
|
238
|
+
payload: {
|
|
239
|
+
betAmountThresholds: [1.0],
|
|
240
|
+
defaultBetAmount: 1.0,
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
publicState = initResult.publicState;
|
|
244
|
+
privateState = initResult.privateState;
|
|
245
|
+
});
|
|
246
|
+
it('should throw error with unknown bonus type', async () => {
|
|
247
|
+
// Engine throws for unknown bonus types
|
|
248
|
+
await expect(engine.processCommand(publicState, privateState, {
|
|
249
|
+
id: 'debug-fail',
|
|
250
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
251
|
+
payload: {
|
|
252
|
+
sessionId: 'test',
|
|
253
|
+
bonusType: 'INVALID_BONUS',
|
|
254
|
+
betAmount: 1.0,
|
|
255
|
+
},
|
|
256
|
+
})).rejects.toThrow('Unknown bonus type');
|
|
257
|
+
});
|
|
258
|
+
it('should throw error without initialized state', async () => {
|
|
259
|
+
// Engine throws TypeError when state is null
|
|
260
|
+
await expect(engine.processCommand(null, null, {
|
|
261
|
+
id: 'debug-null',
|
|
262
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
263
|
+
payload: {
|
|
264
|
+
sessionId: 'test',
|
|
265
|
+
bonusType: 'FREE_SPINS',
|
|
266
|
+
betAmount: 1.0,
|
|
267
|
+
},
|
|
268
|
+
})).rejects.toThrow();
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
// ============================================================
|
|
272
|
+
// BONUS GAME FLOW - FREE SPINS
|
|
273
|
+
// ============================================================
|
|
274
|
+
describe('Free Spins Bonus Flow', () => {
|
|
275
|
+
let publicState;
|
|
276
|
+
let privateState;
|
|
277
|
+
beforeEach(async () => {
|
|
278
|
+
const initResult = await engine.processCommand(null, null, {
|
|
279
|
+
id: 'init',
|
|
280
|
+
type: 'INIT_SESSION_STATE',
|
|
281
|
+
payload: {
|
|
282
|
+
betAmountThresholds: [1.0],
|
|
283
|
+
defaultBetAmount: 1.0,
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
publicState = initResult.publicState;
|
|
287
|
+
privateState = initResult.privateState;
|
|
288
|
+
});
|
|
289
|
+
it('should complete full free spins flow', async () => {
|
|
290
|
+
// 1. Trigger bonus via debug
|
|
291
|
+
const triggerResult = await engine.processCommand(publicState, privateState, {
|
|
292
|
+
id: 'trigger',
|
|
293
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
294
|
+
payload: {
|
|
295
|
+
sessionId: 'test',
|
|
296
|
+
bonusType: 'FREE_SPINS',
|
|
297
|
+
betAmount: 1.0,
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
expect(triggerResult.success).toBe(true);
|
|
301
|
+
expect(triggerResult.privateState.pendingBonuses.length).toBeGreaterThan(0);
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
// ============================================================
|
|
305
|
+
// BONUS GAME FLOW - HOLD & WIN
|
|
306
|
+
// ============================================================
|
|
307
|
+
describe('Hold & Win Bonus Flow', () => {
|
|
308
|
+
let publicState;
|
|
309
|
+
let privateState;
|
|
310
|
+
beforeEach(async () => {
|
|
311
|
+
const initResult = await engine.processCommand(null, null, {
|
|
312
|
+
id: 'init',
|
|
313
|
+
type: 'INIT_SESSION_STATE',
|
|
314
|
+
payload: {
|
|
315
|
+
betAmountThresholds: [1.0],
|
|
316
|
+
defaultBetAmount: 1.0,
|
|
317
|
+
},
|
|
318
|
+
});
|
|
319
|
+
publicState = initResult.publicState;
|
|
320
|
+
privateState = initResult.privateState;
|
|
321
|
+
});
|
|
322
|
+
it('should trigger Hold & Win bonus', async () => {
|
|
323
|
+
const triggerResult = await engine.processCommand(publicState, privateState, {
|
|
324
|
+
id: 'trigger-hw',
|
|
325
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
326
|
+
payload: {
|
|
327
|
+
sessionId: 'test',
|
|
328
|
+
bonusType: 'HOLD_WIN_BONUS',
|
|
329
|
+
betAmount: 1.0,
|
|
330
|
+
},
|
|
331
|
+
});
|
|
332
|
+
expect(triggerResult.success).toBe(true);
|
|
333
|
+
expect(triggerResult.privateState.pendingBonuses.length).toBeGreaterThan(0);
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
// ============================================================
|
|
337
|
+
// REALITY CHECK
|
|
338
|
+
// ============================================================
|
|
339
|
+
describe('Reality Check', () => {
|
|
340
|
+
let publicState;
|
|
341
|
+
let privateState;
|
|
342
|
+
beforeEach(async () => {
|
|
343
|
+
const initResult = await engine.processCommand(null, null, {
|
|
344
|
+
id: 'init',
|
|
345
|
+
type: 'INIT_SESSION_STATE',
|
|
346
|
+
payload: {
|
|
347
|
+
betAmountThresholds: [1.0],
|
|
348
|
+
defaultBetAmount: 1.0,
|
|
349
|
+
},
|
|
350
|
+
});
|
|
351
|
+
publicState = initResult.publicState;
|
|
352
|
+
privateState = initResult.privateState;
|
|
353
|
+
});
|
|
354
|
+
it('should handle reality check command', async () => {
|
|
355
|
+
const command = {
|
|
356
|
+
id: 'reality-check',
|
|
357
|
+
type: 'ACKNOWLEDGE_REALITY_CHECK',
|
|
358
|
+
payload: {
|
|
359
|
+
sessionId: 'test-session',
|
|
360
|
+
acknowledged: true,
|
|
361
|
+
},
|
|
362
|
+
};
|
|
363
|
+
const result = await engine.processCommand(publicState, privateState, command);
|
|
364
|
+
expect(result).toBeDefined();
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
// ============================================================
|
|
368
|
+
// SESSION MANAGEMENT
|
|
369
|
+
// ============================================================
|
|
370
|
+
describe('Session Management', () => {
|
|
371
|
+
let publicState;
|
|
372
|
+
let privateState;
|
|
373
|
+
beforeEach(async () => {
|
|
374
|
+
const initResult = await engine.processCommand(null, null, {
|
|
375
|
+
id: 'init',
|
|
376
|
+
type: 'INIT_SESSION_STATE',
|
|
377
|
+
payload: {
|
|
378
|
+
betAmountThresholds: [1.0],
|
|
379
|
+
defaultBetAmount: 1.0,
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
publicState = initResult.publicState;
|
|
383
|
+
privateState = initResult.privateState;
|
|
384
|
+
});
|
|
385
|
+
it('should handle get symbols command', async () => {
|
|
386
|
+
const result = await engine.processCommand(publicState, privateState, {
|
|
387
|
+
id: 'symbols',
|
|
388
|
+
type: 'GET_SYMBOLS',
|
|
389
|
+
payload: {},
|
|
390
|
+
});
|
|
391
|
+
expect(result).toBeDefined();
|
|
392
|
+
expect(result.success).toBe(true);
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
// ============================================================
|
|
396
|
+
// ERROR HANDLING
|
|
397
|
+
// ============================================================
|
|
398
|
+
describe('Error Handling', () => {
|
|
399
|
+
it('should handle unknown command type', async () => {
|
|
400
|
+
const initResult = await engine.processCommand(null, null, {
|
|
401
|
+
id: 'init',
|
|
402
|
+
type: 'INIT_SESSION_STATE',
|
|
403
|
+
payload: {
|
|
404
|
+
betAmountThresholds: [1.0],
|
|
405
|
+
defaultBetAmount: 1.0,
|
|
406
|
+
},
|
|
407
|
+
});
|
|
408
|
+
const result = await engine.processCommand(initResult.publicState, initResult.privateState, {
|
|
409
|
+
id: 'unknown',
|
|
410
|
+
type: 'UNKNOWN_COMMAND',
|
|
411
|
+
payload: {},
|
|
412
|
+
});
|
|
413
|
+
expect(result.success).toBe(false);
|
|
414
|
+
expect(result.message).toContain('Command not found');
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
// ============================================================
|
|
418
|
+
// STATE PERSISTENCE (Serialization/Deserialization)
|
|
419
|
+
// ============================================================
|
|
420
|
+
describe('State Persistence', () => {
|
|
421
|
+
let publicState;
|
|
422
|
+
let privateState;
|
|
423
|
+
beforeEach(async () => {
|
|
424
|
+
const initResult = await engine.processCommand(null, null, {
|
|
425
|
+
id: 'init',
|
|
426
|
+
type: 'INIT_SESSION_STATE',
|
|
427
|
+
payload: {
|
|
428
|
+
betAmountThresholds: [1.0],
|
|
429
|
+
defaultBetAmount: 1.0,
|
|
430
|
+
},
|
|
431
|
+
});
|
|
432
|
+
publicState = initResult.publicState;
|
|
433
|
+
privateState = initResult.privateState;
|
|
434
|
+
});
|
|
435
|
+
it('should serialize and deserialize state correctly', async () => {
|
|
436
|
+
// Spin first to have meaningful state
|
|
437
|
+
const spin = await engine.processCommand(publicState, privateState, {
|
|
438
|
+
id: 'spin',
|
|
439
|
+
type: 'SPIN',
|
|
440
|
+
payload: {
|
|
441
|
+
sessionId: 'test',
|
|
442
|
+
betAmount: 1.0,
|
|
443
|
+
creditsPerLine: 20,
|
|
444
|
+
gameId: 'lucky-sharky',
|
|
445
|
+
gameVersion: '1.0.0',
|
|
446
|
+
},
|
|
447
|
+
});
|
|
448
|
+
// Serialize state
|
|
449
|
+
const serializedPublic = JSON.stringify(spin.publicState);
|
|
450
|
+
const serializedPrivate = JSON.stringify(spin.privateState);
|
|
451
|
+
// Deserialize
|
|
452
|
+
const restoredPublic = JSON.parse(serializedPublic);
|
|
453
|
+
const restoredPrivate = JSON.parse(serializedPrivate);
|
|
454
|
+
// Continue with restored state
|
|
455
|
+
const result = await engine.processCommand(restoredPublic, restoredPrivate, {
|
|
456
|
+
id: 'spin-2',
|
|
457
|
+
type: 'SPIN',
|
|
458
|
+
payload: {
|
|
459
|
+
sessionId: 'test',
|
|
460
|
+
betAmount: 1.0,
|
|
461
|
+
creditsPerLine: 20,
|
|
462
|
+
gameId: 'lucky-sharky',
|
|
463
|
+
gameVersion: '1.0.0',
|
|
464
|
+
},
|
|
465
|
+
});
|
|
466
|
+
expect(result.success).toBe(true);
|
|
467
|
+
});
|
|
468
|
+
it('should preserve bonus state across serialization', async () => {
|
|
469
|
+
// Trigger bonus
|
|
470
|
+
const bonus = await engine.processCommand(publicState, privateState, {
|
|
471
|
+
id: 'trigger',
|
|
472
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
473
|
+
payload: {
|
|
474
|
+
sessionId: 'test',
|
|
475
|
+
bonusType: 'FREE_SPINS',
|
|
476
|
+
betAmount: 1.0,
|
|
477
|
+
},
|
|
478
|
+
});
|
|
479
|
+
expect(bonus.privateState.pendingBonuses.length).toBeGreaterThan(0);
|
|
480
|
+
// Serialize and restore
|
|
481
|
+
const restored = JSON.parse(JSON.stringify(bonus.privateState));
|
|
482
|
+
expect(restored.pendingBonuses.length).toBeGreaterThan(0);
|
|
483
|
+
});
|
|
484
|
+
it('should maintain state across multiple operations', async () => {
|
|
485
|
+
let currentPublic = publicState;
|
|
486
|
+
let currentPrivate = privateState;
|
|
487
|
+
// Perform multiple operations
|
|
488
|
+
for (let i = 0; i < 3; i++) {
|
|
489
|
+
const result = await engine.processCommand(currentPublic, currentPrivate, {
|
|
490
|
+
id: `spin-${i}`,
|
|
491
|
+
type: 'SPIN',
|
|
492
|
+
payload: {
|
|
493
|
+
sessionId: 'test',
|
|
494
|
+
betAmount: 1.0,
|
|
495
|
+
creditsPerLine: 20,
|
|
496
|
+
gameId: 'lucky-sharky',
|
|
497
|
+
gameVersion: '1.0.0',
|
|
498
|
+
},
|
|
499
|
+
});
|
|
500
|
+
expect(result.success).toBe(true);
|
|
501
|
+
currentPublic = result.publicState;
|
|
502
|
+
currentPrivate = result.privateState;
|
|
503
|
+
}
|
|
504
|
+
// Verify state is maintained
|
|
505
|
+
expect(currentPublic).toBeDefined();
|
|
506
|
+
expect(currentPrivate).toBeDefined();
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
});
|
|
510
|
+
//# sourceMappingURL=comprehensive.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comprehensive.test.js","sourceRoot":"","sources":["../../src/__tests__/comprehensive.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DEBUG_TRIGGER_BONUS Command Tests (GLI-19 compliant terminology)
|
|
3
|
+
*
|
|
4
|
+
* Tests for the dev-tools debug command that triggers bonus rounds for testing.
|
|
5
|
+
* Tests the LuckySharkyGameLogic.debugTriggerBonus method directly.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=debug-trigger-bonus.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-trigger-bonus.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/debug-trigger-bonus.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|