openpencil/tests/engine/layout/auto-layout/horizontal/basic.test.ts
Danila Poyarkov aad26b535e test: move prefixed splits into domain folders
- Move newly split tests under explicit domain subfolders
- Update nested helper imports after the moves
- Add a lint guard against repeating existing sibling domains as filename prefixes
2026-05-06 14:27:21 +03:00

169 lines
4.6 KiB
TypeScript

import { describe, expect, test } from 'bun:test'
import { computeAllLayouts, computeLayout, createEditor, SceneGraph } from '@open-pencil/core'
import { autoFrame, pageId, rect } from '#tests/helpers/layout'
describe('horizontal basic', () => {
test('positions children left-to-right', () => {
const graph = new SceneGraph()
const frame = autoFrame(graph, pageId(graph))
rect(graph, frame.id, 80, 40)
rect(graph, frame.id, 60, 40)
rect(graph, frame.id, 100, 40)
computeLayout(graph, frame.id)
const children = graph.getChildren(frame.id)
expect(children[0].x).toBe(0)
expect(children[1].x).toBe(80)
expect(children[2].x).toBe(140)
})
test('applies item spacing', () => {
const graph = new SceneGraph()
const frame = autoFrame(graph, pageId(graph), { itemSpacing: 10 })
rect(graph, frame.id, 50, 50)
rect(graph, frame.id, 50, 50)
rect(graph, frame.id, 50, 50)
computeLayout(graph, frame.id)
const children = graph.getChildren(frame.id)
expect(children[0].x).toBe(0)
expect(children[1].x).toBe(60)
expect(children[2].x).toBe(120)
})
test('applies padding', () => {
const graph = new SceneGraph()
const frame = autoFrame(graph, pageId(graph), {
paddingTop: 10,
paddingRight: 20,
paddingBottom: 30,
paddingLeft: 40
})
rect(graph, frame.id, 50, 50)
computeLayout(graph, frame.id)
const child = graph.getChildren(frame.id)[0]
expect(child.x).toBe(40)
expect(child.y).toBe(10)
})
test('applies padding and spacing together', () => {
const graph = new SceneGraph()
const frame = autoFrame(graph, pageId(graph), {
paddingLeft: 20,
paddingTop: 15,
itemSpacing: 10
})
rect(graph, frame.id, 50, 30)
rect(graph, frame.id, 50, 30)
computeLayout(graph, frame.id)
const children = graph.getChildren(frame.id)
expect(children[0].x).toBe(20)
expect(children[0].y).toBe(15)
expect(children[1].x).toBe(80)
expect(children[1].y).toBe(15)
})
test('positions children right-to-left when layoutDirection is RTL', () => {
const graph = new SceneGraph()
const frame = autoFrame(graph, pageId(graph), {
width: 300,
height: 80,
layoutDirection: 'RTL',
paddingLeft: 20,
paddingRight: 30,
itemSpacing: 10
})
rect(graph, frame.id, 50, 30)
rect(graph, frame.id, 60, 30)
computeLayout(graph, frame.id)
const children = graph.getChildren(frame.id)
expect(children[0].x).toBe(220)
expect(children[1].x).toBe(150)
})
test('inherits RTL flow when layoutDirection is AUTO inside an RTL parent', () => {
const graph = new SceneGraph()
const outer = autoFrame(graph, pageId(graph), {
width: 320,
height: 120,
layoutDirection: 'RTL'
})
const inner = autoFrame(graph, outer.id, {
width: 240,
height: 80,
layoutDirection: 'AUTO'
})
rect(graph, inner.id, 50, 30)
rect(graph, inner.id, 60, 30)
computeAllLayouts(graph, outer.id)
const children = graph.getChildren(inner.id)
expect(children[0].x).toBe(190)
expect(children[1].x).toBe(130)
})
test('allows nested frame to override parent flow direction', () => {
const graph = new SceneGraph()
const outer = autoFrame(graph, pageId(graph), {
width: 320,
height: 120,
layoutDirection: 'LTR'
})
const inner = autoFrame(graph, outer.id, {
width: 240,
height: 80,
layoutDirection: 'RTL'
})
rect(graph, inner.id, 50, 30)
rect(graph, inner.id, 60, 30)
computeAllLayouts(graph, outer.id)
const children = graph.getChildren(inner.id)
expect(children[0].x).toBe(190)
expect(children[1].x).toBe(130)
})
test('recomputes deep auto descendants when parent flow changes', () => {
const graph = new SceneGraph()
const outer = graph.createNode('FRAME', pageId(graph), {
layoutMode: 'VERTICAL',
primaryAxisSizing: 'FIXED',
counterAxisSizing: 'FIXED',
width: 320,
height: 200,
layoutDirection: 'LTR'
})
const wrapper = graph.createNode('FRAME', outer.id, {
layoutMode: 'NONE',
width: 280,
height: 120
})
const inner = autoFrame(graph, wrapper.id, {
width: 240,
height: 80,
layoutDirection: 'AUTO'
})
rect(graph, inner.id, 50, 30)
rect(graph, inner.id, 60, 30)
const editor = createEditor({ graph })
editor.updateNodeWithUndo(outer.id, { layoutDirection: 'RTL' }, 'Change layout direction')
const children = graph.getChildren(inner.id)
expect(children[0].x).toBe(190)
expect(children[1].x).toBe(130)
})
})