import lib // --- escapeHtml --- fn test_escape_empty(): Unit with {Test} = Test.assertEqualMsg("", lib.escapeHtml(""), "escape empty string") fn test_escape_no_special(): Unit with {Test} = Test.assertEqualMsg("hello world", lib.escapeHtml("hello world"), "no special chars unchanged") fn test_escape_ampersand(): Unit with {Test} = Test.assertEqualMsg("a & b", lib.escapeHtml("a & b"), "escape ampersand") fn test_escape_less_than(): Unit with {Test} = Test.assertEqualMsg("<div>", lib.escapeHtml("
"), "escape angle brackets") fn test_escape_all_three(): Unit with {Test} = Test.assertEqualMsg("<a> & <b>", lib.escapeHtml(" & "), "escape all three") // --- inline: bold --- fn test_bold(): Unit with {Test} = Test.assertEqualMsg("bold", lib.inlineToHtml("**bold**"), "bold text") fn test_bold_in_sentence(): Unit with {Test} = Test.assertEqualMsg("a bold b", lib.inlineToHtml("a **bold** b"), "bold in sentence") fn test_bold_unclosed(): Unit with {Test} = Test.assertEqualMsg("**unclosed", lib.inlineToHtml("**unclosed"), "unclosed bold") // --- inline: italic --- fn test_italic_asterisk(): Unit with {Test} = Test.assertEqualMsg("italic", lib.inlineToHtml("*italic*"), "italic with asterisk") fn test_italic_underscore(): Unit with {Test} = Test.assertEqualMsg("italic", lib.inlineToHtml("_italic_"), "italic with underscore") fn test_italic_unclosed(): Unit with {Test} = Test.assertEqualMsg("*unclosed", lib.inlineToHtml("*unclosed"), "unclosed italic") // --- inline: code --- fn test_inline_code(): Unit with {Test} = Test.assertEqualMsg("code", lib.inlineToHtml("`code`"), "inline code") fn test_inline_code_with_html(): Unit with {Test} = Test.assertEqualMsg("<div>", lib.inlineToHtml("`
`"), "code escapes HTML") fn test_inline_code_unclosed(): Unit with {Test} = Test.assertEqualMsg("`unclosed", lib.inlineToHtml("`unclosed"), "unclosed backtick") // --- inline: strikethrough --- fn test_strikethrough(): Unit with {Test} = Test.assertEqualMsg("strike", lib.inlineToHtml("~~strike~~"), "strikethrough") fn test_strikethrough_unclosed(): Unit with {Test} = Test.assertEqualMsg("~~unclosed", lib.inlineToHtml("~~unclosed"), "unclosed strikethrough") // --- inline: links --- fn test_link(): Unit with {Test} = Test.assertEqualMsg("text", lib.inlineToHtml("[text](/page)"), "basic link") fn test_link_with_formatting(): Unit with {Test} = Test.assertEqualMsg("bold link", lib.inlineToHtml("**[bold link](/)**"), "bold link") fn test_link_empty_text(): Unit with {Test} = Test.assertEqualMsg("", lib.inlineToHtml("[](/page)"), "link with empty text") fn test_link_unclosed(): Unit with {Test} = Test.assertEqualMsg("[unclosed", lib.inlineToHtml("[unclosed"), "unclosed bracket") // --- inline: images --- fn test_image(): Unit with {Test} = Test.assertEqualMsg("\"alt", lib.inlineToHtml("![alt text](img.png)"), "basic image") fn test_image_empty_alt(): Unit with {Test} = Test.assertEqualMsg("\"\"", lib.inlineToHtml("![](photo.jpg)"), "image with empty alt") // --- inline: plain text --- fn test_plain_text(): Unit with {Test} = Test.assertEqualMsg("hello world", lib.inlineToHtml("hello world"), "plain text unchanged") fn test_empty_inline(): Unit with {Test} = Test.assertEqualMsg("", lib.inlineToHtml(""), "empty input") // --- block: headings --- fn test_h1(): Unit with {Test} = Test.assertEqualMsg("

Hello

\n", lib.toHtml("# Hello"), "h1") fn test_h2(): Unit with {Test} = Test.assertEqualMsg("

World

\n", lib.toHtml("## World"), "h2") fn test_h3(): Unit with {Test} = Test.assertEqualMsg("

Sub

\n", lib.toHtml("### Sub"), "h3") fn test_h4(): Unit with {Test} = Test.assertEqualMsg("

Deep

\n", lib.toHtml("#### Deep"), "h4") fn test_heading_with_inline(): Unit with {Test} = Test.assertEqualMsg("

Bold heading

\n", lib.toHtml("# **Bold** heading"), "heading with inline formatting") // --- block: paragraphs --- fn test_single_paragraph(): Unit with {Test} = Test.assertEqualMsg("

hello world

\n", lib.toHtml("hello world"), "single paragraph") fn test_empty_input(): Unit with {Test} = Test.assertEqualMsg("", lib.toHtml(""), "empty input produces empty output") // --- block: code blocks --- fn test_code_block(): Unit with {Test} = Test.assertEqualMsg("
hello\n
\n", lib.toHtml("```\nhello\n```"), "code block") fn test_code_block_with_lang(): Unit with {Test} = Test.assertEqualMsg("
let x = 1;\n
\n", lib.toHtml("```js\nlet x = 1;\n```"), "code block with language") fn test_code_block_escapes_html(): Unit with {Test} = Test.assertEqualMsg("
<div>\n
\n", lib.toHtml("```\n
\n```"), "code block escapes HTML") // --- block: lists --- fn test_unordered_list(): Unit with {Test} = Test.assertEqualMsg("
    \n
  • one
  • \n
  • two
  • \n
\n", lib.toHtml("- one\n- two"), "unordered list") fn test_ordered_list(): Unit with {Test} = Test.assertEqualMsg("
    \n
  1. first
  2. \n
  3. second
  4. \n
\n", lib.toHtml("1. first\n2. second"), "ordered list") fn test_single_item_list(): Unit with {Test} = Test.assertEqualMsg("
    \n
  • only
  • \n
\n", lib.toHtml("- only"), "single item list") // --- block: blockquotes --- fn test_blockquote(): Unit with {Test} = Test.assertEqualMsg("
\n

quoted

\n
\n", lib.toHtml("> quoted"), "blockquote") // --- block: horizontal rules --- fn test_hr_dashes(): Unit with {Test} = Test.assertEqualMsg("
\n", lib.toHtml("---"), "hr with dashes") fn test_hr_asterisks(): Unit with {Test} = Test.assertEqualMsg("
\n", lib.toHtml("***"), "hr with asterisks") fn test_hr_underscores(): Unit with {Test} = Test.assertEqualMsg("
\n", lib.toHtml("___"), "hr with underscores") // --- block: HTML passthrough --- fn test_html_passthrough(): Unit with {Test} = Test.assertEqualMsg("
bar
\n", lib.toHtml("
bar
"), "HTML passes through") fn test_heading_in_list(): Unit with {Test} = Test.assertEqualMsg("
    \n
  • Title

  • \n
\n", lib.toHtml("- ### Title"), "heading inside list item")