feat: expose recompute diagnostic repair tree

This commit is contained in:
2026-08-02 22:56:38 -04:00
parent bc7adb500b
commit aeafc6c607
10 changed files with 265 additions and 18 deletions

View File

@@ -707,6 +707,35 @@ test('expression cycles fail recompute without silently accepting a result', ()
assert.equal(facade.getState().document.recompute?.objectStates.pocket, 'error')
})
test('recompute diagnostics expose root causes and repair only the affected branch', async () => {
const facade = createMockFacade()
facade.app.document.setExpression({ objectId: 'pad', propertyName: 'Length', expression: 'pocket.Length' })
facade.app.document.setExpression({ objectId: 'pocket', propertyName: 'Length', expression: 'pad.Length' })
const failed = facade.app.document.recompute()
assert.equal(failed.status, 'failed')
const diagnostics = facade.diagnostics.list().filter((diagnostic) => diagnostic.source === 'recompute')
const pocketRoot = diagnostics.find((diagnostic) => diagnostic.objectId === 'pocket' && diagnostic.code === 'DEPENDENCY_CYCLE')
const fillet = diagnostics.find((diagnostic) => diagnostic.objectId === 'fillet')
assert.ok(pocketRoot)
assert.equal(pocketRoot.generation, failed.generation)
assert.equal(pocketRoot.documentVersion, facade.app.document.getActive().version)
assert.equal(pocketRoot.repairActions?.find((action) => action.id === 'suppress-root')?.enabled, false)
assert.deepEqual(fillet?.dependencyPath, ['fillet', 'pocket'])
assert.equal(fillet?.rootCauseObjectId, 'pocket')
const tree = facade.diagnostics.tree()
assert.ok(tree.find((node) => node.diagnostic.id === pocketRoot.id)?.children.some((node) => node.diagnostic.objectId === 'fillet'))
const selected = await facade.diagnostics.repair(pocketRoot.id, 'select-object')
assert.equal(selected.status, 'completed')
assert.equal(facade.selection.getObjectId(), 'pocket')
facade.app.document.setExpression({ objectId: 'pad', propertyName: 'Length', expression: '25 mm' })
const repaired = await facade.diagnostics.repair(pocketRoot.id, 'recompute-root')
assert.equal(repaired.status, 'completed')
assert.equal(facade.diagnostics.list().some((diagnostic) => diagnostic.source === 'recompute'), false)
})
test('view properties do not mark the geometry object touched', () => {
const facade = createMockFacade()
facade.app.document.setProperty({ objectId: 'fillet', propertyName: 'Visibility', value: false })