@omnitronix/bonnys-fortune-game-engine 1.4.0 → 1.5.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.js +255 -0
- package/dist/__tests__/base-game.test.js.map +1 -0
- package/dist/__tests__/bonnys-fortune-v1.game-engine.test.js +1 -1
- package/dist/__tests__/bonus-handlers.test.js +303 -0
- package/dist/__tests__/bonus-handlers.test.js.map +1 -0
- package/dist/__tests__/bonus-meters.test.js +508 -0
- package/dist/__tests__/bonus-meters.test.js.map +1 -0
- package/dist/__tests__/collect-feature-handler.test.js +386 -0
- package/dist/__tests__/collect-feature-handler.test.js.map +1 -0
- package/dist/__tests__/comprehensive.test.js +16 -10
- package/dist/__tests__/comprehensive.test.js.map +1 -1
- package/dist/__tests__/error-paths.test.js +373 -0
- package/dist/__tests__/error-paths.test.js.map +1 -0
- package/dist/__tests__/helpers/test-engine-factory.js +268 -0
- package/dist/__tests__/helpers/test-engine-factory.js.map +1 -0
- package/dist/__tests__/rng-gli19-compliance.test.js +292 -0
- package/dist/__tests__/rng-gli19-compliance.test.js.map +1 -0
- package/dist/__tests__/rng-security.test.js +383 -0
- package/dist/__tests__/rng-security.test.js.map +1 -0
- package/dist/__tests__/rtp-simulation.test.js +242 -0
- package/dist/__tests__/rtp-simulation.test.js.map +1 -0
- package/dist/__tests__/state-transitions.test.js +307 -0
- package/dist/__tests__/state-transitions.test.js.map +1 -0
- package/dist/__tests__/steering-fortune-handler.test.js +286 -0
- package/dist/__tests__/steering-fortune-handler.test.js.map +1 -0
- package/dist/__tests__/symbol-distribution.test.js +195 -0
- package/dist/__tests__/symbol-distribution.test.js.map +1 -0
- package/dist/__tests__/treasure-hunt-handler.test.js +295 -0
- package/dist/__tests__/treasure-hunt-handler.test.js.map +1 -0
- package/dist/__tests__/win-calculator.test.js +515 -0
- package/dist/__tests__/win-calculator.test.js.map +1 -0
- package/dist/logic/bonnys-fortune.game-logic.js +26 -2
- package/dist/logic/bonnys-fortune.game-logic.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -602,6 +602,16 @@ async function testBonusGame() {
|
|
|
602
602
|
}
|
|
603
603
|
```
|
|
604
604
|
|
|
605
|
+
## Testing
|
|
606
|
+
|
|
607
|
+
This engine uses [@omnitronix/game-test-utils](https://github.com/omnitronix/game-test-utils) for comprehensive testing including:
|
|
608
|
+
- GLI-19 compliance validation
|
|
609
|
+
- RNG security testing
|
|
610
|
+
- Statistical RTP simulation
|
|
611
|
+
- Symbol distribution analysis
|
|
612
|
+
|
|
613
|
+
Run tests: `npm test`
|
|
614
|
+
|
|
605
615
|
## Development
|
|
606
616
|
|
|
607
617
|
### Running Tests
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Base Game Logic Tests — Bonnys Fortune
|
|
5
|
+
*
|
|
6
|
+
* Tests the core base game mechanics:
|
|
7
|
+
* - Screen generation (5x3 grid, 243 ways)
|
|
8
|
+
* - Win calculation (ways evaluation)
|
|
9
|
+
* - Bonus meter tracking and progression
|
|
10
|
+
* - Bet amount handling
|
|
11
|
+
* - Per-bet-amount meter state
|
|
12
|
+
*/
|
|
13
|
+
const test_engine_factory_1 = require("./helpers/test-engine-factory");
|
|
14
|
+
describe('Base Game Logic — Bonnys Fortune', () => {
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
(0, test_engine_factory_1.resetCommandIdCounter)();
|
|
17
|
+
});
|
|
18
|
+
describe('Screen Generation', () => {
|
|
19
|
+
it('should generate a 5x3 screen on each spin', async () => {
|
|
20
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
21
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
22
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
23
|
+
expect(result.success).toBe(true);
|
|
24
|
+
const screen = result.outcome?.result?.screen ?? result.outcome?.screen;
|
|
25
|
+
expect(screen).toBeDefined();
|
|
26
|
+
expect(screen.length).toBe(5);
|
|
27
|
+
for (const reel of screen) {
|
|
28
|
+
expect(reel.length).toBe(3);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
it('should produce valid symbol IDs on screen', async () => {
|
|
32
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
33
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
34
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
35
|
+
expect(result.success).toBe(true);
|
|
36
|
+
const screen = result.outcome?.result?.screen ?? result.outcome?.screen;
|
|
37
|
+
for (const reel of screen) {
|
|
38
|
+
for (const symbol of reel) {
|
|
39
|
+
expect(typeof symbol).toBe('number');
|
|
40
|
+
expect(symbol).toBeGreaterThanOrEqual(0);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
it('should produce different screens across multiple spins', async () => {
|
|
45
|
+
// Use LCG RNG to avoid DummyRng producing identical screens and
|
|
46
|
+
// constant bonus meter triggers that prevent base game spins
|
|
47
|
+
const { engine } = (0, test_engine_factory_1.createEngineWithLcgRng)(54321);
|
|
48
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
49
|
+
let pub = session.publicState;
|
|
50
|
+
let priv = session.privateState;
|
|
51
|
+
const screens = [];
|
|
52
|
+
for (let i = 0; i < 50; i++) {
|
|
53
|
+
if (priv.nextSpinType !== 'BASE_GAME_SPIN') {
|
|
54
|
+
// Bonus triggered — complete it via extractFinalBonusState
|
|
55
|
+
if (priv.pendingBonuses?.length > 0) {
|
|
56
|
+
const bonus = priv.pendingBonuses[0];
|
|
57
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, pub, priv, bonus.bonusType);
|
|
58
|
+
const finalState = (0, test_engine_factory_1.extractFinalBonusState)(bonusResult);
|
|
59
|
+
pub = finalState.publicState;
|
|
60
|
+
priv = finalState.privateState;
|
|
61
|
+
// Handle chained bonuses (steering fortune)
|
|
62
|
+
while (priv.pendingBonuses?.length > 0) {
|
|
63
|
+
const nextBonus = priv.pendingBonuses[0];
|
|
64
|
+
const chainResult = await (0, test_engine_factory_1.startBonusRound)(engine, pub, priv, nextBonus.bonusType);
|
|
65
|
+
const chainFinal = (0, test_engine_factory_1.extractFinalBonusState)(chainResult);
|
|
66
|
+
pub = chainFinal.publicState;
|
|
67
|
+
priv = chainFinal.privateState;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (priv.nextSpinType !== 'BASE_GAME_SPIN')
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, pub, priv);
|
|
74
|
+
expect(result.success).toBe(true);
|
|
75
|
+
const screen = result.outcome?.result?.screen ?? result.outcome?.screen ?? result.privateState.screen;
|
|
76
|
+
screens.push(JSON.stringify(screen));
|
|
77
|
+
pub = result.publicState;
|
|
78
|
+
priv = result.privateState;
|
|
79
|
+
}
|
|
80
|
+
const unique = new Set(screens);
|
|
81
|
+
expect(unique.size).toBeGreaterThan(1);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('Win Calculation', () => {
|
|
85
|
+
it('should report playerWinning as non-negative number', async () => {
|
|
86
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
87
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
88
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
89
|
+
expect(result.success).toBe(true);
|
|
90
|
+
const playerWinning = result.outcome?.result?.playerWinning ?? result.outcome?.playerWinning;
|
|
91
|
+
if (playerWinning !== undefined) {
|
|
92
|
+
expect(playerWinning).toBeGreaterThanOrEqual(0);
|
|
93
|
+
expect(typeof playerWinning).toBe('number');
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
it('should produce finite win amounts', async () => {
|
|
97
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
98
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
99
|
+
let pub = session.publicState;
|
|
100
|
+
let priv = session.privateState;
|
|
101
|
+
for (let i = 0; i < 20; i++) {
|
|
102
|
+
if (priv.nextSpinType !== 'BASE_GAME_SPIN')
|
|
103
|
+
break;
|
|
104
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, pub, priv);
|
|
105
|
+
expect(result.success).toBe(true);
|
|
106
|
+
const playerWinning = result.outcome?.result?.playerWinning ?? result.outcome?.playerWinning;
|
|
107
|
+
if (playerWinning !== undefined) {
|
|
108
|
+
expect(Number.isFinite(playerWinning)).toBe(true);
|
|
109
|
+
}
|
|
110
|
+
pub = result.publicState;
|
|
111
|
+
priv = result.privateState;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('Bonus Meter Mechanics', () => {
|
|
116
|
+
it('should have bonus meters in public state after init', async () => {
|
|
117
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
118
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
119
|
+
expect(session.publicState.bonusMeters).toBeDefined();
|
|
120
|
+
const keys = Object.keys(session.publicState.bonusMeters || {});
|
|
121
|
+
expect(keys.length).toBeGreaterThan(0);
|
|
122
|
+
});
|
|
123
|
+
it('should have valid threshold and progress for each meter', async () => {
|
|
124
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
125
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
126
|
+
const meters = session.publicState.bonusMeters;
|
|
127
|
+
for (const [, meter] of Object.entries(meters || {})) {
|
|
128
|
+
const m = meter;
|
|
129
|
+
expect(m.threshold).toBeGreaterThan(0);
|
|
130
|
+
expect(m.progress).toBeGreaterThanOrEqual(0);
|
|
131
|
+
expect(typeof m.threshold).toBe('number');
|
|
132
|
+
expect(typeof m.progress).toBe('number');
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
it('should maintain meter state across spins', async () => {
|
|
136
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
137
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
138
|
+
let pub = session.publicState;
|
|
139
|
+
let priv = session.privateState;
|
|
140
|
+
for (let i = 0; i < 10; i++) {
|
|
141
|
+
if (priv.nextSpinType !== 'BASE_GAME_SPIN')
|
|
142
|
+
break;
|
|
143
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, pub, priv);
|
|
144
|
+
expect(result.success).toBe(true);
|
|
145
|
+
expect(result.publicState.bonusMeters).toBeDefined();
|
|
146
|
+
// Verify meter structure integrity
|
|
147
|
+
for (const [, meter] of Object.entries(result.publicState.bonusMeters || {})) {
|
|
148
|
+
const m = meter;
|
|
149
|
+
expect(m.threshold).toBeGreaterThan(0);
|
|
150
|
+
expect(m.progress).toBeGreaterThanOrEqual(0);
|
|
151
|
+
expect(m.progress).toBeLessThanOrEqual(m.threshold);
|
|
152
|
+
}
|
|
153
|
+
pub = result.publicState;
|
|
154
|
+
priv = result.privateState;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
it('should not allow meter progress to exceed threshold', async () => {
|
|
158
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
159
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
160
|
+
let pub = session.publicState;
|
|
161
|
+
let priv = session.privateState;
|
|
162
|
+
for (let i = 0; i < 30; i++) {
|
|
163
|
+
if (priv.nextSpinType !== 'BASE_GAME_SPIN')
|
|
164
|
+
break;
|
|
165
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, pub, priv);
|
|
166
|
+
expect(result.success).toBe(true);
|
|
167
|
+
for (const [, meter] of Object.entries(result.publicState.bonusMeters || {})) {
|
|
168
|
+
const m = meter;
|
|
169
|
+
expect(m.progress).toBeLessThanOrEqual(m.threshold);
|
|
170
|
+
}
|
|
171
|
+
pub = result.publicState;
|
|
172
|
+
priv = result.privateState;
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
it('should have per-bet-amount meter state in private state', async () => {
|
|
176
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
177
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
178
|
+
expect(session.privateState.bonusMetersByAmount).toBeDefined();
|
|
179
|
+
const amounts = Object.keys(session.privateState.bonusMetersByAmount || {});
|
|
180
|
+
expect(amounts.length).toBeGreaterThan(0);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
describe('RNG Outcome Tracking', () => {
|
|
184
|
+
it('should produce valid RNG outcome on each spin', async () => {
|
|
185
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
186
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
187
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
188
|
+
expect(result.success).toBe(true);
|
|
189
|
+
expect(result.rngOutcome).toBeDefined();
|
|
190
|
+
const validation = (0, test_engine_factory_1.validateRngOutcome)(result.rngOutcome);
|
|
191
|
+
expect(validation.valid).toBe(true);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
describe('Bet Amount Handling', () => {
|
|
195
|
+
it('should accept different bet amounts', async () => {
|
|
196
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
197
|
+
const session = await (0, test_engine_factory_1.initSession)(engine, 0.5);
|
|
198
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState, 0.5);
|
|
199
|
+
expect(result.success).toBe(true);
|
|
200
|
+
});
|
|
201
|
+
it('should update currentBetAmount in public state', async () => {
|
|
202
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
203
|
+
const session = await (0, test_engine_factory_1.initSession)(engine, 2.0);
|
|
204
|
+
expect(session.publicState.currentBetAmount).toBe(2.0);
|
|
205
|
+
});
|
|
206
|
+
it('should switch meter state when bet amount changes', async () => {
|
|
207
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
208
|
+
const session = await (0, test_engine_factory_1.initSession)(engine, 1.0);
|
|
209
|
+
const result1 = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState, 1.0);
|
|
210
|
+
expect(result1.success).toBe(true);
|
|
211
|
+
if (result1.privateState.nextSpinType === 'BASE_GAME_SPIN') {
|
|
212
|
+
// Change bet amount
|
|
213
|
+
const result2 = await (0, test_engine_factory_1.executeSpin)(engine, result1.publicState, result1.privateState, 2.0);
|
|
214
|
+
expect(result2.success).toBe(true);
|
|
215
|
+
// Meters should still be valid
|
|
216
|
+
expect(result2.publicState.bonusMeters).toBeDefined();
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
describe('Mock RNG Determinism', () => {
|
|
221
|
+
it('should produce deterministic results with mock RNG', async () => {
|
|
222
|
+
const { engine: engine1 } = (0, test_engine_factory_1.createEngineWithMockRng)([42, 42, 42, 42, 42]);
|
|
223
|
+
const { engine: engine2 } = (0, test_engine_factory_1.createEngineWithMockRng)([42, 42, 42, 42, 42]);
|
|
224
|
+
const session1 = await (0, test_engine_factory_1.initSession)(engine1);
|
|
225
|
+
const session2 = await (0, test_engine_factory_1.initSession)(engine2);
|
|
226
|
+
const result1 = await (0, test_engine_factory_1.executeSpin)(engine1, session1.publicState, session1.privateState);
|
|
227
|
+
const result2 = await (0, test_engine_factory_1.executeSpin)(engine2, session2.publicState, session2.privateState);
|
|
228
|
+
expect(result1.success).toBe(true);
|
|
229
|
+
expect(result2.success).toBe(true);
|
|
230
|
+
const screen1 = JSON.stringify(result1.outcome?.screen || result1.privateState.screen);
|
|
231
|
+
const screen2 = JSON.stringify(result2.outcome?.screen || result2.privateState.screen);
|
|
232
|
+
expect(screen1).toBe(screen2);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
describe('Multiple Spin Stability', () => {
|
|
236
|
+
it('should handle 30 consecutive base game spins', async () => {
|
|
237
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
238
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
239
|
+
let pub = session.publicState;
|
|
240
|
+
let priv = session.privateState;
|
|
241
|
+
let spinCount = 0;
|
|
242
|
+
for (let i = 0; i < 30; i++) {
|
|
243
|
+
if (priv.nextSpinType !== 'BASE_GAME_SPIN')
|
|
244
|
+
break;
|
|
245
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, pub, priv);
|
|
246
|
+
expect(result.success).toBe(true);
|
|
247
|
+
spinCount++;
|
|
248
|
+
pub = result.publicState;
|
|
249
|
+
priv = result.privateState;
|
|
250
|
+
}
|
|
251
|
+
expect(spinCount).toBeGreaterThan(0);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
//# sourceMappingURL=base-game.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-game.test.js","sourceRoot":"","sources":["../../src/__tests__/base-game.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ describe('BonnysFortuneV1GameEngine', () => {
|
|
|
10
10
|
it('should initialize the game engine and return info', async () => {
|
|
11
11
|
const info = gameEngine.getGameEngineInfo();
|
|
12
12
|
expect(info.gameCode).toBe('bonnys-fortune');
|
|
13
|
-
expect(info.version).toBe('1.
|
|
13
|
+
expect(info.version).toBe('1.5.0');
|
|
14
14
|
expect(info.rtp).toBe(96);
|
|
15
15
|
expect(info.gameType).toBe('slot');
|
|
16
16
|
});
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Bonus Handler Tests — Bonnys Fortune
|
|
5
|
+
*
|
|
6
|
+
* Tests all 4 bonus types via debug trigger:
|
|
7
|
+
* - Treasure Hunt (bonusGame1): pick mechanic, jackpots
|
|
8
|
+
* - Free Spins (bonusGame2): ways evaluation, multipliers
|
|
9
|
+
* - Steering Fortune (bonusGame3): wheel spin, prize resolution
|
|
10
|
+
* - Collect Feature (collectFeature): symbol collection, checkpoints
|
|
11
|
+
* - Debug trigger → START_BONUS_ROUND flow
|
|
12
|
+
* - Meter redraw after bonus completion
|
|
13
|
+
*/
|
|
14
|
+
const test_engine_factory_1 = require("./helpers/test-engine-factory");
|
|
15
|
+
describe('Bonus Handlers — Bonnys Fortune', () => {
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
(0, test_engine_factory_1.resetCommandIdCounter)();
|
|
18
|
+
});
|
|
19
|
+
describe('Treasure Hunt (bonusGame1)', () => {
|
|
20
|
+
it('should trigger treasure hunt via debug successfully', async () => {
|
|
21
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
22
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
23
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame1');
|
|
24
|
+
expect(debugResult.success).toBe(true);
|
|
25
|
+
// Debug trigger adds exactly 1 pending bonus
|
|
26
|
+
expect(debugResult.privateState.pendingBonuses.length).toBe(1);
|
|
27
|
+
});
|
|
28
|
+
it('should complete treasure hunt and return to BASE_GAME_SPIN', async () => {
|
|
29
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
30
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
31
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame1');
|
|
32
|
+
if (!debugResult.success)
|
|
33
|
+
return;
|
|
34
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
35
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
36
|
+
expect(bonusResult.success).toBe(true);
|
|
37
|
+
// BF generates all bonus results upfront — final state is in last result
|
|
38
|
+
const finalState = (0, test_engine_factory_1.extractFinalBonusState)(bonusResult);
|
|
39
|
+
expect(finalState.privateState.nextSpinType).toBe('BASE_GAME_SPIN');
|
|
40
|
+
});
|
|
41
|
+
it('should produce non-negative winnings from treasure hunt', async () => {
|
|
42
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
43
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
44
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame1');
|
|
45
|
+
if (!debugResult.success)
|
|
46
|
+
return;
|
|
47
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
48
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
49
|
+
expect(bonusResult.success).toBe(true);
|
|
50
|
+
if (bonusResult.outcome) {
|
|
51
|
+
const outcomes = Array.isArray(bonusResult.outcome)
|
|
52
|
+
? bonusResult.outcome
|
|
53
|
+
: [bonusResult.outcome];
|
|
54
|
+
for (const o of outcomes) {
|
|
55
|
+
if (o.playerWinning !== undefined) {
|
|
56
|
+
expect(o.playerWinning).toBeGreaterThanOrEqual(0);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
it('should include RNG outcome in treasure hunt', async () => {
|
|
62
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
63
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
64
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame1');
|
|
65
|
+
if (!debugResult.success)
|
|
66
|
+
return;
|
|
67
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
68
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
69
|
+
expect(bonusResult.success).toBe(true);
|
|
70
|
+
expect(bonusResult.rngOutcome).toBeDefined();
|
|
71
|
+
expect(typeof bonusResult.rngOutcome).toBe('object');
|
|
72
|
+
expect(Object.keys(bonusResult.rngOutcome || {}).length).toBeGreaterThan(0);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('Free Spins (bonusGame2)', () => {
|
|
76
|
+
it('should trigger free spins via debug successfully', async () => {
|
|
77
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
78
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
79
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame2');
|
|
80
|
+
expect(debugResult.success).toBe(true);
|
|
81
|
+
// Debug trigger adds exactly 1 pending bonus
|
|
82
|
+
expect(debugResult.privateState.pendingBonuses.length).toBe(1);
|
|
83
|
+
});
|
|
84
|
+
it('should complete free spins and return to BASE_GAME_SPIN', async () => {
|
|
85
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
86
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
87
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame2');
|
|
88
|
+
if (!debugResult.success)
|
|
89
|
+
return;
|
|
90
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
91
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
92
|
+
expect(bonusResult.success).toBe(true);
|
|
93
|
+
// BF generates all bonus results upfront — final state is in last result
|
|
94
|
+
const finalState = (0, test_engine_factory_1.extractFinalBonusState)(bonusResult);
|
|
95
|
+
expect(finalState.privateState.nextSpinType).toBe('BASE_GAME_SPIN');
|
|
96
|
+
});
|
|
97
|
+
it('should produce non-negative winnings from free spins', async () => {
|
|
98
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
99
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
100
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame2');
|
|
101
|
+
if (!debugResult.success)
|
|
102
|
+
return;
|
|
103
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
104
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
105
|
+
expect(bonusResult.success).toBe(true);
|
|
106
|
+
if (bonusResult.outcome) {
|
|
107
|
+
const outcomes = Array.isArray(bonusResult.outcome)
|
|
108
|
+
? bonusResult.outcome
|
|
109
|
+
: [bonusResult.outcome];
|
|
110
|
+
for (const o of outcomes) {
|
|
111
|
+
if (o.playerWinning !== undefined) {
|
|
112
|
+
expect(o.playerWinning).toBeGreaterThanOrEqual(0);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('Steering Fortune (bonusGame3)', () => {
|
|
119
|
+
it('should trigger steering fortune via debug successfully', async () => {
|
|
120
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
121
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
122
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame3');
|
|
123
|
+
expect(debugResult.success).toBe(true);
|
|
124
|
+
// Debug trigger adds exactly 1 pending bonus
|
|
125
|
+
expect(debugResult.privateState.pendingBonuses.length).toBe(1);
|
|
126
|
+
});
|
|
127
|
+
it('should complete steering fortune', async () => {
|
|
128
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
129
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
130
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame3');
|
|
131
|
+
if (!debugResult.success)
|
|
132
|
+
return;
|
|
133
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
134
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
135
|
+
expect(bonusResult.success).toBe(true);
|
|
136
|
+
// Steering Fortune may chain to another bonus type
|
|
137
|
+
const finalState = (0, test_engine_factory_1.extractFinalBonusState)(bonusResult);
|
|
138
|
+
expect(finalState.privateState.nextSpinType).toBeDefined();
|
|
139
|
+
});
|
|
140
|
+
it('should handle steering fortune chaining to another bonus', async () => {
|
|
141
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
142
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
143
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame3');
|
|
144
|
+
if (!debugResult.success)
|
|
145
|
+
return;
|
|
146
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
147
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
148
|
+
expect(bonusResult.success).toBe(true);
|
|
149
|
+
// If it chained to another bonus, complete that too
|
|
150
|
+
const finalState = (0, test_engine_factory_1.extractFinalBonusState)(bonusResult);
|
|
151
|
+
if (finalState.privateState.pendingBonuses?.length > 0) {
|
|
152
|
+
const nextBonus = finalState.privateState.pendingBonuses[0];
|
|
153
|
+
const nextResult = await (0, test_engine_factory_1.startBonusRound)(engine, finalState.publicState, finalState.privateState, nextBonus.bonusType);
|
|
154
|
+
expect(nextResult.success).toBe(true);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('Collect Feature (collectFeature)', () => {
|
|
159
|
+
it('should trigger collect feature via debug successfully', async () => {
|
|
160
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
161
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
162
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'collectFeature');
|
|
163
|
+
expect(debugResult.success).toBe(true);
|
|
164
|
+
// Debug trigger adds exactly 1 pending bonus
|
|
165
|
+
expect(debugResult.privateState.pendingBonuses.length).toBe(1);
|
|
166
|
+
});
|
|
167
|
+
it('should complete collect feature and return to BASE_GAME_SPIN', async () => {
|
|
168
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
169
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
170
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'collectFeature');
|
|
171
|
+
if (!debugResult.success)
|
|
172
|
+
return;
|
|
173
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
174
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
175
|
+
expect(bonusResult.success).toBe(true);
|
|
176
|
+
// BF generates all bonus results upfront — final state is in last result
|
|
177
|
+
const finalState = (0, test_engine_factory_1.extractFinalBonusState)(bonusResult);
|
|
178
|
+
expect(finalState.privateState.nextSpinType).toBe('BASE_GAME_SPIN');
|
|
179
|
+
});
|
|
180
|
+
it('should produce non-negative winnings from collect feature', async () => {
|
|
181
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
182
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
183
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'collectFeature');
|
|
184
|
+
if (!debugResult.success)
|
|
185
|
+
return;
|
|
186
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
187
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
188
|
+
expect(bonusResult.success).toBe(true);
|
|
189
|
+
if (bonusResult.outcome) {
|
|
190
|
+
const outcomes = Array.isArray(bonusResult.outcome)
|
|
191
|
+
? bonusResult.outcome
|
|
192
|
+
: [bonusResult.outcome];
|
|
193
|
+
for (const o of outcomes) {
|
|
194
|
+
if (o.playerWinning !== undefined) {
|
|
195
|
+
expect(o.playerWinning).toBeGreaterThanOrEqual(0);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
describe('Meter Redraw After Bonus', () => {
|
|
202
|
+
it('should redraw meter after non-collectFeature bonus', async () => {
|
|
203
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
204
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
205
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame1');
|
|
206
|
+
if (!debugResult.success)
|
|
207
|
+
return;
|
|
208
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
209
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
210
|
+
expect(bonusResult.success).toBe(true);
|
|
211
|
+
// After bonus, meters should be valid (may have been redrawn)
|
|
212
|
+
const finalMeters = bonusResult.publicState.bonusMeters;
|
|
213
|
+
expect(finalMeters).toBeDefined();
|
|
214
|
+
expect(typeof finalMeters).toBe('object');
|
|
215
|
+
// Should have 3 meters (bonusGame1, bonusGame2, bonusGame3)
|
|
216
|
+
expect(Object.keys(finalMeters || {}).length).toBe(3);
|
|
217
|
+
for (const [, meter] of Object.entries(finalMeters || {})) {
|
|
218
|
+
const m = meter;
|
|
219
|
+
expect(m.threshold).toBeGreaterThan(0);
|
|
220
|
+
expect(m.progress).toBeGreaterThanOrEqual(0);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
describe('Post-Bonus Play', () => {
|
|
225
|
+
it('should allow normal spin after treasure hunt', async () => {
|
|
226
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
227
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
228
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame1');
|
|
229
|
+
if (!debugResult.success)
|
|
230
|
+
return;
|
|
231
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
232
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
233
|
+
expect(bonusResult.success).toBe(true);
|
|
234
|
+
const finalState1 = (0, test_engine_factory_1.extractFinalBonusState)(bonusResult);
|
|
235
|
+
if (finalState1.privateState.nextSpinType === 'BASE_GAME_SPIN') {
|
|
236
|
+
const spinResult = await (0, test_engine_factory_1.executeSpin)(engine, finalState1.publicState, finalState1.privateState);
|
|
237
|
+
expect(spinResult.success).toBe(true);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
it('should allow normal spin after free spins', async () => {
|
|
241
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
242
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
243
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame2');
|
|
244
|
+
if (!debugResult.success)
|
|
245
|
+
return;
|
|
246
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
247
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
248
|
+
expect(bonusResult.success).toBe(true);
|
|
249
|
+
const finalState2 = (0, test_engine_factory_1.extractFinalBonusState)(bonusResult);
|
|
250
|
+
if (finalState2.privateState.nextSpinType === 'BASE_GAME_SPIN') {
|
|
251
|
+
const spinResult = await (0, test_engine_factory_1.executeSpin)(engine, finalState2.publicState, finalState2.privateState);
|
|
252
|
+
expect(spinResult.success).toBe(true);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
it('should allow normal spin after collect feature', async () => {
|
|
256
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
257
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
258
|
+
const debugResult = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'collectFeature');
|
|
259
|
+
if (!debugResult.success)
|
|
260
|
+
return;
|
|
261
|
+
const bonus = debugResult.privateState.pendingBonuses[0];
|
|
262
|
+
const bonusResult = await (0, test_engine_factory_1.startBonusRound)(engine, debugResult.publicState, debugResult.privateState, bonus.bonusType);
|
|
263
|
+
expect(bonusResult.success).toBe(true);
|
|
264
|
+
const finalState3 = (0, test_engine_factory_1.extractFinalBonusState)(bonusResult);
|
|
265
|
+
if (finalState3.privateState.nextSpinType === 'BASE_GAME_SPIN') {
|
|
266
|
+
const spinResult = await (0, test_engine_factory_1.executeSpin)(engine, finalState3.publicState, finalState3.privateState);
|
|
267
|
+
expect(spinResult.success).toBe(true);
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
describe('Debug Trigger Mechanics', () => {
|
|
272
|
+
it('should support all 4 bonus types via debug', async () => {
|
|
273
|
+
const types = ['bonusGame1', 'bonusGame2', 'bonusGame3', 'collectFeature'];
|
|
274
|
+
for (const type of types) {
|
|
275
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
276
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
277
|
+
const result = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, type);
|
|
278
|
+
expect(result.success).toBe(true);
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
it('should add bonus to pending list with valid bonusId', async () => {
|
|
282
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
283
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
284
|
+
const result = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame1');
|
|
285
|
+
expect(result.success).toBe(true);
|
|
286
|
+
const bonus = result.privateState.pendingBonuses[0];
|
|
287
|
+
expect(bonus).toBeDefined();
|
|
288
|
+
expect(bonus.bonusId).toBeDefined();
|
|
289
|
+
expect(typeof bonus.bonusId).toBe('string');
|
|
290
|
+
// UUID format: at least 32 characters (without dashes) or 36 with dashes
|
|
291
|
+
expect(bonus.bonusId.length).toBeGreaterThanOrEqual(32);
|
|
292
|
+
});
|
|
293
|
+
it('should preserve bet amount in triggered bonus', async () => {
|
|
294
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
295
|
+
const session = await (0, test_engine_factory_1.initSession)(engine, 5.0);
|
|
296
|
+
const result = await (0, test_engine_factory_1.debugTriggerBonus)(engine, session.publicState, session.privateState, 'bonusGame1', 5.0);
|
|
297
|
+
expect(result.success).toBe(true);
|
|
298
|
+
const bonus = result.privateState.pendingBonuses[0];
|
|
299
|
+
expect(bonus.betAmount).toBe(5.0);
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
//# sourceMappingURL=bonus-handlers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bonus-handlers.test.js","sourceRoot":"","sources":["../../src/__tests__/bonus-handlers.test.ts"],"names":[],"mappings":"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"}
|