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
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": ## test "2 + 2 = 4":
## check(2+2 == result) ## check(2+2 == result)
## ##
## test "2 + -2 != 4": ## test "(2 + -2) != 4":
## check(2+2 != result) ## check(2 + -2 != result)
## ##
## # No teardown needed ## # No teardown needed
## ##
@ -234,41 +234,48 @@ macro check*(conditions: stmt): stmt {.immediate.} =
when compiles(string($value)): when compiles(string($value)):
checkpoint(name & " was " & $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): for i in countup(1, exp.len - 1):
if exp[i].kind notin nnkLiterals: if exp[i].kind notin nnkLiterals:
inc counter inc counter
var arg = newIdentNode(":p" & $counter) var arg = newIdentNode(":p" & $counter)
var argStr = exp[i].toStrLit var argStr = exp[i].toStrLit
var paramAst = exp[i] 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: if exp[i].kind == nnkExprEqExpr:
# ExprEqExpr # ExprEqExpr
# Ident !"v" # Ident !"v"
# IntLit 2 # IntLit 2
paramAst = exp[i][1] result[i] = exp[i][1]
if exp[i].typekind notin {ntyTypeDesc}: if exp[i].typekind notin {ntyTypeDesc}:
argsAsgns.add getAst(asgn(arg, paramAst)) argsAsgns.add getAst(asgn(arg, paramAst))
argsPrintOuts.add getAst(print(argStr, arg)) argsPrintOuts.add getAst(print(argStr, arg))
if exp[i].kind != nnkExprEqExpr: if exp[i].kind != nnkExprEqExpr:
exp[i] = arg result[i] = arg
else: else:
exp[i][1] = arg result[i][1] = arg
case checked.kind case checked.kind
of nnkCallKinds: of nnkCallKinds:
template rewrite(call, lineInfoLit: expr, callLit: string, template rewrite(call, lineInfoLit: expr, callLit: string,
argAssgs, argPrintOuts: stmt): stmt = argAssgs, argPrintOuts: stmt): stmt =
block: block:
argAssgs argAssgs #all callables (and assignments) are run here
if not call: if not call:
checkpoint(lineInfoLit & ": Check failed: " & callLit) checkpoint(lineInfoLit & ": Check failed: " & callLit)
argPrintOuts argPrintOuts
fail() fail()
var checkedStr = checked.toStrLit var checkedStr = checked.toStrLit
inspectArgs(checked) let parameterizedCheck = inspectArgs(checked)
result = getAst(rewrite(checked, checked.lineinfo, checkedStr, result = getAst(rewrite(parameterizedCheck, checked.lineinfo, checkedStr,
argsAsgns, argsPrintOuts)) argsAsgns, argsPrintOuts))
of nnkStmtList: of nnkStmtList: