95 lines
4.0 KiB
TypeScript
95 lines
4.0 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')
|
|
})
|
|
|
|
test('Part Design feature tasks commit a document object and remain undoable', () => {
|
|
const facade = createMockFacade()
|
|
const before = facade.app.document.getActive()
|
|
facade.gui.command.execute({ commandId: 'pad' })
|
|
assert.equal(facade.task.getActive()?.commandId, 'pad')
|
|
facade.task.update({ length: 42, reversed: false })
|
|
facade.task.apply()
|
|
|
|
const committed = facade.app.document.getActive()
|
|
const created = committed.tree.find((item) => item.id === 'pad001')
|
|
assert.equal(created?.label, 'Pad')
|
|
assert.equal(committed.version, before.version + 1)
|
|
assert.equal(facade.selection.getObjectId(), 'pad001')
|
|
assert.equal(committed.dirty, true)
|
|
|
|
facade.history.undo()
|
|
assert.equal(facade.app.document.getActive().tree.some((item) => item.id === 'pad001'), false)
|
|
facade.history.redo()
|
|
assert.equal(facade.app.document.getActive().tree.some((item) => item.id === 'pad001'), true)
|
|
})
|