import { test } from 'node:test' import assert from 'node:assert/strict' import { createMockFacade } from '../src/facade/mockFacade' test('facade exposes a stable initial document projection', () => { const facade = createMockFacade() const state = facade.getState() assert.equal(state.apiVersion, '0.1') assert.equal(state.document.id, 'doc-pump-housing') assert.equal(state.document.tree.find((item) => item.id === 'body')?.type, 'body') assert.equal(facade.gui.workbench.getActive(), 'Part Design') }) test('workbench and selection changes are event driven', () => { const facade = createMockFacade() const events: string[] = [] const unsubscribe = facade.subscribe((event) => events.push(event.type)) facade.gui.workbench.setActive('Sketcher') facade.selection.select('sketch') unsubscribe() assert.equal(facade.getState().activeWorkbench, 'Sketcher') assert.equal(facade.selection.getObjectId(), 'sketch') assert.ok(events.includes('state.changed')) assert.ok(events.includes('notice')) }) test('commands and tasks preserve apply/cancel lifecycle', () => { const facade = createMockFacade() facade.gui.command.execute({ commandId: 'create-sketch' }) assert.equal(facade.task.getActive()?.status, 'preview') facade.task.update({ support: 'XY_Plane' }) assert.equal(facade.task.getActive()?.draft.support, 'XY_Plane') facade.task.cancel() assert.equal(facade.task.getActive()?.status, 'cancelled') }) test('disabled commands return a reason instead of mutating the document', () => { const facade = createMockFacade() const before = facade.getState().document.version const state = facade.gui.command.getState('pad') assert.equal(state.status, 'enabled') facade.selection.clear() facade.gui.workbench.setActive('Sketcher') const disabled = facade.gui.command.getState('pad') assert.equal(disabled.status, 'disabled') assert.match(disabled.reason || '', /Part Design|compatible object/) facade.gui.command.execute({ commandId: 'pad' }) assert.equal(facade.getState().diagnostics.at(-1)?.code, 'COMMAND_DISABLED') assert.equal(facade.getState().document.version, before) }) test('command events carry a document-scoped request context', () => { const facade = createMockFacade() const events: string[] = [] let requestId = '' facade.subscribe((event) => { events.push(event.type); if (event.type === 'command.started') requestId = event.context.requestId }) facade.gui.command.execute({ commandId: 'create-sketch' }) assert.ok(events.includes('command.started')) assert.ok(events.includes('command.completed')) assert.match(requestId, /^req-/) }) test('document mutations use the facade history boundary', () => { const facade = createMockFacade() facade.gui.command.execute({ commandId: 'new-document' }) assert.equal(facade.app.document.getActive().label, 'Untitled document') assert.equal(facade.history.canUndo(), true) facade.history.undo() assert.equal(facade.app.document.getActive().label, 'Pump Housing') assert.equal(facade.history.canRedo(), true) facade.history.redo() assert.equal(facade.app.document.getActive().label, 'Untitled document') })