openpencil/tests/engine/editor/guides.test.ts
Danila Poyarkov f892cb583c feat(editor): add ruler guide authoring foundation
- Preserve page and frame guide GUIDs through .fig conversion
- Add undoable guide add, move, transfer, and remove actions
- Start page/frame guide previews from CanvasKit rulers
- Render warm guide previews with frame-scoped solid lines and dotted continuation
2026-08-19 18:08:48 +03:00

57 lines
2 KiB
TypeScript

import { describe, expect, test } from 'bun:test'
import { createEditor } from '@open-pencil/core/editor'
function setup() {
const editor = createEditor()
const pageId = editor.state.currentPageId
const frame = editor.graph.createNode('FRAME', pageId, {
x: 100,
y: 100,
width: 300,
height: 200
})
return { editor, pageId, frameId: frame.id }
}
describe('guide editor actions', () => {
test('adds, moves, removes, and undoes a page guide', () => {
const { editor, pageId } = setup()
const id = editor.addGuide(pageId, 'x', 42)
expect(id).not.toBeNull()
expect(editor.graph.getNode(pageId)?.guides).toEqual([{ id, axis: 'x', position: 42 }])
expect(editor.moveGuide(pageId, id ?? '', 84)).toBe(true)
expect(editor.graph.getNode(pageId)?.guides[0]?.position).toBe(84)
editor.undoAction()
expect(editor.graph.getNode(pageId)?.guides[0]?.position).toBe(42)
expect(editor.removeGuide(pageId, id ?? '')).toBe(true)
expect(editor.graph.getNode(pageId)?.guides).toEqual([])
editor.undoAction()
expect(editor.graph.getNode(pageId)?.guides[0]?.position).toBe(42)
})
test('transfers a guide between page and frame in one undo step', () => {
const { editor, pageId, frameId } = setup()
const id = editor.addGuide(pageId, 'y', 120)
editor.undo.clear()
expect(editor.transferGuide(pageId, frameId, id ?? '', 20)).toBe(true)
expect(editor.graph.getNode(pageId)?.guides).toEqual([])
expect(editor.graph.getNode(frameId)?.guides).toEqual([{ id, axis: 'y', position: 20 }])
editor.undoAction()
expect(editor.graph.getNode(pageId)?.guides).toEqual([{ id, axis: 'y', position: 120 }])
expect(editor.graph.getNode(frameId)?.guides).toEqual([])
})
test('rejects unsupported owners and no-op movement', () => {
const { editor, pageId } = setup()
const rect = editor.graph.createNode('RECTANGLE', pageId)
expect(editor.addGuide(rect.id, 'x', 10)).toBeNull()
const id = editor.addGuide(pageId, 'x', 10)
expect(editor.moveGuide(pageId, id ?? '', 10)).toBe(false)
})
})