| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- // Exercise installed Cesium base traversal in isolation with injected tile readiness.
- // No DOM/GPU/network/browser. This tests actual traversal, not private tree parsing.
- import assert from 'node:assert/strict'
- import Traversal from '../../node_modules/@cesium/engine/Source/Scene/Cesium3DTilesetTraversal.js'
- import Base from '../../node_modules/@cesium/engine/Source/Scene/Cesium3DTilesetBaseTraversal.js'
- import Refine from '../../node_modules/@cesium/engine/Source/Scene/Cesium3DTileRefine.js'
- const makeTileset = () => ({ _requestedTiles: [], _selectedTiles: [], _selectedTilesToStyle: [], _emptyTiles: [],
- memoryAdjustedScreenSpaceError: 96, debugFreezeFrame: false, hasMixedContent: false, loadSiblings: false,
- _minimumPriority: {distance:Infinity,depth:Infinity,foveatedFactor:Infinity,reverseScreenSpaceError:Infinity},
- _maximumPriority: {distance:0,depth:0,foveatedFactor:0,reverseScreenSpaceError:0},
- _statistics: {visited:0}, _cache: {touch(){}}, _cullRequestsWhileMoving:false })
- function tile(tileset,name,{empty=false,loaded=true,sse=200}={}) {
- return {tileset,name,children:[],parent:null,refine:Refine.REPLACE,hasRenderableContent:!empty,hasEmptyContent:empty,contentAvailable:loaded,
- hasUnloadedRenderableContent:!empty&&!loaded,contentExpired:false,_visible:true,_inRequestVolume:true,
- get isVisible(){return this._visible&&this._inRequestVolume},_screenSpaceError:sse,_depth:0,_distanceToCamera:1,_foveatedFactor:0,_priorityReverseScreenSpaceError:0,
- getScreenSpaceError(){return this._screenSpaceError},updateExpiration(){},updateVisibility(){},updatePriority(){},
- contentVisibility(){return 1},content:{featurePropertiesDirty:false},_selectedFrame:-1,
- add(...children){for(const c of children){c.parent=this;c._depth=this._depth+1;this.children.push(c)}return this}}
- }
- const ts=makeTileset(),root=tile(ts,'root',{empty:true,sse:1e6}),far=tile(ts,'far'),near=tile(ts,'near'),fine=tile(ts,'fine',{loaded:false,sse:0})
- root.add(far.add(near.add(fine)));ts.root=root
- const saved=Traversal.selectTile
- // Only replace styling/content GPU-facing selection; traversal/request/readiness logic is real.
- Traversal.selectTile=(t)=>ts._selectedTiles.push(t)
- const frame={frameNumber:1,camera:{timeSinceMoved:1,positionWCDeltaMagnitude:0,positionWCDeltaMagnitudeLastFrame:0}}
- function run(){frame.frameNumber++;Base.selectTiles(ts,frame);return ts._selectedTiles.map(t=>t.name)}
- try{
- assert.deepEqual(run(),['near'],'coarse must remain while fine is pending')
- assert.ok(ts._requestedTiles.includes(fine),'fine requested before replacement')
- fine.contentAvailable=true;fine.hasUnloadedRenderableContent=false
- assert.deepEqual(run(),['fine'],'ready child replaces only its own parent')
- fine.contentAvailable=false;fine.hasUnloadedRenderableContent=true
- assert.deepEqual(run(),['near'],'failed/evicted child restores local coarse')
- near._screenSpaceError=48;assert.deepEqual(run(),['near'],'SSE-qualified coarse does not request finer geometry')
- assert.ok(!ts._requestedTiles.includes(fine))
- near._screenSpaceError=200;far._screenSpaceError=48
- assert.deepEqual(run(),['far'],'distant view keeps cell coarse')
- far._screenSpaceError=200;near.contentAvailable=false;near.hasUnloadedRenderableContent=true
- assert.deepEqual(run(),['far'],'not-ready local coarse cannot remove distant fallback')
- near.contentAvailable=true;near.hasUnloadedRenderableContent=false
- const far2=tile(ts,'other-far'),fine2=tile(ts,'other-fine',{loaded:true,sse:0});root.add(far2.add(fine2))
- assert.deepEqual(new Set(run()),new Set(['near','other-fine']),'one cell refinement must not remove another coarse cell')
- assert.ok(!ts.hasMixedContent)
- console.log(JSON.stringify({passed:true,actualCesiumBaseTraversal:true,cases:7,browserUsed:false,renderingValidated:false,
- scope:'pending/ready/failure/SSE/distant/local-replacement; injected tile state only'}))
- }finally{Traversal.selectTile=saved}
|