test(engine): add tick loop + game determinism integration test
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { buildContent } from '../../content/schema';
|
||||
import { createGameState, startAction, tickGame } from '../game';
|
||||
import { advance, createTickLoop, TICK_MS } from '../tickLoop';
|
||||
|
||||
function testContent() {
|
||||
return buildContent({
|
||||
resources: [{ id: 'gold', name: 'Gold', startAmount: 0 }],
|
||||
actions: [
|
||||
{
|
||||
id: 'forage',
|
||||
name: 'Forage',
|
||||
durationMs: 300,
|
||||
yields: { resourceId: 'gold', amount: 1 },
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
function simulate(elapsedMs: number, chunkMs: number) {
|
||||
const content = testContent();
|
||||
const state = createGameState(content);
|
||||
startAction(state, content, 'forage');
|
||||
|
||||
const loop = createTickLoop({ tickMs: TICK_MS, startNow: 0 });
|
||||
let now = 0;
|
||||
while (now < elapsedMs) {
|
||||
const next = Math.min(now + chunkMs, elapsedMs);
|
||||
advance(loop, next, () => {
|
||||
tickGame(state, content, TICK_MS);
|
||||
});
|
||||
now = next;
|
||||
}
|
||||
return { tickCount: loop.tickCount, gold: state.resources.gold };
|
||||
}
|
||||
|
||||
describe('determinism integration', () => {
|
||||
it('produces identical tick counts and game state regardless of advance chunking', () => {
|
||||
const whole = simulate(5000, 5000);
|
||||
const chunked = simulate(5000, 37);
|
||||
expect(chunked.tickCount).toBe(whole.tickCount);
|
||||
expect(chunked.gold).toBe(whole.gold);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user