openpencil/tests/engine/editor/layout/mutation-impact.test.ts

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