plugin-markdown.test.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334
  1. import { expect, test } from "bun:test"
  2. import { SyntaxStyle, TextRenderable, type MarkdownOptions, type RenderNodeContext } from "@opentui/core"
  3. import { createTestRenderer } from "@opentui/core/testing"
  4. import { combineMarkdownRenderers } from "../src/plugin/context"
  5. const code = (language: string) => ({ type: "code" as const, lang: language, text: "content", raw: "" })
  6. const context: RenderNodeContext = {
  7. syntaxStyle: SyntaxStyle.fromStyles({ default: { fg: "#ffffff" } }),
  8. conceal: false,
  9. concealCode: false,
  10. defaultRender: () => null,
  11. }
  12. test("dispatches Markdown code blocks by normalized language", async () => {
  13. const { renderer } = await createTestRenderer({ width: 20, height: 4 })
  14. const expected = new TextRenderable(renderer, { content: "expected" })
  15. const render = (() => expected) satisfies NonNullable<MarkdownOptions["renderNode"]>
  16. const combined = combineMarkdownRenderers([{ mermaid: render }])!
  17. expect(combined(code("mermaid title=example"), context)).toBe(expected)
  18. expect(combined(code("typescript"), context)).toBeUndefined()
  19. renderer.destroy()
  20. })
  21. test("later Markdown renderer registrations take precedence", async () => {
  22. const { renderer } = await createTestRenderer({ width: 20, height: 4 })
  23. const first = new TextRenderable(renderer, { content: "first" })
  24. const second = new TextRenderable(renderer, { content: "second" })
  25. const combined = combineMarkdownRenderers([{ mermaid: () => first }, { mermaid: () => second }])!
  26. expect(combined(code("mermaid"), context)).toBe(second)
  27. expect(combineMarkdownRenderers([])).toBeUndefined()
  28. renderer.destroy()
  29. })