Files
Web_FreeCAD_Bitbybit/tests/facade.test.ts

74 lines
3.1 KiB
TypeScript

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')
})