openpencil/tests/engine/render/canvas/guides/redlines.test.ts
2026-08-20 14:02:33 +03:00

37 lines
1.4 KiB
TypeScript

import { describe, expect, test } from 'bun:test'
import { SceneGraph } from '@open-pencil/scene-graph'
import { computeGuideRedline } from '#core/canvas/guides/redlines'
function setup() {
const graph = new SceneGraph()
const page = graph.getNode(graph.rootId)
if (!page) throw new Error('Expected page')
const frame = graph.createNode('FRAME', page.id, { x: 100, y: 100, width: 300, height: 200 })
graph.createNode('RECTANGLE', frame.id, { x: 50, y: 40, width: 80, height: 60 })
return { graph, pageId: page.id, frameId: frame.id }
}
describe('guide redlines', () => {
test('measures from a guide outside a top-level frame to its nearest edge', () => {
const { graph, pageId, frameId } = setup()
expect(computeGuideRedline(graph, pageId, frameId, 'x', 40)).toEqual({
segment: { axis: 'x', from: 40, to: 100, cross: 200, value: 60 },
targetId: frameId
})
})
test('measures from an intersecting guide to frame children', () => {
const { graph, pageId, frameId } = setup()
const redline = computeGuideRedline(graph, pageId, frameId, 'x', 120)
expect(redline?.segment).toMatchObject({ axis: 'x', from: 120, to: 150, value: 30 })
})
test('only accepts top-level selected frames', () => {
const { graph, pageId, frameId } = setup()
const nested = graph.createNode('FRAME', frameId)
expect(computeGuideRedline(graph, pageId, nested.id, 'x', 0)).toBeNull()
})
})