failed unittest check causes identifiers and calls to be printed out

This commit is contained in:
fenekku
2015-08-12 08:26:40 -04:00
parent d230b75e0a
commit 58b8381501

27
lib/pure/unittest.nim Normal file → Executable file
View File

@@ -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: