// Copyright (c) 2026 Petr Balvín (https://petrbalvin.org) // SPDX-License-Identifier: MIT package markdown import "testing" func TestFootnotes(t *testing.T) { cases := []struct { name string input string want string }{ {"basic footnote", "Here is a reference.[^1]\n\n[^1]: Here is the note.", "

Here is a reference." + `1` + "

\n" + "
\n
    \n" + "
  1. \n" + "

    Here is the note." + ` ` + "↩" + `` + "

    \n" + "
  2. \n
\n
\n"}, {"unreferenced definition renders nothing", "[^1]: the note", ""}, {"undefined reference stays text", "Text[^missing]", "

Text[^missing]

\n"}, {"numbered by reference order", "[^b] and [^a]\n\n[^a]: A\n[^b]: B", "

" + `1` + " and " + `2` + "

\n" + "
\n
    \n" + "
  1. \n

    B" + ` ` + "↩" + `` + "

    \n
  2. \n" + "
  3. \n

    A" + ` ` + "↩" + `` + "

    \n
  4. \n" + "
\n
\n"}, {"repeated reference ids", "[^a] again [^a]\n\n[^a]: A", "

" + `1` + " again " + `1` + "

\n" + "
\n
    \n" + "
  1. \n

    A" + ` ` + "↩" + `` + "

    \n
  2. \n
\n
\n"}, {"multi block definition", "Ref.[^1]\n\n[^1]: first\n\n second", "

Ref." + `1` + "

\n" + "
\n
    \n" + "
  1. \n

    first

    \n

    second" + ` ` + "↩" + `` + "

    \n
  2. \n
\n
\n"}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { got := string(RenderHTML([]byte(tc.input))) if got != tc.want { t.Errorf("input %q\ngot: %q\nwant: %q", tc.input, got, tc.want) } }) } } func TestDefinitionLists(t *testing.T) { cases := []struct { name string input string want string }{ {"definition basic", "Term\n: Definition", "
\n
Term
\n
Definition
\n
\n"}, {"definition two entries", "Term 1\n: Def 1\n\nTerm 2\n: Def 2", "
\n
Term 1
\n
\n

Def 1

\n
\n
Term 2
\n
\n

Def 2

\n
\n
\n"}, {"definition two definitions", "Term\n: Def a\n: Def b", "
\n
Term
\n
Def a
\n
Def b
\n
\n"}, {"definition multiline terms", "Term 1\nTerm 2\n: Def", "
\n
Term 1
\n
Term 2
\n
Def
\n
\n"}, {"definition second paragraph", "Term\n: Def\n\n more", "
\n
Term
\n
\n

Def

\n

more

\n
\n
\n"}, {"definition inline content", "Term\n: A *bold* claim", "
\n
Term
\n
A bold claim
\n
\n"}, {"definition paragraph after list", "Term\n: Definition\n\nParagraph after.", "
\n
Term
\n
Definition
\n
\n

Paragraph after.

\n"}, {"definition paragraph between lists", "Term\n: Def\n\nBetween\n\nTerm 2\n: Def 2", "
\n
Term
\n
Def
\n
\n

Between

\n
\n
Term 2
\n
Def 2
\n
\n"}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { got := string(RenderHTML([]byte(tc.input))) if got != tc.want { t.Errorf("input %q\ngot: %q\nwant: %q", tc.input, got, tc.want) } }) } }