@omnitronix/lucky-sharky-game-engine 1.0.9 → 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 (108) 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-simulation.test.d.ts +0 -4
  35. package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -1
  36. package/dist/__tests__/rtp-simulation.test.js +228 -153
  37. package/dist/__tests__/rtp-simulation.test.js.map +1 -1
  38. package/dist/__tests__/spin-generator.test.d.ts +2 -0
  39. package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
  40. package/dist/__tests__/spin-generator.test.js +375 -0
  41. package/dist/__tests__/spin-generator.test.js.map +1 -0
  42. package/dist/__tests__/state-transitions.test.d.ts +2 -0
  43. package/dist/__tests__/state-transitions.test.d.ts.map +1 -0
  44. package/dist/__tests__/state-transitions.test.js +249 -0
  45. package/dist/__tests__/state-transitions.test.js.map +1 -0
  46. package/dist/__tests__/symbol-distribution.test.d.ts +2 -0
  47. package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
  48. package/dist/__tests__/symbol-distribution.test.js +210 -0
  49. package/dist/__tests__/symbol-distribution.test.js.map +1 -0
  50. package/dist/__tests__/win-calculator.test.d.ts +2 -0
  51. package/dist/__tests__/win-calculator.test.d.ts.map +1 -0
  52. package/dist/__tests__/win-calculator.test.js +516 -0
  53. package/dist/__tests__/win-calculator.test.js.map +1 -0
  54. package/dist/config/game-logic-config/game-logic-config.d.ts.map +1 -1
  55. package/dist/config/game-logic-config/game-logic-config.js +0 -25
  56. package/dist/config/game-logic-config/game-logic-config.js.map +1 -1
  57. package/dist/config/reel-strips-config/reels-BASE.csv +0 -0
  58. package/dist/config/reel-strips-config/reels-FREESPINS.csv +0 -0
  59. package/dist/game-engine.interface.d.ts +2 -0
  60. package/dist/game-engine.interface.d.ts.map +1 -1
  61. package/dist/index.d.ts +1 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/logic/game-logic-config.interface.d.ts +0 -8
  64. package/dist/logic/game-logic-config.interface.d.ts.map +1 -1
  65. package/dist/logic/handlers/base-game.handler.d.ts.map +1 -1
  66. package/dist/logic/handlers/base-game.handler.js +3 -6
  67. package/dist/logic/handlers/base-game.handler.js.map +1 -1
  68. package/dist/logic/handlers/free-spins.handler.d.ts.map +1 -1
  69. package/dist/logic/handlers/free-spins.handler.js +2 -2
  70. package/dist/logic/handlers/free-spins.handler.js.map +1 -1
  71. package/dist/logic/handlers/hold-win-bonus.handler.d.ts +0 -5
  72. package/dist/logic/handlers/hold-win-bonus.handler.d.ts.map +1 -1
  73. package/dist/logic/handlers/hold-win-bonus.handler.js +28 -181
  74. package/dist/logic/handlers/hold-win-bonus.handler.js.map +1 -1
  75. package/dist/logic/lucky-sharky.spin-generator.d.ts +2 -2
  76. package/dist/logic/lucky-sharky.spin-generator.d.ts.map +1 -1
  77. package/dist/logic/lucky-sharky.spin-generator.js +61 -161
  78. package/dist/logic/lucky-sharky.spin-generator.js.map +1 -1
  79. package/dist/logic/lucky-sharky.types.d.ts +0 -6
  80. package/dist/logic/lucky-sharky.types.d.ts.map +1 -1
  81. package/dist/logic/lucky-sharky.types.js.map +1 -1
  82. package/dist/logic/lucky-sharky.win-calculator.d.ts.map +1 -1
  83. package/dist/logic/lucky-sharky.win-calculator.js +4 -9
  84. package/dist/logic/lucky-sharky.win-calculator.js.map +1 -1
  85. package/dist/lucky-sharky-v1.game-engine.d.ts +2 -2
  86. package/dist/lucky-sharky-v1.game-engine.d.ts.map +1 -1
  87. package/dist/lucky-sharky-v1.game-engine.js +2 -2
  88. package/dist/lucky-sharky-v1.game-engine.js.map +1 -1
  89. package/dist/rng/rng-client.factory.d.ts.map +1 -1
  90. package/dist/rng/rng-client.factory.js +1 -45
  91. package/dist/rng/rng-client.factory.js.map +1 -1
  92. package/package.json +4 -3
  93. package/dist/__tests__/rng-seed-security.test.d.ts +0 -6
  94. package/dist/__tests__/rng-seed-security.test.d.ts.map +0 -1
  95. package/dist/__tests__/rng-seed-security.test.js +0 -263
  96. package/dist/__tests__/rng-seed-security.test.js.map +0 -1
  97. package/dist/__tests__/rng-seed-type.test.d.ts +0 -16
  98. package/dist/__tests__/rng-seed-type.test.d.ts.map +0 -1
  99. package/dist/__tests__/rng-seed-type.test.js +0 -288
  100. package/dist/__tests__/rng-seed-type.test.js.map +0 -1
  101. package/dist/__tests__/rng-stress-boundary.test.d.ts +0 -5
  102. package/dist/__tests__/rng-stress-boundary.test.d.ts.map +0 -1
  103. package/dist/__tests__/rng-stress-boundary.test.js +0 -395
  104. package/dist/__tests__/rng-stress-boundary.test.js.map +0 -1
  105. package/dist/logger/logger.d.ts +0 -9
  106. package/dist/logger/logger.d.ts.map +0 -1
  107. package/dist/logger/logger.js +0 -35
  108. package/dist/logger/logger.js.map +0 -1
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Error Path Tests — Lucky Sharky
5
+ *
6
+ * Tests error handling and edge cases:
7
+ * - Null/undefined state handling
8
+ * - Invalid command types
9
+ * - Invalid payloads
10
+ * - Corrupted state recovery
11
+ * - Boundary conditions
12
+ */
13
+ const test_engine_factory_1 = require("./helpers/test-engine-factory");
14
+ describe('Error Paths — Lucky Sharky', () => {
15
+ beforeEach(() => {
16
+ (0, test_engine_factory_1.resetCommandIdCounter)();
17
+ });
18
+ describe('Null/Undefined State', () => {
19
+ it('should handle INIT with null states', async () => {
20
+ const engine = (0, test_engine_factory_1.createEngine)();
21
+ await (0, test_engine_factory_1.waitForEngineReady)(engine);
22
+ const result = await engine.processCommand(null, null, {
23
+ id: (0, test_engine_factory_1.nextCommandId)('init'),
24
+ type: 'INIT_SESSION_STATE',
25
+ payload: { betAmountThresholds: [1.0], defaultBetAmount: 1.0 },
26
+ });
27
+ expect(result.success).toBe(true);
28
+ });
29
+ it('should reject SPIN with null public state', async () => {
30
+ const engine = (0, test_engine_factory_1.createEngine)();
31
+ const session = await (0, test_engine_factory_1.initSession)(engine);
32
+ try {
33
+ await (0, test_engine_factory_1.executeSpin)(engine, null, session.privateState);
34
+ }
35
+ catch (error) {
36
+ expect(error).toBeDefined();
37
+ }
38
+ });
39
+ it('should reject SPIN with null private state', async () => {
40
+ const engine = (0, test_engine_factory_1.createEngine)();
41
+ const session = await (0, test_engine_factory_1.initSession)(engine);
42
+ try {
43
+ await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, null);
44
+ }
45
+ catch (error) {
46
+ expect(error).toBeDefined();
47
+ }
48
+ });
49
+ it('should reject SPIN with undefined states', async () => {
50
+ const engine = (0, test_engine_factory_1.createEngine)();
51
+ const session = await (0, test_engine_factory_1.initSession)(engine);
52
+ try {
53
+ await (0, test_engine_factory_1.executeSpin)(engine, undefined, undefined);
54
+ }
55
+ catch (error) {
56
+ expect(error).toBeDefined();
57
+ }
58
+ });
59
+ });
60
+ describe('Invalid Command Types', () => {
61
+ it('should return failure for unknown command type', async () => {
62
+ const engine = (0, test_engine_factory_1.createEngine)();
63
+ const session = await (0, test_engine_factory_1.initSession)(engine);
64
+ try {
65
+ const result = await engine.processCommand(session.publicState, session.privateState, {
66
+ id: (0, test_engine_factory_1.nextCommandId)('bad'),
67
+ type: 'NONEXISTENT_COMMAND',
68
+ payload: {},
69
+ });
70
+ expect(result.success).toBe(false);
71
+ expect(result.message).toContain('not found');
72
+ }
73
+ catch (error) {
74
+ expect(error).toBeDefined();
75
+ }
76
+ });
77
+ it('should return failure for empty command type', async () => {
78
+ const engine = (0, test_engine_factory_1.createEngine)();
79
+ const session = await (0, test_engine_factory_1.initSession)(engine);
80
+ try {
81
+ const result = await engine.processCommand(session.publicState, session.privateState, {
82
+ id: (0, test_engine_factory_1.nextCommandId)('empty'),
83
+ type: '',
84
+ payload: {},
85
+ });
86
+ expect(result.success).toBe(false);
87
+ }
88
+ catch (error) {
89
+ expect(error).toBeDefined();
90
+ }
91
+ });
92
+ });
93
+ describe('Invalid Payloads', () => {
94
+ it('should handle SPIN with negative bet amount', async () => {
95
+ const engine = (0, test_engine_factory_1.createEngine)();
96
+ const session = await (0, test_engine_factory_1.initSession)(engine);
97
+ try {
98
+ const result = await engine.processCommand(session.publicState, session.privateState, {
99
+ id: (0, test_engine_factory_1.nextCommandId)('spin'),
100
+ type: 'SPIN',
101
+ payload: {
102
+ sessionId: 'test',
103
+ betAmount: -1.0,
104
+ creditsPerLine: 1,
105
+ gameId: 'lucky-sharky',
106
+ gameVersion: '1.0.0',
107
+ },
108
+ });
109
+ // Should either reject or handle gracefully
110
+ if (result.success && result.outcome) {
111
+ expect(result.outcome.playerWinning).toBeGreaterThanOrEqual(0);
112
+ }
113
+ }
114
+ catch (error) {
115
+ expect(error).toBeDefined();
116
+ }
117
+ });
118
+ it('should handle SPIN with zero bet amount', async () => {
119
+ const engine = (0, test_engine_factory_1.createEngine)();
120
+ const session = await (0, test_engine_factory_1.initSession)(engine);
121
+ try {
122
+ await engine.processCommand(session.publicState, session.privateState, {
123
+ id: (0, test_engine_factory_1.nextCommandId)('spin'),
124
+ type: 'SPIN',
125
+ payload: {
126
+ sessionId: 'test',
127
+ betAmount: 0,
128
+ creditsPerLine: 1,
129
+ gameId: 'lucky-sharky',
130
+ gameVersion: '1.0.0',
131
+ },
132
+ });
133
+ }
134
+ catch (error) {
135
+ expect(error).toBeDefined();
136
+ }
137
+ });
138
+ it('should handle SPIN with extremely large bet amount', async () => {
139
+ const engine = (0, test_engine_factory_1.createEngine)();
140
+ const session = await (0, test_engine_factory_1.initSession)(engine);
141
+ try {
142
+ const result = await engine.processCommand(session.publicState, session.privateState, {
143
+ id: (0, test_engine_factory_1.nextCommandId)('spin'),
144
+ type: 'SPIN',
145
+ payload: {
146
+ sessionId: 'test',
147
+ betAmount: 999999999,
148
+ creditsPerLine: 1,
149
+ gameId: 'lucky-sharky',
150
+ gameVersion: '1.0.0',
151
+ },
152
+ });
153
+ expect(result).toBeDefined();
154
+ }
155
+ catch (error) {
156
+ expect(error).toBeDefined();
157
+ }
158
+ });
159
+ it('should handle SPIN with missing payload fields', async () => {
160
+ const engine = (0, test_engine_factory_1.createEngine)();
161
+ const session = await (0, test_engine_factory_1.initSession)(engine);
162
+ try {
163
+ const result = await engine.processCommand(session.publicState, session.privateState, {
164
+ id: (0, test_engine_factory_1.nextCommandId)('spin'),
165
+ type: 'SPIN',
166
+ payload: {},
167
+ });
168
+ expect(result).toBeDefined();
169
+ }
170
+ catch (error) {
171
+ expect(error).toBeDefined();
172
+ }
173
+ });
174
+ it('should handle INIT_SESSION_STATE with empty thresholds', async () => {
175
+ const engine = (0, test_engine_factory_1.createEngine)();
176
+ await (0, test_engine_factory_1.waitForEngineReady)(engine);
177
+ try {
178
+ const result = await engine.processCommand(null, null, {
179
+ id: (0, test_engine_factory_1.nextCommandId)('init'),
180
+ type: 'INIT_SESSION_STATE',
181
+ payload: { betAmountThresholds: [], defaultBetAmount: 1.0 },
182
+ });
183
+ expect(result).toBeDefined();
184
+ }
185
+ catch (error) {
186
+ expect(error).toBeDefined();
187
+ }
188
+ });
189
+ });
190
+ describe('Corrupted State', () => {
191
+ it('should handle state with missing nextSpinType', async () => {
192
+ const engine = (0, test_engine_factory_1.createEngine)();
193
+ const session = await (0, test_engine_factory_1.initSession)(engine);
194
+ const corruptedPriv = { ...session.privateState };
195
+ delete corruptedPriv.nextSpinType;
196
+ try {
197
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, corruptedPriv);
198
+ expect(result).toBeDefined();
199
+ }
200
+ catch (error) {
201
+ expect(error).toBeDefined();
202
+ }
203
+ });
204
+ it('should handle state with invalid screen dimensions', async () => {
205
+ const engine = (0, test_engine_factory_1.createEngine)();
206
+ const session = await (0, test_engine_factory_1.initSession)(engine);
207
+ const corruptedPriv = {
208
+ ...session.privateState,
209
+ screen: [[1, 2]], // Wrong dimensions
210
+ };
211
+ try {
212
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, corruptedPriv);
213
+ expect(result).toBeDefined();
214
+ }
215
+ catch (error) {
216
+ expect(error).toBeDefined();
217
+ }
218
+ });
219
+ it('should handle state with negative booster level', async () => {
220
+ const engine = (0, test_engine_factory_1.createEngine)();
221
+ const session = await (0, test_engine_factory_1.initSession)(engine);
222
+ const corruptedPriv = {
223
+ ...session.privateState,
224
+ boosterLevel: -1,
225
+ };
226
+ try {
227
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, corruptedPriv);
228
+ // Should not produce negative wins
229
+ if (result.success && result.outcome) {
230
+ expect(result.outcome.playerWinning).toBeGreaterThanOrEqual(0);
231
+ }
232
+ }
233
+ catch (error) {
234
+ expect(error).toBeDefined();
235
+ }
236
+ });
237
+ });
238
+ describe('Bonus Error Paths', () => {
239
+ it('should reject START_BONUS_ROUND with no pending bonuses', async () => {
240
+ const engine = (0, test_engine_factory_1.createEngine)();
241
+ const session = await (0, test_engine_factory_1.initSession)(engine);
242
+ try {
243
+ const result = await engine.processCommand(session.publicState, session.privateState, {
244
+ id: (0, test_engine_factory_1.nextCommandId)('bonus'),
245
+ type: 'START_BONUS_ROUND',
246
+ payload: {
247
+ sessionId: 'test',
248
+ bonusId: 'non-existent',
249
+ bonusType: 'freeSpins',
250
+ betAmount: 1.0,
251
+ },
252
+ });
253
+ expect(result.success).toBe(false);
254
+ }
255
+ catch (error) {
256
+ expect(error).toBeDefined();
257
+ }
258
+ });
259
+ it('should reject START_BONUS_ROUND with unknown bonus type', async () => {
260
+ const engine = (0, test_engine_factory_1.createEngine)();
261
+ const session = await (0, test_engine_factory_1.initSession)(engine);
262
+ try {
263
+ const result = await engine.processCommand(session.publicState, session.privateState, {
264
+ id: (0, test_engine_factory_1.nextCommandId)('bonus'),
265
+ type: 'START_BONUS_ROUND',
266
+ payload: {
267
+ sessionId: 'test',
268
+ bonusId: 'fake',
269
+ bonusType: 'UNKNOWN_BONUS',
270
+ betAmount: 1.0,
271
+ },
272
+ });
273
+ expect(result.success).toBe(false);
274
+ }
275
+ catch (error) {
276
+ expect(error).toBeDefined();
277
+ }
278
+ });
279
+ it('should handle DEBUG_TRIGGER_BONUS with unknown bonus type', async () => {
280
+ const engine = (0, test_engine_factory_1.createEngine)();
281
+ const session = await (0, test_engine_factory_1.initSession)(engine);
282
+ try {
283
+ const result = await engine.processCommand(session.publicState, session.privateState, {
284
+ id: (0, test_engine_factory_1.nextCommandId)('debug'),
285
+ type: 'DEBUG_TRIGGER_BONUS',
286
+ payload: {
287
+ sessionId: 'test',
288
+ bonusType: 'UNKNOWN_TYPE',
289
+ betAmount: 1.0,
290
+ },
291
+ });
292
+ expect(result).toBeDefined();
293
+ }
294
+ catch (error) {
295
+ expect(error).toBeDefined();
296
+ }
297
+ });
298
+ });
299
+ describe('Win Amount Boundaries', () => {
300
+ it('should never produce negative player winnings', async () => {
301
+ const engine = (0, test_engine_factory_1.createEngine)();
302
+ const session = await (0, test_engine_factory_1.initSession)(engine);
303
+ let pub = session.publicState;
304
+ let priv = session.privateState;
305
+ for (let i = 0; i < 20; i++) {
306
+ if (priv.nextSpinType !== 'BASE_GAME_SPIN')
307
+ break;
308
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, pub, priv);
309
+ expect(result.success).toBe(true);
310
+ if (result.outcome?.playerWinning !== undefined) {
311
+ expect(result.outcome.playerWinning).toBeGreaterThanOrEqual(0);
312
+ }
313
+ pub = result.publicState;
314
+ priv = result.privateState;
315
+ }
316
+ });
317
+ it('should produce wins as numbers, not strings', async () => {
318
+ const engine = (0, test_engine_factory_1.createEngine)();
319
+ const session = await (0, test_engine_factory_1.initSession)(engine);
320
+ const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
321
+ expect(result.success).toBe(true);
322
+ if (result.outcome?.playerWinning !== undefined) {
323
+ expect(typeof result.outcome.playerWinning).toBe('number');
324
+ }
325
+ });
326
+ });
327
+ });
328
+ //# sourceMappingURL=error-paths.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-paths.test.js","sourceRoot":"","sources":["../../src/__tests__/error-paths.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=free-spins-handler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"free-spins-handler.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/free-spins-handler.test.ts"],"names":[],"mappings":""}