mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-23 10:45:33 -04:00
134 lines
3.6 KiB
TypeScript
134 lines
3.6 KiB
TypeScript
import { expect, test } from "bun:test"
|
|
import { createCanvas, loadImage } from "@napi-rs/canvas"
|
|
import { RGBA, TextAttributes, type CapturedFrame } from "@opentui/core"
|
|
import { SimulationPng } from "../src/frontend/png"
|
|
|
|
test("renders captured frames with bundled fonts", () => {
|
|
const frame: CapturedFrame = {
|
|
cols: 4,
|
|
rows: 1,
|
|
cursor: [0, 0],
|
|
lines: [
|
|
{
|
|
spans: [
|
|
{
|
|
text: "Test",
|
|
width: 4,
|
|
fg: RGBA.fromInts(255, 255, 255),
|
|
bg: RGBA.fromInts(0, 0, 0),
|
|
attributes: TextAttributes.BOLD | TextAttributes.ITALIC,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
}
|
|
|
|
const image = SimulationPng.screenshotFrame(frame)
|
|
expect(image.width).toBe(40)
|
|
expect(image.height).toBe(20)
|
|
expect(image.data.subarray(1, 4).toString()).toBe("PNG")
|
|
})
|
|
|
|
test("renders OpenCode symbols instead of missing-glyph boxes", async () => {
|
|
const pixels = async (text: string) => {
|
|
const image = SimulationPng.screenshotFrame({
|
|
cols: 1,
|
|
rows: 1,
|
|
cursor: [0, 0],
|
|
lines: [
|
|
{
|
|
spans: [
|
|
{
|
|
text,
|
|
width: 1,
|
|
fg: RGBA.fromInts(255, 255, 255),
|
|
bg: RGBA.fromInts(0, 0, 0),
|
|
attributes: 0,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
})
|
|
const canvas = createCanvas(image.width, image.height)
|
|
const context = canvas.getContext("2d")
|
|
context.drawImage(await loadImage(image.data), 0, 0)
|
|
return [...context.getImageData(0, 0, image.width, image.height).data]
|
|
}
|
|
|
|
const missingGlyph = await pixels("\u{10ffff}")
|
|
for (const symbol of ["△", "✱", "⇆", "⠹"]) {
|
|
expect(await pixels(symbol)).not.toEqual(missingGlyph)
|
|
}
|
|
})
|
|
|
|
test("fills adjacent block elements without glyph gaps", async () => {
|
|
const image = SimulationPng.screenshotFrame({
|
|
cols: 2,
|
|
rows: 1,
|
|
cursor: [0, 0],
|
|
lines: [
|
|
{
|
|
spans: [
|
|
{
|
|
text: "▀▀",
|
|
width: 2,
|
|
fg: RGBA.fromInts(255, 255, 255),
|
|
bg: RGBA.fromInts(0, 0, 0),
|
|
attributes: 0,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
})
|
|
const canvas = createCanvas(image.width, image.height)
|
|
const context = canvas.getContext("2d")
|
|
context.drawImage(await loadImage(image.data), 0, 0)
|
|
|
|
expect([...context.getImageData(0, 5, image.width, 1).data]).toEqual(
|
|
Array.from({ length: image.width }, () => [255, 255, 255, 255]).flat(),
|
|
)
|
|
expect([...context.getImageData(0, 15, image.width, 1).data]).toEqual(
|
|
Array.from({ length: image.width }, () => [0, 0, 0, 255]).flat(),
|
|
)
|
|
})
|
|
|
|
test("draws heavy vertical box elements on cell boundaries", async () => {
|
|
const image = SimulationPng.screenshotFrame({
|
|
cols: 1,
|
|
rows: 2,
|
|
cursor: [0, 0],
|
|
lines: [
|
|
{
|
|
spans: [
|
|
{
|
|
text: "┃",
|
|
width: 1,
|
|
fg: RGBA.fromInts(255, 255, 255),
|
|
bg: RGBA.fromInts(0, 0, 0),
|
|
attributes: 0,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
spans: [
|
|
{
|
|
text: "╹",
|
|
width: 1,
|
|
fg: RGBA.fromInts(255, 255, 255),
|
|
bg: RGBA.fromInts(0, 0, 0),
|
|
attributes: 0,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
})
|
|
const canvas = createCanvas(image.width, image.height)
|
|
const context = canvas.getContext("2d")
|
|
context.drawImage(await loadImage(image.data), 0, 0)
|
|
|
|
expect([...context.getImageData(4, 0, 2, 30).data]).toEqual(
|
|
Array.from({ length: 60 }, () => [255, 255, 255, 255]).flat(),
|
|
)
|
|
expect([...context.getImageData(4, 30, 2, 10).data]).toEqual(Array.from({ length: 20 }, () => [0, 0, 0, 255]).flat())
|
|
})
|