summary refs log tree commit diff stats
path: root/contracts-and-validity.html
diff options
context:
space:
mode:
Diffstat (limited to 'contracts-and-validity.html')
0 files changed, 0 insertions, 0 deletions
id='n49' href='#n49'>49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
# 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