import assert from 'node:assert/strict' import { register } from 'node:module' import { readFile } from 'node:fs/promises' register('./t32-adapter-io-loader.mjs',import.meta.url) const { JulianDate }=await import('cesium') const {syncPipeLayer,setPipeViewMode,clearPipeLayer}=await import('../../../src/modules/cockpit/services/cesiumPipeLayer.js') let modelLoaded const modelCreated=new Promise(resolve=>modelLoaded=resolve) globalThis.t32Models=[] globalThis.t32Models.push=function(model){Array.prototype.push.call(this,model);modelLoaded()} globalThis.t32TerrainFails=false const nativeFetch=globalThis.fetch globalThis.window={location:{href:'http://test.invalid/cockpit/',origin:'http://test.invalid'}} const sources=[] const viewer={terrainProvider:{},isDestroyed:()=>false,scene:{requestRender(){},primitives:{add(){},remove(m){m.destroy()}}},dataSources:{getByName:n=>sources.filter(s=>s.name===n),add:async s=>{sources.push(s);return s}}} try{ globalThis.fetch=async url=>String(url).startsWith('blob:')?nativeFetch(url):new Response(await readFile(new URL('../../../public/cockpit/models/pipes/spline.gltf',import.meta.url),'utf8')) const pipe={code:'async',industry:'DRAINAGE',networkLevel:1,diameter:400,positions:[[110.39,28.44],[110.3901,28.44]]} let finish const loaded=new Promise(resolve=>finish=resolve) const states=[] setPipeViewMode(viewer,'pipeline') const syncing=syncPipeLayer(viewer,{pipes:[pipe],components:[]},{onModelChange:s=>{states.push(s);if(s.pending===1)finish()}}) setPipeViewMode(viewer,'ground') await syncing;await loaded;await modelCreated;await new Promise(setImmediate) const graphics=()=>sources[0].entities.getById('pipe:async').polyline const near=()=>graphics().distanceDisplayCondition.getValue(JulianDate.now()).near assert.equal(near(),0) globalThis.t32Models[0].readyEvent.raiseEvent() assert.equal(near(),0,'late readiness must use latest ground mode') assert.equal(states.at(-1).visualDefaultCount,0) setPipeViewMode(viewer,'pipeline');assert.equal(near(),600) const previous=graphics() await syncPipeLayer(viewer,{pipes:[{...pipe,name:'metadata changed'}],components:[]}) assert.notEqual(graphics(),previous) assert.equal(near(),600,'replacement graphics retains underground-only distance rule') setPipeViewMode(viewer,'ground');assert.equal(near(),0) assert.equal(globalThis.t32Models.length,1) globalThis.t32Models[0].errorEvent.raiseEvent(new Error('late asset error')) assert.equal(near(),0) setPipeViewMode(viewer,'pipeline');assert.equal(near(),0,'failed model never suppresses near guide') await clearPipeLayer(viewer) assert.equal(sources[0].entities.values.length,0) console.log('PASS real layer: async mode change, readiness, metadata replacement, failure and clear') }finally{globalThis.fetch=nativeFetch}