openpencil/tests/engine/io/fig/import/property-integrity.test.ts
2026-05-16 11:59:02 +03:00

98 lines
2.7 KiB
TypeScript

import { beforeAll, describe, expect, setDefaultTimeout, test } from 'bun:test'
import { type Fill, type SceneNode } from '@open-pencil/core'
import { parseGoldPreviewFixture } from '#tests/helpers/fig-fixtures'
setDefaultTimeout(60_000)
let allNodes: SceneNode[]
beforeAll(async () => {
const fixture = await parseGoldPreviewFixture()
allNodes = fixture.allNodes
})
describe('property integrity', () => {
test('all nodes have finite dimensions', () => {
for (const n of allNodes) {
expect(Number.isFinite(n.width)).toBe(true)
expect(Number.isFinite(n.height)).toBe(true)
expect(n.width).toBeGreaterThanOrEqual(0)
expect(n.height).toBeGreaterThanOrEqual(0)
}
})
test('all nodes have finite positions', () => {
for (const n of allNodes) {
expect(Number.isFinite(n.x)).toBe(true)
expect(Number.isFinite(n.y)).toBe(true)
}
})
test('all nodes have valid opacity', () => {
for (const n of allNodes) {
expect(n.opacity).toBeGreaterThanOrEqual(0)
expect(n.opacity).toBeLessThanOrEqual(1)
}
})
test('TEXT nodes have fontFamily', () => {
for (const n of allNodes) {
if (n.type === 'TEXT') {
expect(typeof n.fontFamily).toBe('string')
expect(n.fontFamily.length).toBeGreaterThan(0)
}
}
})
test('TEXT nodes have valid fontSize', () => {
for (const n of allNodes) {
if (n.type === 'TEXT') {
expect(n.fontSize).toBeGreaterThan(0)
}
}
})
test('fills have valid colors', () => {
function checkFill(fill: Fill) {
if (fill.type === 'SOLID') {
const { r, g, b, a } = fill.color
expect(r).toBeGreaterThanOrEqual(0)
expect(r).toBeLessThanOrEqual(1)
expect(g).toBeGreaterThanOrEqual(0)
expect(g).toBeLessThanOrEqual(1)
expect(b).toBeGreaterThanOrEqual(0)
expect(b).toBeLessThanOrEqual(1)
expect(a).toBeGreaterThanOrEqual(0)
expect(a).toBeLessThanOrEqual(1)
}
}
for (const n of allNodes) {
for (const fill of n.fills) {
checkFill(fill)
}
}
})
test('effects have valid radius', () => {
for (const n of allNodes) {
for (const e of n.effects) {
expect(e.radius).toBeGreaterThanOrEqual(0)
}
}
})
test('layout nodes have valid spacing', () => {
for (const n of allNodes) {
if (n.layoutMode !== 'NONE') {
expect(Number.isFinite(n.itemSpacing)).toBe(true)
expect(n.paddingTop).toBeGreaterThanOrEqual(0)
expect(n.paddingRight).toBeGreaterThanOrEqual(0)
expect(n.paddingBottom).toBeGreaterThanOrEqual(0)
expect(n.paddingLeft).toBeGreaterThanOrEqual(0)
}
}
})
})