@omnitronix/happy-panda-game-engine 0.5.1
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 +732 -0
- package/dist/__tests__/bonus-sequence.test.d.ts +7 -0
- package/dist/__tests__/bonus-sequence.test.d.ts.map +1 -0
- package/dist/__tests__/bonus-sequence.test.js +381 -0
- package/dist/__tests__/bonus-sequence.test.js.map +1 -0
- package/dist/__tests__/cherry-frequency.test.d.ts +8 -0
- package/dist/__tests__/cherry-frequency.test.d.ts.map +1 -0
- package/dist/__tests__/cherry-frequency.test.js +128 -0
- package/dist/__tests__/cherry-frequency.test.js.map +1 -0
- package/dist/__tests__/comprehensive.test.d.ts +16 -0
- package/dist/__tests__/comprehensive.test.d.ts.map +1 -0
- package/dist/__tests__/comprehensive.test.js +491 -0
- package/dist/__tests__/comprehensive.test.js.map +1 -0
- package/dist/__tests__/counter-manager.test.d.ts +7 -0
- package/dist/__tests__/counter-manager.test.d.ts.map +1 -0
- package/dist/__tests__/counter-manager.test.js +317 -0
- package/dist/__tests__/counter-manager.test.js.map +1 -0
- package/dist/__tests__/coverage-boost.test.d.ts +13 -0
- package/dist/__tests__/coverage-boost.test.d.ts.map +1 -0
- package/dist/__tests__/coverage-boost.test.js +606 -0
- package/dist/__tests__/coverage-boost.test.js.map +1 -0
- package/dist/__tests__/cpp-parity.test.d.ts +39 -0
- package/dist/__tests__/cpp-parity.test.d.ts.map +1 -0
- package/dist/__tests__/cpp-parity.test.js +392 -0
- package/dist/__tests__/cpp-parity.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__/debug-trigger-bonus.test.js +359 -0
- package/dist/__tests__/debug-trigger-bonus.test.js.map +1 -0
- package/dist/__tests__/fixtures/cpp-parity-vectors.json +457 -0
- package/dist/__tests__/gdd-validation-1000.test.d.ts +14 -0
- package/dist/__tests__/gdd-validation-1000.test.d.ts.map +1 -0
- package/dist/__tests__/gdd-validation-1000.test.js +418 -0
- package/dist/__tests__/gdd-validation-1000.test.js.map +1 -0
- package/dist/__tests__/happy-panda-engine.test.d.ts +7 -0
- package/dist/__tests__/happy-panda-engine.test.d.ts.map +1 -0
- package/dist/__tests__/happy-panda-engine.test.js +414 -0
- package/dist/__tests__/happy-panda-engine.test.js.map +1 -0
- package/dist/__tests__/jackpot-manager.test.d.ts +8 -0
- package/dist/__tests__/jackpot-manager.test.d.ts.map +1 -0
- package/dist/__tests__/jackpot-manager.test.js +313 -0
- package/dist/__tests__/jackpot-manager.test.js.map +1 -0
- package/dist/__tests__/jackpot-trigger-trace.test.d.ts +6 -0
- package/dist/__tests__/jackpot-trigger-trace.test.d.ts.map +1 -0
- package/dist/__tests__/jackpot-trigger-trace.test.js +146 -0
- package/dist/__tests__/jackpot-trigger-trace.test.js.map +1 -0
- package/dist/__tests__/rng-gli19-compliance.test.d.ts +21 -0
- package/dist/__tests__/rng-gli19-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/rng-gli19-compliance.test.js +480 -0
- package/dist/__tests__/rng-gli19-compliance.test.js.map +1 -0
- package/dist/__tests__/rng-seed-security.test.d.ts +19 -0
- package/dist/__tests__/rng-seed-security.test.d.ts.map +1 -0
- package/dist/__tests__/rng-seed-security.test.js +518 -0
- package/dist/__tests__/rng-seed-security.test.js.map +1 -0
- package/dist/__tests__/rng-seed-type.test.d.ts +16 -0
- package/dist/__tests__/rng-seed-type.test.d.ts.map +1 -0
- package/dist/__tests__/rng-seed-type.test.js +285 -0
- package/dist/__tests__/rng-seed-type.test.js.map +1 -0
- package/dist/__tests__/rng-stress-boundary.test.d.ts +15 -0
- package/dist/__tests__/rng-stress-boundary.test.d.ts.map +1 -0
- package/dist/__tests__/rng-stress-boundary.test.js +590 -0
- package/dist/__tests__/rng-stress-boundary.test.js.map +1 -0
- package/dist/__tests__/rtp-1million.test.d.ts +8 -0
- package/dist/__tests__/rtp-1million.test.d.ts.map +1 -0
- package/dist/__tests__/rtp-1million.test.js +156 -0
- package/dist/__tests__/rtp-1million.test.js.map +1 -0
- package/dist/__tests__/rtp-analysis.test.d.ts +8 -0
- package/dist/__tests__/rtp-analysis.test.d.ts.map +1 -0
- package/dist/__tests__/rtp-analysis.test.js +138 -0
- package/dist/__tests__/rtp-analysis.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 +141 -0
- package/dist/__tests__/rtp-diagnostic.test.js.map +1 -0
- package/dist/__tests__/rtp-simulation.test.d.ts +8 -0
- package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -0
- package/dist/__tests__/rtp-simulation.test.js +411 -0
- package/dist/__tests__/rtp-simulation.test.js.map +1 -0
- package/dist/__tests__/special-wins.test.d.ts +7 -0
- package/dist/__tests__/special-wins.test.d.ts.map +1 -0
- package/dist/__tests__/special-wins.test.js +179 -0
- package/dist/__tests__/special-wins.test.js.map +1 -0
- package/dist/__tests__/spin-generator.test.d.ts +7 -0
- package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
- package/dist/__tests__/spin-generator.test.js +297 -0
- package/dist/__tests__/spin-generator.test.js.map +1 -0
- package/dist/__tests__/spin-handler.test.d.ts +7 -0
- package/dist/__tests__/spin-handler.test.d.ts.map +1 -0
- package/dist/__tests__/spin-handler.test.js +210 -0
- package/dist/__tests__/spin-handler.test.js.map +1 -0
- package/dist/__tests__/symbol-distribution.test.d.ts +6 -0
- package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
- package/dist/__tests__/symbol-distribution.test.js +119 -0
- package/dist/__tests__/symbol-distribution.test.js.map +1 -0
- package/dist/__tests__/test-protocol-10000-spin.test.d.ts +14 -0
- package/dist/__tests__/test-protocol-10000-spin.test.d.ts.map +1 -0
- package/dist/__tests__/test-protocol-10000-spin.test.js +359 -0
- package/dist/__tests__/test-protocol-10000-spin.test.js.map +1 -0
- package/dist/__tests__/weighted-random.test.d.ts +7 -0
- package/dist/__tests__/weighted-random.test.d.ts.map +1 -0
- package/dist/__tests__/weighted-random.test.js +165 -0
- package/dist/__tests__/weighted-random.test.js.map +1 -0
- package/dist/__tests__/win-evaluator.test.d.ts +7 -0
- package/dist/__tests__/win-evaluator.test.d.ts.map +1 -0
- package/dist/__tests__/win-evaluator.test.js +264 -0
- package/dist/__tests__/win-evaluator.test.js.map +1 -0
- package/dist/config/happy-panda.config.d.ts +217 -0
- package/dist/config/happy-panda.config.d.ts.map +1 -0
- package/dist/config/happy-panda.config.js +721 -0
- package/dist/config/happy-panda.config.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +21 -0
- package/dist/config/index.js.map +1 -0
- package/dist/debug/debug-command-definitions.d.ts +38 -0
- package/dist/debug/debug-command-definitions.d.ts.map +1 -0
- package/dist/debug/debug-command-definitions.js +80 -0
- package/dist/debug/debug-command-definitions.js.map +1 -0
- package/dist/domain/debug-trigger-bonus-command.d.ts +17 -0
- package/dist/domain/debug-trigger-bonus-command.d.ts.map +1 -0
- package/dist/domain/debug-trigger-bonus-command.js +3 -0
- package/dist/domain/debug-trigger-bonus-command.js.map +1 -0
- package/dist/domain/index.d.ts +5 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +21 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/types.d.ts +228 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +30 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/engine/happy-panda-engine.d.ts +64 -0
- package/dist/engine/happy-panda-engine.d.ts.map +1 -0
- package/dist/engine/happy-panda-engine.js +324 -0
- package/dist/engine/happy-panda-engine.js.map +1 -0
- package/dist/engine/index.d.ts +5 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +21 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/game-engine.interface.d.ts +19 -0
- package/dist/game-engine.interface.d.ts.map +1 -0
- package/dist/game-engine.interface.js +9 -0
- package/dist/game-engine.interface.js.map +1 -0
- package/dist/happy-panda-v1.game-engine.d.ts +60 -0
- package/dist/happy-panda-v1.game-engine.d.ts.map +1 -0
- package/dist/happy-panda-v1.game-engine.js +524 -0
- package/dist/happy-panda-v1.game-engine.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/logic/handlers/index.d.ts +5 -0
- package/dist/logic/handlers/index.d.ts.map +1 -0
- package/dist/logic/handlers/index.js +21 -0
- package/dist/logic/handlers/index.js.map +1 -0
- package/dist/logic/handlers/spin-handler.d.ts +58 -0
- package/dist/logic/handlers/spin-handler.d.ts.map +1 -0
- package/dist/logic/handlers/spin-handler.js +265 -0
- package/dist/logic/handlers/spin-handler.js.map +1 -0
- package/dist/logic/index.d.ts +6 -0
- package/dist/logic/index.d.ts.map +1 -0
- package/dist/logic/index.js +22 -0
- package/dist/logic/index.js.map +1 -0
- package/dist/logic/services/counter-manager.d.ts +60 -0
- package/dist/logic/services/counter-manager.d.ts.map +1 -0
- package/dist/logic/services/counter-manager.js +268 -0
- package/dist/logic/services/counter-manager.js.map +1 -0
- package/dist/logic/services/index.d.ts +7 -0
- package/dist/logic/services/index.d.ts.map +1 -0
- package/dist/logic/services/index.js +23 -0
- package/dist/logic/services/index.js.map +1 -0
- package/dist/logic/services/jackpot-manager.d.ts +59 -0
- package/dist/logic/services/jackpot-manager.d.ts.map +1 -0
- package/dist/logic/services/jackpot-manager.js +142 -0
- package/dist/logic/services/jackpot-manager.js.map +1 -0
- package/dist/logic/services/win-evaluator.d.ts +51 -0
- package/dist/logic/services/win-evaluator.d.ts.map +1 -0
- package/dist/logic/services/win-evaluator.js +463 -0
- package/dist/logic/services/win-evaluator.js.map +1 -0
- package/dist/rng/dummy-rng-client.d.ts +39 -0
- package/dist/rng/dummy-rng-client.d.ts.map +1 -0
- package/dist/rng/dummy-rng-client.js +77 -0
- package/dist/rng/dummy-rng-client.js.map +1 -0
- package/dist/rng/index.d.ts +10 -0
- package/dist/rng/index.d.ts.map +1 -0
- package/dist/rng/index.js +27 -0
- package/dist/rng/index.js.map +1 -0
- package/dist/rng/rng-client.factory.d.ts +33 -0
- package/dist/rng/rng-client.factory.d.ts.map +1 -0
- package/dist/rng/rng-client.factory.js +57 -0
- package/dist/rng/rng-client.factory.js.map +1 -0
- package/dist/rng/rng-client.interface.d.ts +51 -0
- package/dist/rng/rng-client.interface.d.ts.map +1 -0
- package/dist/rng/rng-client.interface.js +9 -0
- package/dist/rng/rng-client.interface.js.map +1 -0
- package/dist/rng/rng-service.d.ts +93 -0
- package/dist/rng/rng-service.d.ts.map +1 -0
- package/dist/rng/rng-service.js +124 -0
- package/dist/rng/rng-service.js.map +1 -0
- package/dist/rng/spin-generator.d.ts +32 -0
- package/dist/rng/spin-generator.d.ts.map +1 -0
- package/dist/rng/spin-generator.js +338 -0
- package/dist/rng/spin-generator.js.map +1 -0
- package/dist/rng/weighted-random.d.ts +30 -0
- package/dist/rng/weighted-random.d.ts.map +1 -0
- package/dist/rng/weighted-random.js +58 -0
- package/dist/rng/weighted-random.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RNG Seed Type Tests - GLI-19 Compliance Verification
|
|
4
|
+
*
|
|
5
|
+
* These tests verify that the RNG seed type fix is working correctly:
|
|
6
|
+
* 1. Seeds are returned as numbers (internal format)
|
|
7
|
+
* 2. Seeds can be safely converted to strings (wire format)
|
|
8
|
+
* 3. Hash canonicalization produces deterministic results
|
|
9
|
+
* 4. Edge cases are handled correctly
|
|
10
|
+
*
|
|
11
|
+
* GLI-19 Sections:
|
|
12
|
+
* - 3.4: Tamper-evident audit trails
|
|
13
|
+
* - 3.4.2: Tamper detection
|
|
14
|
+
* - 4.2.1: Deterministic replay
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
const happy_panda_v1_game_engine_1 = require("../happy-panda-v1.game-engine");
|
|
18
|
+
const types_1 = require("../domain/types");
|
|
19
|
+
describe('RNG Seed Type - GLI-19 Compliance', () => {
|
|
20
|
+
let engine;
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
engine = new happy_panda_v1_game_engine_1.HappyPandaV1GameEngine();
|
|
23
|
+
});
|
|
24
|
+
// Helper to initialize session
|
|
25
|
+
async function initSession(betStake = 1) {
|
|
26
|
+
return engine.processCommand(null, null, {
|
|
27
|
+
id: 'init',
|
|
28
|
+
type: 'INIT_SESSION_STATE',
|
|
29
|
+
payload: {
|
|
30
|
+
gameDirection: types_1.GameDirection.SINGLE,
|
|
31
|
+
betStake,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// Helper to execute spin
|
|
36
|
+
async function executeSpin(publicState, privateState) {
|
|
37
|
+
return engine.processCommand(publicState, privateState, {
|
|
38
|
+
id: `spin-${Date.now()}`,
|
|
39
|
+
type: 'SPIN',
|
|
40
|
+
payload: { sessionId: 'test-session' },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
describe('Seed Type Verification', () => {
|
|
44
|
+
it('should return rngOutcome with numeric seeds', async () => {
|
|
45
|
+
const init = await initSession();
|
|
46
|
+
const spin = await executeSpin(init.publicState, init.privateState);
|
|
47
|
+
expect(spin.success).toBe(true);
|
|
48
|
+
expect(spin.rngOutcome).toBeDefined();
|
|
49
|
+
// Verify all seeds are numbers
|
|
50
|
+
for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
|
|
51
|
+
expect(typeof record.seed).toBe('number');
|
|
52
|
+
expect(Number.isInteger(record.seed)).toBe(true);
|
|
53
|
+
expect(Number.isSafeInteger(record.seed)).toBe(true);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
it('should have seeds within safe integer range', async () => {
|
|
57
|
+
const init = await initSession();
|
|
58
|
+
// Run multiple spins to get variety of seeds
|
|
59
|
+
let currentPublic = init.publicState;
|
|
60
|
+
let currentPrivate = init.privateState;
|
|
61
|
+
for (let i = 0; i < 10; i++) {
|
|
62
|
+
const spin = await executeSpin(currentPublic, currentPrivate);
|
|
63
|
+
if (spin.rngOutcome) {
|
|
64
|
+
for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
|
|
65
|
+
expect(record.seed).toBeLessThanOrEqual(Number.MAX_SAFE_INTEGER);
|
|
66
|
+
expect(record.seed).toBeGreaterThanOrEqual(Number.MIN_SAFE_INTEGER);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
currentPublic = spin.publicState;
|
|
70
|
+
currentPrivate = spin.privateState;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
it('should have consistent rngOutcome structure', async () => {
|
|
74
|
+
const init = await initSession();
|
|
75
|
+
const spin = await executeSpin(init.publicState, init.privateState);
|
|
76
|
+
expect(spin.rngOutcome).toBeDefined();
|
|
77
|
+
for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
|
|
78
|
+
// Verify structure
|
|
79
|
+
expect(typeof actionId).toBe('string');
|
|
80
|
+
expect(actionId.length).toBeGreaterThan(0);
|
|
81
|
+
// Verify record fields
|
|
82
|
+
expect(typeof record.result).toBe('number');
|
|
83
|
+
expect(typeof record.seed).toBe('number');
|
|
84
|
+
expect(typeof record.min).toBe('number');
|
|
85
|
+
expect(typeof record.max).toBe('number');
|
|
86
|
+
// Verify result is within range
|
|
87
|
+
expect(record.result).toBeGreaterThanOrEqual(record.min);
|
|
88
|
+
expect(record.result).toBeLessThanOrEqual(record.max);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe('Wire Format Conversion', () => {
|
|
93
|
+
it('seeds should be safely convertible to strings', async () => {
|
|
94
|
+
const init = await initSession();
|
|
95
|
+
const spin = await executeSpin(init.publicState, init.privateState);
|
|
96
|
+
for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
|
|
97
|
+
const seedAsString = String(record.seed);
|
|
98
|
+
const backToNumber = Number(seedAsString);
|
|
99
|
+
// Round-trip conversion must be lossless
|
|
100
|
+
expect(backToNumber).toBe(record.seed);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
it('string conversion should not lose precision', async () => {
|
|
104
|
+
const init = await initSession();
|
|
105
|
+
let currentPublic = init.publicState;
|
|
106
|
+
let currentPrivate = init.privateState;
|
|
107
|
+
// Run 50 spins to test various seed values
|
|
108
|
+
for (let i = 0; i < 50; i++) {
|
|
109
|
+
const spin = await executeSpin(currentPublic, currentPrivate);
|
|
110
|
+
if (spin.rngOutcome) {
|
|
111
|
+
for (const [, record] of Object.entries(spin.rngOutcome)) {
|
|
112
|
+
const original = record.seed;
|
|
113
|
+
const asString = String(original);
|
|
114
|
+
const restored = Number(asString);
|
|
115
|
+
expect(restored).toBe(original);
|
|
116
|
+
expect(asString).not.toContain('e'); // No scientific notation
|
|
117
|
+
expect(asString).not.toContain('.'); // Must be integer
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
currentPublic = spin.publicState;
|
|
121
|
+
currentPrivate = spin.privateState;
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('Hash Canonicalization Verification', () => {
|
|
126
|
+
/**
|
|
127
|
+
* Simulates the canonicalization that RGS uses for hashing.
|
|
128
|
+
* This must produce identical output for number vs string seeds.
|
|
129
|
+
*/
|
|
130
|
+
function canonicalizeForHash(outcome) {
|
|
131
|
+
const entries = Object.entries(outcome)
|
|
132
|
+
.map(([actionId, record]) => ({
|
|
133
|
+
actionId,
|
|
134
|
+
result: Number(record.result),
|
|
135
|
+
seed: String(record.seed),
|
|
136
|
+
min: Number(record.min),
|
|
137
|
+
max: Number(record.max),
|
|
138
|
+
}))
|
|
139
|
+
.sort((a, b) => a.actionId.localeCompare(b.actionId));
|
|
140
|
+
return JSON.stringify(entries);
|
|
141
|
+
}
|
|
142
|
+
it('should produce same canonical form for number and string seeds', async () => {
|
|
143
|
+
const init = await initSession();
|
|
144
|
+
const spin = await executeSpin(init.publicState, init.privateState);
|
|
145
|
+
// Get canonical with number seeds (as returned by engine)
|
|
146
|
+
const canonicalNumber = canonicalizeForHash(spin.rngOutcome);
|
|
147
|
+
// Convert seeds to strings (simulating wire format)
|
|
148
|
+
const withStringSeeds = {};
|
|
149
|
+
for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
|
|
150
|
+
withStringSeeds[actionId] = {
|
|
151
|
+
...record,
|
|
152
|
+
seed: String(record.seed),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const canonicalString = canonicalizeForHash(withStringSeeds);
|
|
156
|
+
// CRITICAL: Both must produce identical canonical form
|
|
157
|
+
expect(canonicalNumber).toBe(canonicalString);
|
|
158
|
+
});
|
|
159
|
+
it('should produce deterministic canonical form across multiple calls', async () => {
|
|
160
|
+
const init = await initSession();
|
|
161
|
+
const spin = await executeSpin(init.publicState, init.privateState);
|
|
162
|
+
const canonical1 = canonicalizeForHash(spin.rngOutcome);
|
|
163
|
+
const canonical2 = canonicalizeForHash(spin.rngOutcome);
|
|
164
|
+
const canonical3 = canonicalizeForHash(spin.rngOutcome);
|
|
165
|
+
expect(canonical1).toBe(canonical2);
|
|
166
|
+
expect(canonical2).toBe(canonical3);
|
|
167
|
+
});
|
|
168
|
+
it('should sort entries alphabetically by actionId', async () => {
|
|
169
|
+
// Create outcome with known actionIds in reverse order
|
|
170
|
+
const outcome = {
|
|
171
|
+
z_action: { result: 1, seed: 100, min: 0, max: 10 },
|
|
172
|
+
a_action: { result: 2, seed: 200, min: 0, max: 10 },
|
|
173
|
+
m_action: { result: 3, seed: 300, min: 0, max: 10 },
|
|
174
|
+
};
|
|
175
|
+
const canonical = canonicalizeForHash(outcome);
|
|
176
|
+
const parsed = JSON.parse(canonical);
|
|
177
|
+
expect(parsed[0].actionId).toBe('a_action');
|
|
178
|
+
expect(parsed[1].actionId).toBe('m_action');
|
|
179
|
+
expect(parsed[2].actionId).toBe('z_action');
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe('Bonus Round RNG Tracking', () => {
|
|
183
|
+
it('should track RNG outcomes during bonus trigger', async () => {
|
|
184
|
+
const init = await initSession(8);
|
|
185
|
+
// Trigger a bonus via debug command
|
|
186
|
+
const triggerResult = await engine.processCommand(init.publicState, init.privateState, {
|
|
187
|
+
id: 'debug-trigger',
|
|
188
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
189
|
+
payload: {
|
|
190
|
+
sessionId: 'test',
|
|
191
|
+
bonusType: 'BONUS_BAMBOO_TRIPLETS',
|
|
192
|
+
betAmount: 8,
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
expect(triggerResult.success).toBe(true);
|
|
196
|
+
// Debug trigger may or may not have rngOutcome depending on implementation
|
|
197
|
+
});
|
|
198
|
+
it('should maintain seed type consistency across bonus spins', async () => {
|
|
199
|
+
const init = await initSession(8);
|
|
200
|
+
// Trigger bonus
|
|
201
|
+
const trigger = await engine.processCommand(init.publicState, init.privateState, {
|
|
202
|
+
id: 'debug-trigger',
|
|
203
|
+
type: 'DEBUG_TRIGGER_BONUS',
|
|
204
|
+
payload: {
|
|
205
|
+
sessionId: 'test',
|
|
206
|
+
bonusType: 'BONUS_BAMBOO_TWINS',
|
|
207
|
+
betAmount: 8,
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
if (trigger.rngOutcome) {
|
|
211
|
+
for (const [, record] of Object.entries(trigger.rngOutcome)) {
|
|
212
|
+
expect(typeof record.seed).toBe('number');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe('Edge Cases', () => {
|
|
218
|
+
it('should handle zero seed correctly', () => {
|
|
219
|
+
const outcome = {
|
|
220
|
+
test_action: { result: 5, seed: 0, min: 0, max: 10 },
|
|
221
|
+
};
|
|
222
|
+
const canonical = JSON.stringify(Object.entries(outcome)
|
|
223
|
+
.map(([actionId, record]) => ({
|
|
224
|
+
actionId,
|
|
225
|
+
result: record.result,
|
|
226
|
+
seed: String(record.seed),
|
|
227
|
+
min: record.min,
|
|
228
|
+
max: record.max,
|
|
229
|
+
}))
|
|
230
|
+
.sort((a, b) => a.actionId.localeCompare(b.actionId)));
|
|
231
|
+
expect(canonical).toContain('"seed":"0"');
|
|
232
|
+
});
|
|
233
|
+
it('should handle negative seed correctly', () => {
|
|
234
|
+
const outcome = {
|
|
235
|
+
test_action: { result: 5, seed: -12345, min: -100, max: 100 },
|
|
236
|
+
};
|
|
237
|
+
const canonical = JSON.stringify(Object.entries(outcome)
|
|
238
|
+
.map(([actionId, record]) => ({
|
|
239
|
+
actionId,
|
|
240
|
+
result: record.result,
|
|
241
|
+
seed: String(record.seed),
|
|
242
|
+
min: record.min,
|
|
243
|
+
max: record.max,
|
|
244
|
+
})));
|
|
245
|
+
expect(canonical).toContain('"seed":"-12345"');
|
|
246
|
+
});
|
|
247
|
+
it('should handle MAX_SAFE_INTEGER seed correctly', () => {
|
|
248
|
+
const maxSafe = Number.MAX_SAFE_INTEGER;
|
|
249
|
+
const outcome = {
|
|
250
|
+
test_action: { result: 5, seed: maxSafe, min: 0, max: 100 },
|
|
251
|
+
};
|
|
252
|
+
const seedString = String(maxSafe);
|
|
253
|
+
const backToNumber = Number(seedString);
|
|
254
|
+
expect(backToNumber).toBe(maxSafe);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
describe('Multiple Spins Consistency', () => {
|
|
258
|
+
it('should maintain type consistency across 100 spins', async () => {
|
|
259
|
+
const init = await initSession();
|
|
260
|
+
let currentPublic = init.publicState;
|
|
261
|
+
let currentPrivate = init.privateState;
|
|
262
|
+
const allSeeds = [];
|
|
263
|
+
for (let i = 0; i < 100; i++) {
|
|
264
|
+
const spin = await executeSpin(currentPublic, currentPrivate);
|
|
265
|
+
if (spin.rngOutcome) {
|
|
266
|
+
for (const [, record] of Object.entries(spin.rngOutcome)) {
|
|
267
|
+
expect(typeof record.seed).toBe('number');
|
|
268
|
+
allSeeds.push(record.seed);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
currentPublic = spin.publicState;
|
|
272
|
+
currentPrivate = spin.privateState;
|
|
273
|
+
}
|
|
274
|
+
// Verify all seeds are safe integers
|
|
275
|
+
expect(allSeeds.every(s => Number.isSafeInteger(s))).toBe(true);
|
|
276
|
+
// Log statistics for analysis document
|
|
277
|
+
console.log(`\n=== RNG Seed Statistics (100 spins) ===`);
|
|
278
|
+
console.log(`Total seeds collected: ${allSeeds.length}`);
|
|
279
|
+
console.log(`Min seed: ${Math.min(...allSeeds)}`);
|
|
280
|
+
console.log(`Max seed: ${Math.max(...allSeeds)}`);
|
|
281
|
+
console.log(`All safe integers: ${allSeeds.every(s => Number.isSafeInteger(s))}`);
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
//# sourceMappingURL=rng-seed-type.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rng-seed-type.test.js","sourceRoot":"","sources":["../../src/__tests__/rng-seed-type.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RNG Stress and Boundary Tests
|
|
3
|
+
*
|
|
4
|
+
* This test suite covers:
|
|
5
|
+
* - High volume stress testing
|
|
6
|
+
* - Boundary condition verification
|
|
7
|
+
* - Performance under load
|
|
8
|
+
* - Memory leak detection patterns
|
|
9
|
+
* - Large payload handling
|
|
10
|
+
* - State persistence verification
|
|
11
|
+
*
|
|
12
|
+
* Note: Some tests are designed for CI/CD performance validation
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=rng-stress-boundary.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rng-stress-boundary.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rng-stress-boundary.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|