Files
opencode/packages/tui/test/markdown-streaming.test.tsx
2026-10-19 16:47:33 +02:00

52 lines
1.8 KiB
TypeScript

import { afterEach, expect, test } from "bun:test"
import { CodeRenderable, MarkdownRenderable, SyntaxStyle } from "@opentui/core"
import { testRender, useRenderer } from "@opentui/solid"
import { batch, createSignal } from "solid-js"
const renderers: {
renderer: Awaited<ReturnType<typeof testRender>>["renderer"]
syntaxStyle: SyntaxStyle
}[] = []
afterEach(async () => {
await Promise.all(
renderers.splice(0).map(async (output) => {
output.renderer.destroy()
await output.renderer.closed
output.syntaxStyle.destroy()
}),
)
})
test.each(["completion-first", "content-first"])("applies final fence text in a Solid batch: %s", async (order) => {
const [content, setContent] = createSignal("```text\ninitial")
const [streaming, setStreaming] = createSignal(true)
const output = await testRender(
() => {
const renderer = useRenderer()
const syntaxStyle = SyntaxStyle.fromStyles({ default: { fg: "#ffffff" } }, renderer.nativeScene)
renderers.push({ renderer, syntaxStyle })
return (
<markdown syntaxStyle={syntaxStyle} content={content()} streaming={streaming()} internalBlockMode="top-level" />
)
},
{ width: 80, height: 12, remote: true },
)
await output.renderOnce()
batch(() => {
if (order === "completion-first") setStreaming(false)
setContent("```text\ninitial final\n```")
if (order === "content-first") setStreaming(false)
})
await output.renderOnce()
const markdown = output.renderer.root.getChildren()[0]
expect(markdown).toBeInstanceOf(MarkdownRenderable)
const block = markdown?.getChildren()[0]
expect(block).toBeInstanceOf(CodeRenderable)
if (!(block instanceof CodeRenderable)) throw new Error("Expected a code fence")
expect(block.content).toBe("initial final")
expect(markdown?.getChildren()).toHaveLength(1)
})