# Small program that runs the test cases for 'nim doc'.
# To run this, cd to the git repo root, and run "nim r nimdoc/tester.nim".
# to change expected results (after carefully verifying everything), use -d:nimTestsNimdocFixup
import strutils, os
from std/private/gitutils import diffFiles
const fixup = defined(nimTestsNimdocFixup)
var
failures = 0
const
baseDir = "nimdoc"
let
baseDirAbs = getCurrentDir() / baseDir
type
NimSwitches = object
doc: seq[string]
docStage2: seq[string]
buildIndex: seq[string]
md2html: seq[string]
md2htmlStage2: seq[string]
proc exec(cmd: string) =
if execShellCmd(cmd) != 0:
quit("FAILURE: " & cmd)
proc testNimDoc(prjDir, docsDir: string; switches: NimSwitches; fixup = false) =
let
nimDocSwitches = switches.doc.join(" ")
nimDocStage2Switches = switches.docStage2.join(" ")
nimMd2HtmlSwitches = switches.md2html.join(" ")
nimMd2HtmlStage2Switches = switches.md2htmlStage2.join(" ")
nimBuildIndexSwitches = switches.buildIndex.join(" ")
putEnv("SOURCE_DATE_EPOCH", "100000")
const nimExe = getCurrentCompilerExe() # so that `bin/nim_temp r nimdoc/tester.nim` works
if nimDocSwitches != "":
exec("$1 doc $2" % [nimExe, nimDocSwitches])
echo("$1 doc $2" % [nimExe, nimDocSwitches])
if nimMd2HtmlSwitches != "":
exec("$1 md2html $2" % [nimExe, nimMd2HtmlSwitches])
echo("$1 md2html $2" % [nimExe, nimMd2HtmlSwitches])
if nimDocStage2Switches != "":
exec("$1 doc $2" % [nimExe, nimDocStage2Switches])
echo("$1 doc $2" % [nimExe, nimDocStage2Switches])
if nimMd2HtmlStage2Switches != "":
exec("$1 md2html $2" % [nimExe, nimMd2HtmlStage2Switches])
echo("$1 md2html $2" % [nimExe, nimMd2HtmlStage2Switches])
if nimBuildIndexSwitches != "":
exec("$1 buildIndex $2" % [nimExe, nimBuildIndexSwitches])
echo("$1 buildIndex $2" % [nimExe, nimBuildIndexSwitches])
for expected in walkDirRec(prjDir / "expected/", checkDir=true):
let versionCacheParam = "?v=" & $NimMajor & "." & $NimMinor & "." & $NimPatch
let produced = expected.replace('\\', '/').replace("/expected/", "/$1/" % [docsDir])
if not fileExists(produced):
echo "FAILURE: files not found: ", produced
inc failures
let producedFile = readFile(produced).replace(versionCacheParam,"") #remove version cache param used for cache invalidation
if readFile(expected) != producedFile:
echo "FAILURE: files differ: ", produced
echo diffFiles(expected, produced).output
inc failures
if fixup:
writeFile(expected, producedFile)
else:
echo "SUCCESS: files identical: ", produced
if failures == 0 and ((prjDir / docsDir) != prjDir):
removeDir(prjDir / docsDir)
# Test "nim doc --project --out:.. --index:on .."
let
test1PrjName = "testproject"
test1Dir = baseDir / test1PrjName
test1DocsDir = "htmldocs"
test1Switches = NimSwitches(doc: @["--project",
"--out:$1/$2" % [test1Dir, test1DocsDir],
"--index:on",
"$1/$2.nim" % [test1Dir, test1PrjName]],
buildIndex: @["--out:$1/$2/theindex.html" % [test1Dir, test1DocsDir],
"$1/$2" % [test1Dir, test1DocsDir]])
testNimDoc(test1Dir, test1DocsDir, test1Switches, fixup)
# Test "nim doc --out:.. --index:on .."
let
test2PrjDir = "test_out_index_dot_html"
test2PrjName = "foo"
test2Dir = baseDir / test2PrjDir
test2DocsDir = "htmldocs"
test2Switches = NimSwitches(doc: @["--out:$1/$2/index.html" % [test2Dir, test2DocsDir],
"--index:on",
"$1/$2.nim" % [test2Dir, test2PrjName]],
buildIndex: @["--out:$1/$2/theindex.html" % [test2Dir, test2DocsDir],
"$1/$2" % [test2Dir, test2DocsDir]])
testNimDoc(test2Dir, test2DocsDir, test2Switches, fixup)
# Test `nim doc` on file with `{.doctype.}` pragma
let
test3PrjDir = "test_doctype"
test3PrjName = "test_doctype"
test3Dir = baseDir / test3PrjDir
test3DocsDir = "htmldocs"
test3Switches = NimSwitches(doc: @["$1/$2.nim" % [test3Dir, test3PrjName]])
testNimDoc(test3Dir, test3DocsDir, test3Switches, fixup)
# Test concise external links (RFC#125) that work with `.idx` files.
# extlinks
# ├── project
# │ ├── main.nim
# │ ├── manual.md
# │ └── sub
# │ └── submodule.nim
# └── util.nim
#
# `main.nim` imports `submodule.nim` and `../utils.nim`.
# `main.nim`, `submodule.nim`, `manual.md` do importdoc and reference each other.
let
test4PrjName = "extlinks/project"
test4Dir = baseDir / test4PrjName
test4DirAbs = baseDirAbs / test4PrjName
test4MainModule = "main"
test4MarkupDoc = "doc" / "manual.md"
test4DocsDir = "htmldocs"
# 1st stage is with --index:only, 2nd is final
test4Switches = NimSwitches(
doc: @["--project",
"--outdir:$1/$2" % [test4Dir, test4DocsDir],
"--index:only",
"$1/$2.nim" % [test4Dir, test4MainModule]],
md2html:
@["--outdir:$1/$2" % [test4Dir, test4DocsDir],
"--docroot:$1" % [test4DirAbs],
"--index:only",
"$1/$2" % [test4Dir, test4MarkupDoc]],
docStage2:
@["--project",
"--outdir:$1/$2" % [test4Dir, test4DocsDir],
"$1/$2.nim" % [test4Dir, test4MainModule]],
md2htmlStage2:
@["--outdir:$1/$2" % [test4Dir, test4DocsDir],
"--docroot:$1" % [test4DirAbs],
"$1/$2" % [test4Dir, test4MarkupDoc]],
)
testNimDoc(test4Dir, test4DocsDir, test4Switches, fixup)
if failures > 0:
quit "$# failures occurred; see note in nimdoc/tester.nim regarding -d:nimTestsNimdocFixup" % $failures