diff options
author | Araq <rumpf_a@web.de> | 2011-11-12 01:21:10 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2011-11-12 01:21:10 +0100 |
commit | 3b6d831549d5e5214a1712605e7b375444ad342f (patch) | |
tree | e163ea55583380d01604594a302db131ebd12f6b | |
parent | 8fc15ca0d5b46f1ecd3bd46f201f4ede3225be30 (diff) | |
parent | 032ff877801ba6c9c6e40a4a1bbea25fe4961559 (diff) | |
download | Nim-3b6d831549d5e5214a1712605e7b375444ad342f.tar.gz |
Merge branch 'master' of github.com:Araq/Nimrod
-rwxr-xr-x | compiler/cgen.nim | 4 | ||||
-rw-r--r-- | examples/tunit.nim (renamed from tests/accept/run/tunit.nim) | 0 | ||||
-rwxr-xr-x | lib/nimbase.h | 2 | ||||
-rw-r--r-- | lib/pure/unittest.nim | 49 | ||||
-rwxr-xr-x | lib/system.nim | 33 | ||||
-rwxr-xr-x | tests/tester.nim | 3 | ||||
-rwxr-xr-x | web/news.txt | 1 |
7 files changed, 78 insertions, 14 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 671fdd05f..6573771dc 100755 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -707,13 +707,13 @@ proc genMainProc(m: BModule) = CommonMainBody & "}$n" PosixCMain = "int main(int argc, char** args, char** env) {$n" & " cmdLine = args;$n" & " cmdCount = argc;$n" & " gEnv = env;$n" & - " NimMain();$n" & " return 0;$n" & "}$n" + " NimMain();$n" & " return nim_program_result;$n" & "}$n" WinNimMain = "N_CDECL(void, NimMain)(void) {$n" & CommonMainBody & "}$n" WinCMain = "N_STDCALL(int, WinMain)(HINSTANCE hCurInstance, $n" & " HINSTANCE hPrevInstance, $n" & " LPSTR lpCmdLine, int nCmdShow) {$n" & - " NimMain();$n" & " return 0;$n" & "}$n" + " NimMain();$n" & " return nim_program_result;$n" & "}$n" WinNimDllMain = "N_LIB_EXPORT N_CDECL(void, NimMain)(void) {$n" & CommonMainBody & "}$n" WinCDllMain = diff --git a/tests/accept/run/tunit.nim b/examples/tunit.nim index d0e975119..d0e975119 100644 --- a/tests/accept/run/tunit.nim +++ b/examples/tunit.nim diff --git a/lib/nimbase.h b/lib/nimbase.h index cc0419f55..11278ccd2 100755 --- a/lib/nimbase.h +++ b/lib/nimbase.h @@ -331,6 +331,8 @@ typedef long long int NI64; typedef unsigned int NU32; #endif +extern NI nim_program_result; + typedef float NF32; typedef double NF64; typedef double NF; diff --git a/lib/pure/unittest.nim b/lib/pure/unittest.nim index 87c2b6ed7..e2906dd1a 100644 --- a/lib/pure/unittest.nim +++ b/lib/pure/unittest.nim @@ -17,15 +17,18 @@ ## It is loosely based on C++'s boost.test and Haskell's QuickTest import - macros, terminal + macros, terminal, os type - TestStatus* = enum OK, FAILED - # ETestFailed* = object of ESynch + TTestStatus* = enum OK, FAILED + TOutputLevel* = enum PRINT_ALL, PRINT_FAILURES, PRINT_NONE var # XXX: These better be thread-local - AbortOnError* = false + AbortOnError*: bool + OutputLevel*: TOutputLevel + ColorOutput*: bool + checkpoints: seq[string] = @[] template TestSetupIMPL*: stmt = nil @@ -36,20 +39,29 @@ proc shouldRun(testName: string): bool = template suite*(name: expr, body: stmt): stmt = block: - template setup(setupBody: stmt): stmt = + template setup*(setupBody: stmt): stmt = template TestSetupIMPL: stmt = setupBody - template teardown(teardownBody: stmt): stmt = + template teardown*(teardownBody: stmt): stmt = template TestTeardownIMPL: stmt = teardownBody body -proc printStatus*(s: TestStatus, name: string) = - var color = (if s == OK: fgGreen else: fgRed) - styledEcho styleBright, color, "[", $s, "] ", fgWhite, name, "\n" +proc testDone(name: string, s: TTestStatus) = + if s == FAILED: + program_result += 1 + + if OutputLevel != PRINT_NONE and (OutputLevel == PRINT_ALL or s == FAILED): + var color = (if s == OK: fgGreen else: fgRed) + + if ColorOutput: + styledEcho styleBright, color, "[", $s, "] ", fgWhite, name, "\n" + else: + echo "[", $s, "] ", name, "\n" template test*(name: expr, body: stmt): stmt = - bind shouldRun, checkPoints + bind shouldRun, checkpoints, testDone + if shouldRun(name): checkpoints = @[] var TestStatusIMPL = OK @@ -60,7 +72,7 @@ template test*(name: expr, body: stmt): stmt = finally: TestTeardownIMPL() - printStatus(TestStatusIMPL, name) + testDone name, TestStatusIMPL proc checkpoint*(msg: string) = checkpoints.add(msg) @@ -124,7 +136,8 @@ macro check*(conditions: stmt): stmt = result = standardRewrite(conditions[1]) else: - error conditions.lineinfo & ": Malformed check statement" + var ast = conditions.treeRepr + error conditions.lineinfo & ": Malformed check statement:\n" & ast template require*(conditions: stmt): stmt = block: @@ -149,3 +162,15 @@ macro expect*(exp: stmt): stmt = result = getAst(expectBody(errorTypes, exp.lineinfo, body)) + +## Reading settings +var envOutLvl = os.getEnv("NIMTEST_OUTPUT_LVL").string + +if envOutLvl.len > 0: + for opt in countup(low(TOutputLevel), high(TOutputLevel)): + if $opt == envOutLvl: + OutputLevel = opt + break + +AbortOnError = existsEnv("NIMTEST_ABORT_ON_ERROR") +ColorOutput = not existsEnv("NIMTEST_NO_COLOR") diff --git a/lib/system.nim b/lib/system.nim index 8657efe2a..460bca5c0 100755 --- a/lib/system.nim +++ b/lib/system.nim @@ -1541,6 +1541,11 @@ const ## is the value that should be passed to ``quit`` to indicate ## failure. +var program_result* {.exportc: "nim_$1".} = QuitSuccess + ## modify this varialbe to specify the exit code of the program + ## under normal circumstances. when the program is terminated + ## prematurelly using ``quit``, this value is ignored. + proc quit*(errorcode: int = QuitSuccess) {. magic: "Exit", importc: "exit", noDecl, noReturn.} ## stops the program immediately; before stopping the program the @@ -2029,3 +2034,31 @@ proc slurp*(filename: string): string {.magic: "Slurp".} ## const myResource = slurp"mydatafile.bin" ## +proc `+=`*[T](x, y: ordinal[T]) {.magic: "Inc", noSideEffect.} + ## Increments an ordinal + +proc `-=`*[T](x, y: ordinal[T]) {.magic: "Dec", noSideEffect.} + ## Decrements an ordinal + +proc `*=`*[T](x: var ordinal[T], y: ordinal[T]) {.inline noSideEffect.} = + ## Binary `*=` operator for oridinals + x = x * y + +proc `+=` *(x: var float, y:float) {.inline noSideEffect.} = + ## Increments in placee a floating point number + x = x + y + +proc `-=` *(x: var float, y:float) {.inline noSideEffect.} = + ## Decrements in place a floating point number + x = x - y + +proc `*=` *(x: var float, y:float) {.inline noSideEffect.} = + ## Multiplies in place a floating point number + x = x * y + +proc `/=` *(x: var float, y:float) {.inline noSideEffect.} = + ## Divides in place a floating point number + x = x / y + +proc `&=`* (x: var string, y: string) {.magic: "AppendStrStr", noSideEffect.} + diff --git a/tests/tester.nim b/tests/tester.nim index 3f563de4a..1b88f9292 100755 --- a/tests/tester.nim +++ b/tests/tester.nim @@ -391,6 +391,9 @@ proc outputJSON(reject, compile, run: TResults) = writeFile(jsonFile, s) proc main() = + os.putenv "NIMTEST_NO_COLOR", "1" + os.putenv "NIMTEST_OUTPUT_LVL", "PRINT_FAILURES" + const compileJson = "compile.json" runJson = "run.json" diff --git a/web/news.txt b/web/news.txt index 3e107511f..699b2c87f 100755 --- a/web/news.txt +++ b/web/news.txt @@ -102,6 +102,7 @@ Library Additions - Added ``strutils.unindent``, ``strutils.countLines``. - Added ``system.slurp`` for easy resource embedding. - Added ``system.running`` for threads. +- Added ``system.program_result``. - Added ``xmltree.innerText``. - Added ``os.isAbsolute``, ``os.dynLibFormat``. - Added ``parseutils.interpolatedFragments``. |