markdownRepair.test.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { describe, expect, it } from 'vitest'
  2. import { repairMarkdownForRender, repairNestedMarkdownFences } from '@/utils/markdownRepair'
  3. describe('repairNestedMarkdownFences', () => {
  4. it('unwraps a whole-answer outer md fence', () => {
  5. const input = '```md\n# 标题\n\n- 项目一\n- 项目二\n```'
  6. expect(repairNestedMarkdownFences(input)).toBe('# 标题\n\n- 项目一\n- 项目二')
  7. })
  8. it('keeps a real code block untouched', () => {
  9. const input = '说明\n\n```ts\nconst a = 1\n```\n\n结尾'
  10. expect(repairNestedMarkdownFences(input)).toBe(input)
  11. })
  12. it('promotes literal fences nested inside a markdown example', () => {
  13. const input = '```md\n示例\n\n```\nnested\n```\n```'
  14. expect(repairNestedMarkdownFences(input)).toBe('示例\n\n```\nnested\n```')
  15. })
  16. it('ignores content without fences', () => {
  17. expect(repairNestedMarkdownFences('普通文本')).toBe('普通文本')
  18. })
  19. })
  20. describe('repairMarkdownForRender', () => {
  21. it('closes a dangling fence left open by truncation', () => {
  22. const result = repairMarkdownForRender('前言\n\n```python\nprint(1)')
  23. expect(result).toBe('前言\n\n```python\nprint(1)\n```')
  24. })
  25. it('keeps dangling fences open while streaming', () => {
  26. const input = '```python\nprint(1)'
  27. expect(repairMarkdownForRender(input, true)).toBe(input)
  28. })
  29. it('does not close an already balanced fence', () => {
  30. const input = '```js\nconst a = 1\n```'
  31. expect(repairMarkdownForRender(input)).toBe(input)
  32. })
  33. it('keeps a truncated outer md wrapper as a code block while closing it', () => {
  34. // 流被截断时外层 md 围栏没有终止行,解包条件不成立;仅补闭合让它按代码块渲染。
  35. const result = repairMarkdownForRender('```md\n# 标题\n\n```ts\nconst a = 1')
  36. expect(result).toBe('```md\n# 标题\n\n```ts\nconst a = 1\n```')
  37. })
  38. })