openpencil/tests/engine/render/canvas/boolean-visual.test.ts
2026-05-17 19:16:56 +03:00

81 lines
2.3 KiB
TypeScript

import { existsSync } from 'node:fs'
import { describe, expect, test } from 'bun:test'
import { initCanvasKit } from '#cli/headless'
const MATRIX_PATH = '/tmp/open-pencil-boolean-matrix.png'
const CELL_W = 180
const CELL_H = 150
const MATRIX_COLUMNS = 4
const MATRIX_ROWS = 8
const MIN_CELL_COLORED_PIXELS = 50
function isColoredPixel(pixels: Uint8Array, index: number): boolean {
const isWhite = pixels[index] > 245 && pixels[index + 1] > 245 && pixels[index + 2] > 245
return !isWhite && pixels[index + 3] > 0
}
function countCellColoredPixels(
pixels: Uint8Array,
imageWidth: number,
column: number,
row: number
): number {
let count = 0
const startX = column * CELL_W
const startY = row * CELL_H
for (let y = startY; y < startY + CELL_H; y++) {
for (let x = startX; x < startX + CELL_W; x++) {
if (isColoredPixel(pixels, (y * imageWidth + x) * 4)) count++
}
}
return count
}
describe('boolean visual matrix', () => {
test('generates a non-empty visual fixture for supported shape cases', async () => {
const proc = Bun.spawnSync({
cmd: ['bun', 'tests/engine/render/canvas/visual/boolean-matrix.ts'],
stdout: 'pipe',
stderr: 'pipe'
})
expect(proc.exitCode).toBe(0)
expect(existsSync(MATRIX_PATH)).toBe(true)
const ck = await initCanvasKit()
const bytes = await Bun.file(MATRIX_PATH).arrayBuffer()
const image = ck.MakeImageFromEncoded(bytes)
expect(image).not.toBeNull()
if (!image) return
const imageWidth = image.width()
const imageHeight = image.height()
expect(imageWidth).toBe(720)
expect(imageHeight).toBe(1200)
const pixels = image.readPixels(0, 0, {
width: imageWidth,
height: imageHeight,
colorType: ck.ColorType.RGBA_8888,
alphaType: ck.AlphaType.Unpremul,
colorSpace: ck.ColorSpace.SRGB
})
image.delete()
let coloredPixels = 0
for (let i = 0; i < pixels.length; i += 4) {
if (isColoredPixel(pixels, i)) coloredPixels++
}
expect(coloredPixels).toBeGreaterThan(20_000)
for (let row = 0; row < MATRIX_ROWS; row++) {
for (let column = 0; column < MATRIX_COLUMNS; column++) {
expect(countCellColoredPixels(pixels, imageWidth, column, row)).toBeGreaterThan(
MIN_CELL_COLORED_PIXELS
)
}
}
})
})