Files
svgedit/tests/e2e/unit/svgcore-geometry.spec.js
JFH fa380402e1 increase test coverage
extend test coverage
2025-12-07 10:56:29 +01:00

123 lines
4.4 KiB
JavaScript

import { test, expect } from '../fixtures.js'
test.describe('SVG core math and coords', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/tests/unit-harness.html')
await page.waitForFunction(() => Boolean(window.svgHarness))
})
test('math helpers consolidate transforms and snapping', async ({ page }) => {
const result = await page.evaluate(() => {
const { math } = window.svgHarness
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
document.body.append(svg)
const identity = math.transformPoint(100, 200, svg.createSVGMatrix())
const translatedMatrix = svg.createSVGMatrix()
translatedMatrix.e = 300
translatedMatrix.f = 400
const translated = math.transformPoint(5, 5, translatedMatrix)
const tlist = math.getTransformList(svg)
const hasMatrixBefore = math.hasMatrixTransform(tlist)
const tf = svg.createSVGTransformFromMatrix(translatedMatrix)
tlist.appendItem(tf)
const consolidated = math.transformListToTransform(tlist).matrix
const hasMatrixAfter = math.hasMatrixTransform(tlist)
const multiplied = math.matrixMultiply(
svg.createSVGMatrix().translate(10, 20),
svg.createSVGMatrix().translate(-10, -20)
)
const snapped = math.snapToAngle(0, 0, 10, 5)
const intersects = {
overlap: math.rectsIntersect(
{ x: 0, y: 0, width: 50, height: 50 },
{ x: 25, y: 25, width: 10, height: 10 }
),
apart: math.rectsIntersect(
{ x: 0, y: 0, width: 10, height: 10 },
{ x: 100, y: 100, width: 5, height: 5 }
)
}
return {
identity,
translated,
hasMatrixBefore,
hasMatrixAfter,
consolidated: { e: consolidated.e, f: consolidated.f },
multiplied: { e: multiplied.e, f: multiplied.f },
snapped,
intersects
}
})
expect(result.identity).toEqual({ x: 100, y: 200 })
expect(result.translated).toEqual({ x: 305, y: 405 })
expect(result.hasMatrixBefore).toBe(false)
expect(result.hasMatrixAfter).toBe(true)
expect(result.consolidated.e).toBe(300)
expect(result.consolidated.f).toBe(400)
expect(result.multiplied.e).toBe(0)
expect(result.multiplied.f).toBe(0)
expect(result.snapped.a).toBeCloseTo(Math.PI / 4)
expect(result.intersects.overlap).toBe(true)
expect(result.intersects.apart).toBe(false)
})
test('coords.remapElement handles translation and scaling', async ({ page }) => {
const result = await page.evaluate(() => {
const { coords, utilities } = window.svgHarness
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
document.body.append(svg)
utilities.init({
getSvgRoot: () => svg,
getDOMDocument: () => document,
getDOMContainer: () => svg
})
coords.init({
getGridSnapping: () => false,
getDrawing: () => ({ getNextId: () => '1' })
})
const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')
rect.setAttribute('x', '200')
rect.setAttribute('y', '150')
rect.setAttribute('width', '250')
rect.setAttribute('height', '120')
svg.append(rect)
const translateMatrix = svg.createSVGMatrix()
translateMatrix.e = 100
translateMatrix.f = -50
coords.remapElement(
rect,
{ x: '200', y: '150', width: '125', height: '75' },
translateMatrix
)
const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')
circle.setAttribute('cx', '200')
circle.setAttribute('cy', '150')
circle.setAttribute('r', '250')
svg.append(circle)
const scaleMatrix = svg.createSVGMatrix()
scaleMatrix.a = 2
scaleMatrix.d = 0.5
coords.remapElement(
circle,
{ cx: '200', cy: '150', r: '250' },
scaleMatrix
)
return {
rect: {
x: rect.getAttribute('x'),
y: rect.getAttribute('y'),
width: rect.getAttribute('width'),
height: rect.getAttribute('height')
},
circle: {
cx: circle.getAttribute('cx'),
cy: circle.getAttribute('cy'),
r: circle.getAttribute('r')
}
}
})
expect(result.rect).toEqual({ x: '300', y: '100', width: '125', height: '75' })
expect(result.circle).toEqual({ cx: '400', cy: '75', r: '125' })
})
})