failed unittest check causes identifiers and calls to be printed out
This commit is contained in:
parent
d230b75e0a
commit
58b8381501
1 changed files with 17 additions and 10 deletions
27
lib/pure/unittest.nim
Normal file → Executable file
27
lib/pure/unittest.nim
Normal file → Executable 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:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue