avoid potential capture of lent iterator var (#29)

also avoid `quote do` for better line numbers in error messages
This commit is contained in:
Jacek Sieka 2023-08-22 06:50:19 +02:00 committed by GitHub
parent 21ed62449d
commit 0b44f30d9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 14 deletions

View File

@ -8,7 +8,7 @@ on:
jobs:
build:
timeout-minutes: 15
timeout-minutes: 60
strategy:
fail-fast: false
matrix:

View File

@ -772,6 +772,7 @@ template fail* =
withLock formattersLock:
{.gcsafe.}:
for formatter in formatters:
let formatter = formatter # avoid lent iterator
when declared(stackTrace):
when stackTrace is string:
formatter.failureOccurred(checkpoints, stackTrace)
@ -947,17 +948,36 @@ macro check*(conditions: untyped): untyped =
case checked.kind
of nnkCallKinds:
let (assigns, check, printOuts) = inspectArgs(checked)
let lineinfo = newStrLitNode(checked.lineInfo)
let callLit = checked.toStrLit
result = quote do:
block:
`assigns`
if not `check`:
checkpoint(`lineinfo` & ": Check failed: " & `callLit`)
`printOuts`
fail()
result = nnkBlockStmt.newTree(
newEmptyNode(),
nnkStmtList.newTree(
assigns,
nnkIfStmt.newTree(
nnkElifBranch.newTree(
nnkCall.newTree(ident("not"), check),
nnkStmtList.newTree(
nnkCall.newTree(
ident("checkpoint"),
nnkInfix.newTree(
ident("&"),
nnkInfix.newTree(
ident("&"),
lineinfo,
newLit(": Check failed: ")
),
callLit
)
),
printOuts,
nnkCall.newTree(ident("fail"))
)
)
)
)
)
of nnkStmtList:
result = newNimNode(nnkStmtList)
@ -969,10 +989,31 @@ macro check*(conditions: untyped): untyped =
let lineinfo = newStrLitNode(checked.lineInfo)
let callLit = checked.toStrLit
result = quote do:
if not `checked`:
checkpoint(`lineinfo` & ": Check failed: " & `callLit`)
fail()
result = nnkBlockStmt.newTree(
newEmptyNode(),
nnkStmtList.newTree(
nnkIfStmt.newTree(
nnkElifBranch.newTree(
nnkCall.newTree(ident("not"), checked),
nnkStmtList.newTree(
nnkCall.newTree(
ident("checkpoint"),
nnkInfix.newTree(
ident("&"),
nnkInfix.newTree(
ident("&"),
lineinfo,
newLit(": Check failed: ")
),
callLit
)
),
nnkCall.newTree(ident("fail"))
)
)
)
)
)
template require*(conditions: untyped) =
## Same as `check` except any failed test causes the program to quit

View File

@ -1,6 +1,6 @@
mode = ScriptMode.Verbose
version = "0.0.7"
version = "0.0.8"
author = "Status Research & Development GmbH"
description = "unittest fork with support for parallel test execution"
license = "MIT"