18 lines
2.4 KiB
JavaScript
18 lines
2.4 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import { Worker } from 'node:worker_threads';
|
|
import { generateMap } from './mapGenerator.js';
|
|
import { createWorldMap } from './worldMap.js';
|
|
import { MAP_W,MAP_H } from './mapUtils.js';
|
|
import { collectTransferableBuffers } from './transferUtils.js';
|
|
function adapter(url){const code=`import {parentPort} from 'node:worker_threads'; globalThis.self={onmessage:null,postMessage(m,t){parentPort.postMessage(m,t)}}; await import(${JSON.stringify(url.href)}); parentPort.on('message',d=>self.onmessage?.({data:d}));`;return new Worker(new URL(`data:text/javascript,${encodeURIComponent(code)}`),{type:'module',execArgv:[]});}
|
|
const initial=generateMap(24681357,{terrainType:'auto',onProgress(){}}); const world=createWorldMap(initial); const edge=world.originX+MAP_W-1,cy=world.originY+Math.floor(MAP_H/2); const rect={x0:edge-40,y0:cy-100,x1:edge-40+280,y1:cy+100};
|
|
const worker=adapter(new URL('./mapPatchWorker.js',import.meta.url)); const preview=structuredClone(world); const transfer=Array.from(collectTransferableBuffers(preview)); const t=Date.now(); let last=0;
|
|
const message=await new Promise((resolve,reject)=>{const timer=setTimeout(()=>reject(new Error('timeout')),80000);worker.on('message',m=>{if(m?.type==='progress'){if(Date.now()-last>4000){last=Date.now(); console.error(Date.now()-t,m.progress?.label||m.progress?.key);}return;}clearTimeout(timer);resolve(m)});worker.on('error',e=>{clearTimeout(timer);reject(e)});worker.postMessage({id:1,world:preview,rect,options:{patchMode:'expansion',terrainType:'auto',seed:0x4a35b921,variant:1,maxQualityRetries:0,qualityTerrainAttempts:1,acceptBestAvailableQuality:true}},transfer);});
|
|
const summary={ms:Date.now()-t,outer:message.ok,inner:message.result?.ok,tiled:message.result?.tiledExpansion,tileCount:message.result?.tileCount,seam:message.result?.seamDiagnostics?.status,reason:message.result?.reason||message.error||null};
|
|
console.log(JSON.stringify(summary,null,2));
|
|
assert.equal(summary.outer,true,'worker transport must succeed');
|
|
assert.equal(summary.inner,true,`large patch must succeed: ${summary.reason||'unknown failure'}`);
|
|
assert.equal(summary.tiled,true,'large selection must use tiled production generation');
|
|
assert.ok(summary.tileCount>=2,'large selection must execute multiple production tiles');
|
|
assert.ok(summary.ms<60000,`large worker patch exceeded 60 s budget: ${summary.ms} ms`);
|
|
await worker.terminate();
|