diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2017-09-02 15:03:39 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@gmail.com> | 2017-09-02 15:03:39 +0100 |
commit | 9b465a236159423c344395194b2e4963e5d8adba (patch) | |
tree | 88956c00089c98c6e154df9cd223b6b6fb4206ae | |
parent | c9e093d61d07fb7c4301baf53d10c64edbe3baa4 (diff) | |
download | Nim-9b465a236159423c344395194b2e4963e5d8adba.tar.gz |
Add readme to tests. Add fileDir option to testament & create nimble test.
-rw-r--r-- | compiler/nimblecmd.nim | 95 | ||||
-rw-r--r-- | tests/nimble/nimbleDir/simplePkgs/pkgA-0.1.0/pkgA.nimble | 0 | ||||
-rw-r--r-- | tests/nimble/nimbleDir/simplePkgs/pkgA-0.1.0/pkgA/module.nim | 1 | ||||
-rw-r--r-- | tests/nimble/nimbleDir/simplePkgs/pkgB-#head/pkgB.nimble | 0 | ||||
-rw-r--r-- | tests/nimble/nimbleDir/simplePkgs/pkgB-#head/pkgB/module.nim | 1 | ||||
-rw-r--r-- | tests/nimble/nimbleDir/simplePkgs/pkgB-0.1.0/pkgB.nimble | 0 | ||||
-rw-r--r-- | tests/nimble/nimbleDir/simplePkgs/pkgB-0.1.0/pkgB/module.nim | 1 | ||||
-rw-r--r-- | tests/nimble/nimbleDir/simplePkgs/pkgC-#aa11/pkgC.nimble | 0 | ||||
-rw-r--r-- | tests/nimble/nimbleDir/simplePkgs/pkgC-#aa11/pkgC/module.nim | 1 | ||||
-rw-r--r-- | tests/nimble/nimbleDir/simplePkgs/pkgC-#head/pkgC.nimble | 0 | ||||
-rw-r--r-- | tests/nimble/nimbleDir/simplePkgs/pkgC-#head/pkgC/module.nim | 1 | ||||
-rw-r--r-- | tests/nimble/readme.md | 2 | ||||
-rw-r--r-- | tests/nimble/tnimblepath.nim | 11 | ||||
-rw-r--r-- | tests/readme.md | 62 | ||||
-rw-r--r-- | tests/readme.txt | 13 | ||||
-rw-r--r-- | tests/testament/tester.nim | 12 | ||||
-rw-r--r-- | tests/untestable/readme.markdown | 2 |
17 files changed, 152 insertions, 50 deletions
diff --git a/compiler/nimblecmd.nim b/compiler/nimblecmd.nim index 5e6d843de..853077e31 100644 --- a/compiler/nimblecmd.nim +++ b/compiler/nimblecmd.nim @@ -9,7 +9,7 @@ ## Implements some helper procs for Nimble (Nim's package manager) support. -import parseutils, strutils, strtabs, os, options, msgs +import parseutils, strutils, strtabs, os, options, msgs, sequtils proc addPath*(path: string, info: TLineInfo) = if not options.searchPaths.contains(path): @@ -21,45 +21,59 @@ proc versionSplitPos(s: string): int = while result > 1 and s[result] != '-': dec result if s[result] != '-': result = s.len -const - latest = "" - -proc `<.`(a, b: string): bool = - # wether a has a smaller version than b: - if a == latest: return true - elif b == latest: return false - var i = 0 - var j = 0 - var verA = 0 - var verB = 0 - while true: - let ii = parseInt(a, verA, i) - let jj = parseInt(b, verB, j) - if ii <= 0 or jj <= 0: - # if A has no number and B has but A has no number whatsoever ("#head"), - # A is preferred: - if ii > 0 and jj <= 0 and j == 0: return true - if ii <= 0 and jj > 0 and i == 0: return false - # if A has no number left, but B has, B is preferred: 0.8 vs 0.8.3 - return jj > 0 - if verA < verB: return true - elif verA > verB: return false - # else: same version number; continue: - inc i, ii - inc j, jj - if a[i] == '.': inc i - if b[j] == '.': inc j +type + Version = distinct string + +proc `$`(ver: Version): string {.borrow.} + +proc newVersion(ver: string): Version = + doAssert(ver.len == 0 or ver[0] in {'#', '\0'} + Digits, + "Wrong version: " & ver) + return Version(ver) + +proc isSpecial(ver: Version): bool = + return ($ver).len > 0 and ($ver)[0] == '#' + +proc `<`(ver: Version, ver2: Version): bool = + ## This is synced from Nimble's version module. + + # Handling for special versions such as "#head" or "#branch". + if ver.isSpecial or ver2.isSpecial: + if ver2.isSpecial and ($ver2).normalize == "#head": + return ($ver).normalize != "#head" + + if not ver2.isSpecial: + # `#aa111 < 1.1` + return ($ver).normalize != "#head" + + # Handling for normal versions such as "0.1.0" or "1.0". + var sVer = string(ver).split('.') + var sVer2 = string(ver2).split('.') + for i in 0..max(sVer.len, sVer2.len)-1: + var sVerI = 0 + if i < sVer.len: + discard parseInt(sVer[i], sVerI) + var sVerI2 = 0 + if i < sVer2.len: + discard parseInt(sVer2[i], sVerI2) + if sVerI < sVerI2: + return true + elif sVerI == sVerI2: + discard + else: + return false proc addPackage(packages: StringTableRef, p: string) = let x = versionSplitPos(p) let name = p.substr(0, x-1) - let version = if x < p.len: p.substr(x+1) else: "" - if packages.getOrDefault(name) <. version: - packages[name] = version + let version = newVersion(if x < p.len: p.substr(x+1) else: "") + if packages.getOrDefault(name).newVersion < version or + (not packages.hasKey(name)): + packages[name] = $version iterator chosen(packages: StringTableRef): string = for key, val in pairs(packages): - let res = if val == latest: key else: key & '-' & val + let res = if val.len == 0: key else: key & '-' & val yield res proc addNimblePath(p: string, info: TLineInfo) = @@ -82,7 +96,17 @@ proc nimblePath*(path: string, info: TLineInfo) = addNimblePath(path, info) when isMainModule: + proc v(s: string): Version = s.newVersion + # #head is special in the sense that it's assumed to always be newest. + doAssert v"1.0" < v"#head" + doAssert v"1.0" < v"1.1" + doAssert v"1.0.1" < v"1.1" + doAssert v"1" < v"1.1" + doAssert v"#aaaqwe" < v"1.1" # We cannot assume that a branch is newer. + doAssert v"#a111" < v"#head" + var rr = newStringTable() + addPackage rr, "irc-#a111" addPackage rr, "irc-#head" addPackage rr, "irc-0.1.0" addPackage rr, "irc" @@ -93,5 +117,6 @@ when isMainModule: addPackage rr, "ab-0.1" addPackage rr, "justone" - for p in rr.chosen: - echo p + doAssert toSeq(rr.chosen) == + @["irc-#head", "another-0.1", "ab-0.1.3", "justone"] + diff --git a/tests/nimble/nimbleDir/simplePkgs/pkgA-0.1.0/pkgA.nimble b/tests/nimble/nimbleDir/simplePkgs/pkgA-0.1.0/pkgA.nimble new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/nimble/nimbleDir/simplePkgs/pkgA-0.1.0/pkgA.nimble diff --git a/tests/nimble/nimbleDir/simplePkgs/pkgA-0.1.0/pkgA/module.nim b/tests/nimble/nimbleDir/simplePkgs/pkgA-0.1.0/pkgA/module.nim new file mode 100644 index 000000000..6cb3b77d9 --- /dev/null +++ b/tests/nimble/nimbleDir/simplePkgs/pkgA-0.1.0/pkgA/module.nim @@ -0,0 +1 @@ +proc pkgATest*(): int = 1 \ No newline at end of file diff --git a/tests/nimble/nimbleDir/simplePkgs/pkgB-#head/pkgB.nimble b/tests/nimble/nimbleDir/simplePkgs/pkgB-#head/pkgB.nimble new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/nimble/nimbleDir/simplePkgs/pkgB-#head/pkgB.nimble diff --git a/tests/nimble/nimbleDir/simplePkgs/pkgB-#head/pkgB/module.nim b/tests/nimble/nimbleDir/simplePkgs/pkgB-#head/pkgB/module.nim new file mode 100644 index 000000000..03d2298a2 --- /dev/null +++ b/tests/nimble/nimbleDir/simplePkgs/pkgB-#head/pkgB/module.nim @@ -0,0 +1 @@ +proc pkgBTest*(): int64 = 0xDEADBEEF \ No newline at end of file diff --git a/tests/nimble/nimbleDir/simplePkgs/pkgB-0.1.0/pkgB.nimble b/tests/nimble/nimbleDir/simplePkgs/pkgB-0.1.0/pkgB.nimble new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/nimble/nimbleDir/simplePkgs/pkgB-0.1.0/pkgB.nimble diff --git a/tests/nimble/nimbleDir/simplePkgs/pkgB-0.1.0/pkgB/module.nim b/tests/nimble/nimbleDir/simplePkgs/pkgB-0.1.0/pkgB/module.nim new file mode 100644 index 000000000..56ff64197 --- /dev/null +++ b/tests/nimble/nimbleDir/simplePkgs/pkgB-0.1.0/pkgB/module.nim @@ -0,0 +1 @@ +proc pkgBTest*(): int64 = 0 \ No newline at end of file diff --git a/tests/nimble/nimbleDir/simplePkgs/pkgC-#aa11/pkgC.nimble b/tests/nimble/nimbleDir/simplePkgs/pkgC-#aa11/pkgC.nimble new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/nimble/nimbleDir/simplePkgs/pkgC-#aa11/pkgC.nimble diff --git a/tests/nimble/nimbleDir/simplePkgs/pkgC-#aa11/pkgC/module.nim b/tests/nimble/nimbleDir/simplePkgs/pkgC-#aa11/pkgC/module.nim new file mode 100644 index 000000000..24a67bbe2 --- /dev/null +++ b/tests/nimble/nimbleDir/simplePkgs/pkgC-#aa11/pkgC/module.nim @@ -0,0 +1 @@ +proc pkgCTest*(): int64 = 1 \ No newline at end of file diff --git a/tests/nimble/nimbleDir/simplePkgs/pkgC-#head/pkgC.nimble b/tests/nimble/nimbleDir/simplePkgs/pkgC-#head/pkgC.nimble new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/nimble/nimbleDir/simplePkgs/pkgC-#head/pkgC.nimble diff --git a/tests/nimble/nimbleDir/simplePkgs/pkgC-#head/pkgC/module.nim b/tests/nimble/nimbleDir/simplePkgs/pkgC-#head/pkgC/module.nim new file mode 100644 index 000000000..2f243ad82 --- /dev/null +++ b/tests/nimble/nimbleDir/simplePkgs/pkgC-#head/pkgC/module.nim @@ -0,0 +1 @@ +proc pkgCTest*(): int64 = 0xDEADBEEF \ No newline at end of file diff --git a/tests/nimble/readme.md b/tests/nimble/readme.md new file mode 100644 index 000000000..10fd21a83 --- /dev/null +++ b/tests/nimble/readme.md @@ -0,0 +1,2 @@ +This directory contains tests for the --nimblePath feature. + diff --git a/tests/nimble/tnimblepath.nim b/tests/nimble/tnimblepath.nim new file mode 100644 index 000000000..6ba1be1d1 --- /dev/null +++ b/tests/nimble/tnimblepath.nim @@ -0,0 +1,11 @@ +discard """ + action: run + cmd: "nim $target --nimblePath:$fileDir/nimbleDir/simplePkgs $options $file" +""" +import pkgA/module as A +import pkgB/module as B +import pkgC/module as C + +doAssert pkgATest() == 1, "Simple pkgA-0.1.0 wasn't added to path correctly." +doAssert pkgBTest() == 0xDEADBEEF, "pkgB-#head wasn't picked over pkgB-0.1.0" +doAssert pkgCTest() == 0xDEADBEEF, "pkgC-#head wasn't picked over pkgC-#aa11" \ No newline at end of file diff --git a/tests/readme.md b/tests/readme.md new file mode 100644 index 000000000..34a2c4bfb --- /dev/null +++ b/tests/readme.md @@ -0,0 +1,62 @@ +This directory contains the test cases. + +Each test must have a filename of the form: ``t*.nim`` + +**Note:** Tests are only compiled by default. In order to get the tester to +execute the compiled binary, you need to specify a spec with an ``action`` key +(see below for details). + +# Specs + +Each test can contain a spec in a ``discard """ ... """`` block. + +**Check out the [``parseSpec`` procedure](https://github.com/nim-lang/Nim/blob/devel/tests/testament/specs.nim#L124) in the ``specs`` module for a full and reliable reference** + +## action + +Specifies what action this test should take. + +**Default: compile** + +Options: + +* ``compile`` - compiles the module and fails the test if compilations fails. +* ``run`` - compiles and runs the module, fails the test if compilation or + execution of test code fails. +* ``reject`` - compiles the module and fails the test if compilation succeeds. + +There are certain spec keys that imply ``run``, including ``output`` and +``outputsub``. + +## cmd + +Specifies the Nim command to use for compiling the test. + +There are a number of variables that are replaced in this spec option: + +* ``$target`` - the compilation target, e.g. ``c``. +* ``$options`` - the options for the compiler. +* ``$file`` - the filename of the test. +* ``$filedir`` - the directory of the test file. + +Example: + +```nim +discard """ + cmd: "nim $target --nimblePath:./nimbleDir/simplePkgs $options $file" +""" +``` + +# Categories + +Each folder under this directory represents a test category, which can be +tested by running `koch tests cat <category>`. + +The folder ``rodfiles`` contains special tests that test incremental +compilation via symbol files. + +The folder ``dll`` contains simple DLL tests. + +The folder ``realtimeGC`` contains a test for validating that the realtime GC +can run properly without linking against the nimrtl.dll/so. It includes a C +client and platform specific build files for manual compilation. diff --git a/tests/readme.txt b/tests/readme.txt deleted file mode 100644 index 0ff9e11c6..000000000 --- a/tests/readme.txt +++ /dev/null @@ -1,13 +0,0 @@ -This directory contains the test cases. -Each test must have a filename of the form: ``t*.nim`` - -Each test can contain a spec in a ``discard """"""`` block. - -The folder ``rodfiles`` contains special tests that test incremental -compilation via symbol files. - -The folder ``dll`` contains simple DLL tests. - -The folder ``realtimeGC`` contains a test for validating that the realtime GC -can run properly without linking against the nimrtl.dll/so. It includes a C -client and platform specific build files for manual compilation. diff --git a/tests/testament/tester.nim b/tests/testament/tester.nim index b65814534..06fd4acec 100644 --- a/tests/testament/tester.nim +++ b/tests/testament/tester.nim @@ -70,10 +70,17 @@ proc normalizeMsg(s: string): string = if result.len > 0: result.add '\L' result.add x.strip +proc getFileDir(filename: string): string = + result = filename.splitFile().dir + if not result.isAbsolute(): + result = getCurrentDir() / result + proc callCompiler(cmdTemplate, filename, options: string, target: TTarget): TSpec = let c = parseCmdLine(cmdTemplate % ["target", targetToCmd[target], - "options", options, "file", filename.quoteShell]) + "options", options, "file", filename.quoteShell, + "filedir", filename.getFileDir()]) + echo(c) var p = startProcess(command=c[0], args=c[1.. ^1], options={poStdErrToStdOut, poUsePath}) let outp = p.outputStream @@ -118,7 +125,8 @@ proc callCompiler(cmdTemplate, filename, options: string, proc callCCompiler(cmdTemplate, filename, options: string, target: TTarget): TSpec = let c = parseCmdLine(cmdTemplate % ["target", targetToCmd[target], - "options", options, "file", filename.quoteShell]) + "options", options, "file", filename.quoteShell, + "filedir", filename.getFileDir()]) var p = startProcess(command="gcc", args=c[5.. ^1], options={poStdErrToStdOut, poUsePath}) let outp = p.outputStream diff --git a/tests/untestable/readme.markdown b/tests/untestable/readme.markdown new file mode 100644 index 000000000..fcb7f4f28 --- /dev/null +++ b/tests/untestable/readme.markdown @@ -0,0 +1,2 @@ +This directory contains tests which are not automatically executed +for various reasons. Mainly due to dependencies on external services. \ No newline at end of file |