feat: v0.14.0 — ISS-006 time-scale slider values up to 1000x; tests use fastest time
CI / build + unit + e2e (pull_request) Failing after 4m52s
CI / build + unit + e2e (pull_request) Failing after 4m52s
This commit is contained in:
+12
-8
@@ -6,8 +6,8 @@ import { test, expect, type Page } from '@playwright/test';
|
||||
|
||||
// Must match lib/sim/engine.ts — kept in sync manually (same pattern as MIN_ZOOM/MAX_ZOOM in map.spec.ts).
|
||||
const MAX_TICK_ELAPSED_MS = 2_000;
|
||||
const SCALE = 60;
|
||||
const MAX_DELTA_PER_TICK = MAX_TICK_ELAPSED_MS * SCALE; // 120_000 game ms per tick at scale 60
|
||||
const SCALE = 1000; // fastest sim speed — top of the v0.14.0 ladder
|
||||
const MAX_DELTA_PER_TICK = MAX_TICK_ELAPSED_MS * SCALE; // 2_000_000 game ms per tick at scale 1000
|
||||
// Must match MARKET_TARGET_OPEN_PACKAGES in lib/game/seed.ts.
|
||||
const MARKET_TARGET = 10;
|
||||
|
||||
@@ -42,7 +42,7 @@ test.afterEach(async ({ page }) => {
|
||||
expect(res.status()).toBe(200);
|
||||
});
|
||||
|
||||
test('timeScale 60 advances the clock by roughly real-time × 60 between polls', async ({ page }) => {
|
||||
test('timeScale 1000 advances the clock by roughly real-time × 1000 between polls', async ({ page }) => {
|
||||
const post = await postSim(page, { timeScale: SCALE });
|
||||
expect(post.status()).toBe(200);
|
||||
const s1 = (await post.json()) as SimState;
|
||||
@@ -51,11 +51,11 @@ test('timeScale 60 advances the clock by roughly real-time × 60 between polls',
|
||||
|
||||
let prev = s1.clockMs;
|
||||
for (let i = 0; i < 3; i++) {
|
||||
await sleep(1_000); // one real second ≈ 60 game seconds at scale 60 — well under the clamp
|
||||
await sleep(1_000); // one real second ≈ 1000 game seconds at scale 1000 — well under the clamp
|
||||
const body = await getState(page);
|
||||
const now = body.simState.clockMs;
|
||||
expect(now).toBeGreaterThan(prev); // strictly advances while actively polled
|
||||
expect(now - prev).toBeGreaterThanOrEqual(30_000); // ≥ ~500 ms real × 60
|
||||
expect(now - prev).toBeGreaterThanOrEqual(500_000); // ≥ ~500 ms real × 1000
|
||||
expect(now - prev).toBeLessThanOrEqual(MAX_DELTA_PER_TICK + 60); // clamp bounds each tick
|
||||
prev = now;
|
||||
}
|
||||
@@ -82,7 +82,7 @@ test('an open package past its short deadline expires and the market stays toppe
|
||||
expect(victim).toBeDefined(); // steady state always has open packages
|
||||
|
||||
// Test-only hook (FLIGHT_TEST_HOOKS=1 in docker-compose): move an existing open
|
||||
// package's deadline ~10 game-seconds out so expiry is observable at scale 60.
|
||||
// package's deadline ~10 game-seconds out so expiry is observable at scale 1000.
|
||||
const hook = await page.request.post('/api/test/expire-package', { data: { packageId: victim!.id } });
|
||||
expect(hook.status()).toBe(200);
|
||||
const moved = (await hook.json()) as { id: string; deadlineSimTime: number };
|
||||
@@ -132,9 +132,13 @@ test('the hook can also create a fresh short-deadline package, which then expire
|
||||
});
|
||||
|
||||
test('POST /api/sim validates and clamps its input', async ({ page }) => {
|
||||
const clampHigh = await postSim(page, { timeScale: 500 });
|
||||
const clampHigh = await postSim(page, { timeScale: 2000 });
|
||||
expect(clampHigh.status()).toBe(200);
|
||||
expect(((await clampHigh.json()) as SimState).timeScale).toBe(64); // top of the power-of-two ladder (v0.9.2)
|
||||
expect(((await clampHigh.json()) as SimState).timeScale).toBe(1000); // top of the ladder (v0.14.0)
|
||||
|
||||
const inRange = await postSim(page, { timeScale: 500 });
|
||||
expect(inRange.status()).toBe(200);
|
||||
expect(((await inRange.json()) as SimState).timeScale).toBe(500); // ladder value passes through unclamped
|
||||
|
||||
const clampLow = await postSim(page, { timeScale: 0.1 });
|
||||
expect(clampLow.status()).toBe(200);
|
||||
|
||||
Reference in New Issue
Block a user