81 lines
2.9 KiB
JavaScript
81 lines
2.9 KiB
JavaScript
import { Worker } from "node:worker_threads";
|
|
import { performance } from "node:perf_hooks";
|
|
import { generateMap } from "../src/mapPipeline.js";
|
|
import { createWorldMap } from "../src/worldMap.js";
|
|
|
|
const worldSeed = 8;
|
|
const initial = generateMap(worldSeed);
|
|
const baseline = createWorldMap(initial);
|
|
const rect = { x0: 20, y0: 120, x1: 180, y1: 230 };
|
|
const terrainType = initial.terrainTemplate?.terrainType || initial.terrainDebug?.terrainType || "auto";
|
|
|
|
function runWorkerCase(patchMode, id) {
|
|
return new Promise((resolve, reject) => {
|
|
const worker = new Worker(new URL("./browser-worker-node-shim.mjs", import.meta.url), { type: "module" });
|
|
const timer = setTimeout(async () => {
|
|
try { await worker.terminate(); } catch {}
|
|
reject(new Error(`${patchMode} coverage regression timed out`));
|
|
}, 60_000);
|
|
const startedAt = performance.now();
|
|
const seed = 123;
|
|
worker.on("error", reject);
|
|
worker.on("message", async (message) => {
|
|
if (message.id !== id || message.type === "progress") return;
|
|
clearTimeout(timer);
|
|
try { await worker.terminate(); } catch {}
|
|
resolve({ message, elapsedMs: Math.round(performance.now() - startedAt) });
|
|
});
|
|
worker.postMessage({
|
|
id,
|
|
world: structuredClone(baseline),
|
|
rect,
|
|
options: {
|
|
patchMode,
|
|
terrainType,
|
|
variant: 0,
|
|
seed,
|
|
maxQualityRetries: 0,
|
|
qualityTerrainAttempts: 1,
|
|
acceptBestAvailableQuality: false,
|
|
includeSeamVisualization: false,
|
|
},
|
|
search: {
|
|
searchId: `coverage-${patchMode}`,
|
|
operationId: `coverage-${patchMode}`,
|
|
committedRevision: 1,
|
|
workerEpoch: 1,
|
|
executionAttempt: 1,
|
|
totalCandidateCount: 1,
|
|
candidatePlan: [{ candidateId: `coverage-${patchMode}:0`, candidateOrdinal: 1, variant: 0, seed }],
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|
|
for (const [index, patchMode] of ["auto", "expansion"].entries()) {
|
|
const { message, elapsedMs } = await runWorkerCase(patchMode, index + 1);
|
|
const result = message.result || {};
|
|
const ok = message.ok === true
|
|
&& result.ok === true
|
|
&& result.searchStatus === "succeeded"
|
|
&& result.patchMode === "expansion"
|
|
&& result.tiledExpansion === true
|
|
&& Number(result.tileCount) === 1
|
|
&& Number(result.candidateUnmappedActiveCells || 0) === 0
|
|
&& result.seamDiagnostics?.hardPass === true;
|
|
console.log(JSON.stringify({
|
|
patchMode,
|
|
ok,
|
|
elapsedMs,
|
|
workerOk: message.ok === true,
|
|
searchStatus: result.searchStatus || null,
|
|
resultCode: result.code || null,
|
|
resolvedPatchMode: result.patchMode || null,
|
|
tiledExpansion: result.tiledExpansion === true,
|
|
tileCount: Number(result.tileCount || 0),
|
|
candidateUnmappedActiveCells: Number(result.candidateUnmappedActiveCells || 0),
|
|
seamPass: result.seamDiagnostics?.hardPass === true,
|
|
reason: result.reason || message.error || null,
|
|
}, null, 2));
|
|
if (!ok) process.exitCode = 1;
|
|
}
|