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