lean4-htt/tests/elab/versoDocIndentedHeader.lean
Garmelon 08eb78a5b2
chore: switch to new test/bench suite (#12590)
This PR sets up the new integrated test/bench suite. It then migrates
all benchmarks and some related tests to the new suite. There's also
some documentation and some linting.

For now, a lot of the old tests are left alone so this PR doesn't become
even larger than it already is. Eventually, all tests should be migrated
to the new suite though so there isn't a confusing mix of two systems.
2026-02-25 13:51:53 +00:00

213 lines
5.1 KiB
Text

import Lean
set_option doc.verso true
/-!
This test checks that indentation-specific Verso syntax in docstrings is processed relative to their
indentation, rather than an absolute column 0.
-/
open Lean Elab Command in
def printVersoDocstring (name : Name) : CommandElabM Unit := do
match (← findInternalDocString? (← getEnv) name) with
| none => IO.println s!"No docstring for {name}"
| some (.inl md) => IO.println s!"Markdown:\n{md}"
| some (.inr v) => IO.println (repr v.text); IO.println (repr v.subsections)
-- Test 1: Indented header on non-first line (e.g. inside where block)
def foo := bar where
/--
# Header in where block
Content here
-/
bar := 1
/--
info: #[]
#[{ title := #[Lean.Doc.Inline.text "Header in where block"],
titleString := "Header in where block",
metadata := none,
content := #[Lean.Doc.Block.para
#[Lean.Doc.Inline.text "Content here", Lean.Doc.Inline.linebreak "\n", Lean.Doc.Inline.text " "]],
subParts := #[] }]
-/
#guard_msgs in
#eval printVersoDocstring ``foo.bar
-- Test 2: Multiple headers at indentation level
namespace Indented
/--
# First header
Some text.
## Second header
More text.
-/
def baz := 1
end Indented
/--
info: #[]
#[{ title := #[Lean.Doc.Inline.text "First header"],
titleString := "First header",
metadata := none,
content := #[Lean.Doc.Block.para #[Lean.Doc.Inline.text "Some text."]],
subParts := #[{ title := #[Lean.Doc.Inline.text "Second header"],
titleString := "Second header",
metadata := none,
content := #[Lean.Doc.Block.para
#[Lean.Doc.Inline.text "More text.", Lean.Doc.Inline.linebreak "\n",
Lean.Doc.Inline.text " "]],
subParts := #[] }] }]
-/
#guard_msgs in
#eval printVersoDocstring ``Indented.baz
-- Test 3: First-line header still works when indented
namespace FirstLine
/-- # Inline header -/
def qux := 1
/-- # Inline header
# Indented
-/
def quux := 1
end FirstLine
/--
info: #[]
#[{ title := #[Lean.Doc.Inline.text "Inline header "],
titleString := "Inline header ",
metadata := none,
content := #[],
subParts := #[] }]
-/
#guard_msgs in
#eval printVersoDocstring ``FirstLine.qux
/--
info: #[]
#[{ title := #[Lean.Doc.Inline.text "Inline header"],
titleString := "Inline header",
metadata := none,
content := #[],
subParts := #[] },
{ title := #[Lean.Doc.Inline.text "Indented"],
titleString := "Indented",
metadata := none,
content := #[],
subParts := #[] }]
-/
#guard_msgs in
#eval printVersoDocstring ``FirstLine.quux
-- Test 4: Indented code block fences
namespace CodeBlock
/--
# Code example
Some intro text.
```
example code
```
-/
def withCode := 1
end CodeBlock
/--
info: #[]
#[{ title := #[Lean.Doc.Inline.text "Code example"],
titleString := "Code example",
metadata := none,
content := #[Lean.Doc.Block.para #[Lean.Doc.Inline.text "Some intro text."], Lean.Doc.Block.code "example code\n"],
subParts := #[] }]
-/
#guard_msgs in
#eval printVersoDocstring ``CodeBlock.withCode
-- Test 5: Deeply nested indentation (column 8+)
namespace Deep
namespace Deeper
namespace Deepest
/--
# Deep header
Content at depth.
-/
def deep := 1
end Deepest
end Deeper
end Deep
/--
info: #[]
#[{ title := #[Lean.Doc.Inline.text "Deep header"],
titleString := "Deep header",
metadata := none,
content := #[Lean.Doc.Block.para
#[Lean.Doc.Inline.text "Content at depth.", Lean.Doc.Inline.linebreak "\n",
Lean.Doc.Inline.text " "]],
subParts := #[] }]
-/
#guard_msgs in
#eval printVersoDocstring ``Deep.Deeper.Deepest.deep
-- Test 6: Non-indented
/--
# Top-level header
Content.
-/
def topLevel := 1
/--
info: #[]
#[{ title := #[Lean.Doc.Inline.text "Top-level header"],
titleString := "Top\\-level header",
metadata := none,
content := #[Lean.Doc.Block.para #[Lean.Doc.Inline.text "Content.", Lean.Doc.Inline.linebreak "\n"]],
subParts := #[] }]
-/
#guard_msgs in
#eval printVersoDocstring ``topLevel
-- Test 7: Indented link reference
namespace Links
/--
# Header with link
See [Lean][lean-link] for more.
[lean-link]: https://lean-lang.org
-/
def withLink := 1
end Links
/--
info: #[]
#[{ title := #[Lean.Doc.Inline.text "Header with link"],
titleString := "Header with link",
metadata := none,
content := #[Lean.Doc.Block.para
#[Lean.Doc.Inline.text "See ",
Lean.Doc.Inline.link #[Lean.Doc.Inline.text "Lean"] "https://lean-lang.org",
Lean.Doc.Inline.text " for more."],
Lean.Doc.Block.concat #[]],
subParts := #[] }]
-/
#guard_msgs in
#eval printVersoDocstring ``Links.withLink
-- Test 8: Over-indented # is a syntax error (extra spaces beyond base column)
/--
@ +5:4...*
error: expected '#' (header) to start at column 2
-/
#guard_msgs (positions := true) in
def overIndented := bar where
/--
Some text.
# Not a header
-/
bar := 1