71 lines
2.5 KiB
TypeScript
71 lines
2.5 KiB
TypeScript
import { describe, expect, test } from 'bun:test'
|
|
|
|
import { DEFAULT_FRAME_FILL } from '@open-pencil/core'
|
|
import { createEditor } from '@open-pencil/core/editor'
|
|
|
|
describe('frameSelection', () => {
|
|
test('wraps selected nodes in a frame and preserves visual positions', () => {
|
|
const editor = createEditor()
|
|
const pageId = editor.state.currentPageId
|
|
const first = editor.graph.createNode('RECTANGLE', pageId, {
|
|
name: 'First',
|
|
x: 20,
|
|
y: 30,
|
|
width: 40,
|
|
height: 50
|
|
})
|
|
const second = editor.graph.createNode('ELLIPSE', pageId, {
|
|
name: 'Second',
|
|
x: 100,
|
|
y: 120,
|
|
width: 30,
|
|
height: 20
|
|
})
|
|
|
|
editor.select([first.id, second.id])
|
|
const beforeFirst = editor.graph.getAbsolutePosition(first.id)
|
|
const beforeSecond = editor.graph.getAbsolutePosition(second.id)
|
|
|
|
editor.frameSelection()
|
|
|
|
const [frameId] = [...editor.state.selectedIds]
|
|
const frame = frameId ? editor.graph.getNode(frameId) : null
|
|
expect(frame?.type).toBe('FRAME')
|
|
expect(frame?.x).toBe(20)
|
|
expect(frame?.y).toBe(30)
|
|
expect(frame?.width).toBe(110)
|
|
expect(frame?.height).toBe(110)
|
|
expect(frame?.fills).toEqual([DEFAULT_FRAME_FILL])
|
|
expect(first.parentId).toBe(frameId)
|
|
expect(second.parentId).toBe(frameId)
|
|
expect(editor.graph.getAbsolutePosition(first.id)).toEqual(beforeFirst)
|
|
expect(editor.graph.getAbsolutePosition(second.id)).toEqual(beforeSecond)
|
|
})
|
|
|
|
test('undo and redo restore frame selection state', () => {
|
|
const editor = createEditor()
|
|
const pageId = editor.state.currentPageId
|
|
const first = editor.graph.createNode('RECTANGLE', pageId, { x: 20, y: 30, width: 40, height: 50 })
|
|
const second = editor.graph.createNode('ELLIPSE', pageId, { x: 100, y: 120, width: 30, height: 20 })
|
|
|
|
editor.select([first.id, second.id])
|
|
editor.frameSelection()
|
|
const [frameId] = [...editor.state.selectedIds]
|
|
|
|
editor.undo.undo()
|
|
|
|
expect(editor.graph.getNode(first.id)?.parentId).toBe(pageId)
|
|
expect(editor.graph.getNode(second.id)?.parentId).toBe(pageId)
|
|
expect(editor.state.selectedIds).toEqual(new Set([first.id, second.id]))
|
|
|
|
editor.undo.redo()
|
|
|
|
const frame = editor.graph.getNode(frameId)
|
|
expect(frame?.type).toBe('FRAME')
|
|
expect(frame?.fills).toEqual([DEFAULT_FRAME_FILL])
|
|
expect(editor.graph.getNode(first.id)?.parentId).toBe(frameId)
|
|
expect(editor.graph.getNode(second.id)?.parentId).toBe(frameId)
|
|
expect(editor.state.selectedIds).toEqual(new Set([frameId]))
|
|
})
|
|
})
|