123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- # 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
|