54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import { describe, expect, test } from 'bun:test'
|
|
|
|
import { SceneGraph } from '@open-pencil/scene-graph'
|
|
|
|
import { createLayoutRunner } from '#core/editor/layout-runner'
|
|
|
|
function pageId(graph: SceneGraph): string {
|
|
return graph.getPages()[0].id
|
|
}
|
|
|
|
describe('mutation layout reconciliation', () => {
|
|
test('reflows the previous parent after deletion', async () => {
|
|
const graph = new SceneGraph()
|
|
const page = pageId(graph)
|
|
const parent = graph.createNode('FRAME', page, {
|
|
layoutMode: 'HORIZONTAL',
|
|
primaryAxisSizing: 'HUG',
|
|
counterAxisSizing: 'HUG'
|
|
})
|
|
const first = graph.createNode('RECTANGLE', parent.id, { width: 40, height: 20 })
|
|
graph.createNode('RECTANGLE', parent.id, { width: 60, height: 20 })
|
|
const { runLayoutForNode, runMutationWithLayout } = createLayoutRunner(() => graph)
|
|
runLayoutForNode(parent.id)
|
|
expect(parent.width).toBe(100)
|
|
|
|
await runMutationWithLayout(() => graph.deleteNode(first.id), page)
|
|
|
|
expect(parent.width).toBe(60)
|
|
})
|
|
|
|
test('reflows old and new parents after reparenting', async () => {
|
|
const graph = new SceneGraph()
|
|
const page = pageId(graph)
|
|
const left = graph.createNode('FRAME', page, {
|
|
layoutMode: 'HORIZONTAL',
|
|
primaryAxisSizing: 'HUG',
|
|
counterAxisSizing: 'HUG'
|
|
})
|
|
const right = graph.createNode('FRAME', page, {
|
|
layoutMode: 'HORIZONTAL',
|
|
primaryAxisSizing: 'HUG',
|
|
counterAxisSizing: 'HUG'
|
|
})
|
|
const child = graph.createNode('RECTANGLE', left.id, { width: 40, height: 20 })
|
|
const { runLayoutForNode, runMutationWithLayout } = createLayoutRunner(() => graph)
|
|
runLayoutForNode(left.id)
|
|
|
|
await runMutationWithLayout(() => graph.reparentNode(child.id, right.id), page)
|
|
|
|
expect(left.width).toBe(0)
|
|
expect(right.width).toBe(40)
|
|
})
|
|
})
|