| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- 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}
|