map/archive/generated-history/VALIDATE_LARGE_ADDITIONAL_GENERATION_WORKER.mjs
2026-08-10 13:59:33 +09:00

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();