diff --git a/services/pascal-editor/packages/core/src/store/use-scene-dirty-tracking.test.ts b/services/pascal-editor/packages/core/src/store/use-scene-dirty-tracking.test.ts index 5a8635c81..e52ae14cc 100644 --- a/services/pascal-editor/packages/core/src/store/use-scene-dirty-tracking.test.ts +++ b/services/pascal-editor/packages/core/src/store/use-scene-dirty-tracking.test.ts @@ -74,4 +74,39 @@ describe('dirty tracking', () => { expect(useScene.getState().nodes[TRACKED]).toBeUndefined() expect(useScene.getState().dirtyNodes.has(TRACKED)).toBe(false) }) + + test('setScene publishes tracked nodes in the initial dirty snapshot', () => { + useScene.getState().setScene( + { + [UNTRACKED]: makeNode(UNTRACKED, 'test-untracked'), + [TRACKED]: makeNode(TRACKED, 'test-tracked'), + [UNREGISTERED]: makeNode(UNREGISTERED, 'unregistered-kind'), + }, + [UNTRACKED, TRACKED, UNREGISTERED], + ) + + const dirtyNodes = useScene.getState().dirtyNodes + expect(dirtyNodes.has(UNTRACKED)).toBe(false) + expect(dirtyNodes.has(TRACKED)).toBe(true) + expect(dirtyNodes.has(UNREGISTERED)).toBe(true) + }) + + test('loadScene creates a complete site-building-level parent chain', () => { + useScene.setState({ nodes: {}, rootNodeIds: [], dirtyNodes: new Set() } as never) + useScene.getState().loadScene() + + const state = useScene.getState() + const site = state.nodes[state.rootNodeIds[0]!] + expect(site?.type).toBe('site') + if (site?.type !== 'site') throw new Error('default site was not created') + + const building = state.nodes[site.children[0]! as AnyNodeId] + expect(building?.type).toBe('building') + expect(building?.parentId).toBe(site.id) + if (building?.type !== 'building') throw new Error('default building was not created') + + const level = state.nodes[building.children[0]! as AnyNodeId] + expect(level?.type).toBe('level') + expect(level?.parentId).toBe(building.id) + }) })