verify-model-diagnostics.mjs 1.9 KB

123456789101112131415161718
  1. import assert from 'node:assert/strict'
  2. import {attachModelDiagnostics} from '../../src/modules/cockpit/services/modelDiagnostics.js'
  3. function event(){const listeners=new Set();return{addEventListener(fn){listeners.add(fn);return()=>listeners.delete(fn)},raise(){for(const fn of listeners)fn()},listeners}}
  4. let created=[],time=0
  5. const document={hidden:false,createElement(){const n={children:[],style:{},attributes:{},textContent:'',setAttribute(k,v){this.attributes[k]=v},append(...ns){this.children.push(...ns)},addEventListener(){},remove(){this.removed=true}};created.push(n);return n}}
  6. const host={ownerDocument:document,appendChild(){}},scene={preRender:event(),postRender:event()}
  7. const state={viewMode:'pipeline',regions:[],camera:{settled:false}}
  8. let reads=0
  9. const detach=attachModelDiagnostics(scene,host,()=>{reads++;return state},{now:()=>time,isMoving:()=>!state.camera.settled})
  10. scene.preRender.raise();time=5;scene.postRender.raise()
  11. let r=JSON.parse(created[2].textContent);assert.equal(r.viewMode,'pipeline');assert.deepEqual(r.regions,[]);assert.equal(r.renderSubmissionDuration.p95Ms,5);assert.equal(r.gpuTimeMeasured,false)
  12. time=16;scene.preRender.raise();time=20;scene.postRender.raise();time=600;scene.preRender.raise();time=610;scene.postRender.raise()
  13. r=JSON.parse(created[2].textContent);assert.ok(r.renderSubmissionDuration.samples===3&&r.movingFrameIntervals.samples===2)
  14. assert.equal(reads,3,'full region snapshots only at paint, not every frame')
  15. for(let i=0;i<60;i++){time=611+i;scene.preRender.raise();time+=.5;scene.postRender.raise()}
  16. assert.equal(reads,3,'60 additional frames within 500ms create no new full snapshots')
  17. detach();assert.equal(scene.preRender.listeners.size,0);assert.equal(scene.postRender.listeners.size,0);assert.equal(created[0].removed,true)
  18. console.log(JSON.stringify({passed:true,scope:'read-only frame/region observations and listener teardown'}))