From 58b83815018fce2ec614b4a3624e5828a2f7db8f Mon Sep 17 00:00:00 2001 From: fenekku Date: Wed, 12 Aug 2015 08:26:40 -0400 Subject: [PATCH 1/2] failed unittest check causes identifiers and calls to be printed out --- lib/pure/unittest.nim | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) mode change 100644 => 100755 lib/pure/unittest.nim diff --git a/lib/pure/unittest.nim b/lib/pure/unittest.nim old mode 100644 new mode 100755 index 064937ad8..3f36ed5a7 --- a/lib/pure/unittest.nim +++ b/lib/pure/unittest.nim @@ -92,8 +92,8 @@ template suite*(name: expr, body: stmt): stmt {.immediate, dirty.} = ## test "2 + 2 = 4": ## check(2+2 == result) ## - ## test "2 + -2 != 4": - ## check(2+2 != result) + ## test "(2 + -2) != 4": + ## check(2 + -2 != result) ## ## # No teardown needed ## @@ -234,41 +234,48 @@ macro check*(conditions: stmt): stmt {.immediate.} = when compiles(string($value)): checkpoint(name & " was " & $value) - proc inspectArgs(exp: NimNode) = + proc inspectArgs(exp: NimNode): NimNode = + result = copyNimTree(exp) for i in countup(1, exp.len - 1): if exp[i].kind notin nnkLiterals: inc counter var arg = newIdentNode(":p" & $counter) var argStr = exp[i].toStrLit var paramAst = exp[i] - if exp[i].kind in nnkCallKinds: inspectArgs(exp[i]) + if exp[i].kind == nnkIdent: + argsPrintOuts.add getAst(print(argStr, paramAst)) + if exp[i].kind in nnkCallKinds: + var callVar = newIdentNode(":c" & $counter) + argsAsgns.add getAst(asgn(callVar, paramAst)) + result[i] = callVar + argsPrintOuts.add getAst(print(argStr, callVar)) if exp[i].kind == nnkExprEqExpr: # ExprEqExpr # Ident !"v" # IntLit 2 - paramAst = exp[i][1] + result[i] = exp[i][1] if exp[i].typekind notin {ntyTypeDesc}: argsAsgns.add getAst(asgn(arg, paramAst)) argsPrintOuts.add getAst(print(argStr, arg)) if exp[i].kind != nnkExprEqExpr: - exp[i] = arg + result[i] = arg else: - exp[i][1] = arg + result[i][1] = arg case checked.kind of nnkCallKinds: template rewrite(call, lineInfoLit: expr, callLit: string, argAssgs, argPrintOuts: stmt): stmt = block: - argAssgs + argAssgs #all callables (and assignments) are run here if not call: checkpoint(lineInfoLit & ": Check failed: " & callLit) argPrintOuts fail() var checkedStr = checked.toStrLit - inspectArgs(checked) - result = getAst(rewrite(checked, checked.lineinfo, checkedStr, + let parameterizedCheck = inspectArgs(checked) + result = getAst(rewrite(parameterizedCheck, checked.lineinfo, checkedStr, argsAsgns, argsPrintOuts)) of nnkStmtList: From c62698b2969f67cdfdcf18c6416bdba9e5b50197 Mon Sep 17 00:00:00 2001 From: fenekku Date: Wed, 12 Aug 2015 10:30:36 -0400 Subject: [PATCH 2/2] make testSetupIMPL and testTeardownIMPL non-public --- lib/pure/unittest.nim | 9 ++++---- tests/stdlib/tunittest.nim | 45 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/lib/pure/unittest.nim b/lib/pure/unittest.nim index 3f36ed5a7..a0f7b955e 100755 --- a/lib/pure/unittest.nim +++ b/lib/pure/unittest.nim @@ -70,9 +70,6 @@ var ## Global unittest settings! checkpoints = @[] -template testSetupIMPL*: stmt {.immediate, dirty.} = discard #Should this be public or even exist? -template testTeardownIMPL*: stmt {.immediate, dirty.} = discard - proc shouldRun(testName: string): bool = result = true @@ -106,9 +103,11 @@ template suite*(name: expr, body: stmt): stmt {.immediate, dirty.} = ## [OK] (2 + -2) != 4 block: template setup(setupBody: stmt): stmt {.immediate, dirty.} = + var testSetupIMPLFlag = true template testSetupIMPL: stmt {.immediate, dirty.} = setupBody template teardown(teardownBody: stmt): stmt {.immediate, dirty.} = + var testTeardownIMPLFlag = true template testTeardownIMPL: stmt {.immediate, dirty.} = teardownBody body @@ -149,7 +148,7 @@ template test*(name: expr, body: stmt): stmt {.immediate, dirty.} = var testStatusIMPL {.inject.} = OK try: - testSetupIMPL() + when declared(testSetupIMPLFlag): testSetupIMPL() body except: @@ -159,7 +158,7 @@ template test*(name: expr, body: stmt): stmt {.immediate, dirty.} = fail() finally: - testTeardownIMPL() + when declared(testTeardownIMPLFlag): testTeardownIMPL() testDone name, testStatusIMPL proc checkpoint*(msg: string) = diff --git a/tests/stdlib/tunittest.nim b/tests/stdlib/tunittest.nim index 1389214ea..4d2a2a340 100644 --- a/tests/stdlib/tunittest.nim +++ b/tests/stdlib/tunittest.nim @@ -38,3 +38,48 @@ proc defectiveRobot() = test "unittest expect": expect IOError, OSError, ValueError, AssertionError: defectiveRobot() + +var + a = 1 + b = -1 + c = 1 + +#unittests are sequential right now +suite "suite with only teardown": + teardown: + b = 2 + + test "unittest with only teardown 1": + check a == c + + test "unittest with only teardown 2": + check b > a + +suite "suite with only setup": + setup: + var testVar = "from setup" + + test "unittest with only setup 1": + check testVar == "from setup" + check b > a + b = -1 + + test "unittest with only setup 2": + check b < a + +suite "suite with none": + test "unittest with none": + check b < a + +suite "suite with both": + setup: + a = -2 + + teardown: + c = 2 + + test "unittest with both 1": + check b > a + + test "unittest with both 2": + check c == 2