From 0b44f30d9b9792b7bf52467837a4033a49f92675 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Tue, 22 Aug 2023 06:50:19 +0200 Subject: [PATCH] avoid potential capture of lent iterator var (#29) also avoid `quote do` for better line numbers in error messages --- .github/workflows/ci.yml | 2 +- unittest2.nim | 65 ++++++++++++++++++++++++++++++++-------- unittest2.nimble | 2 +- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 689feb2..c7b1c52 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ on: jobs: build: - timeout-minutes: 15 + timeout-minutes: 60 strategy: fail-fast: false matrix: diff --git a/unittest2.nim b/unittest2.nim index 1437f0d..384c679 100644 --- a/unittest2.nim +++ b/unittest2.nim @@ -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 diff --git a/unittest2.nimble b/unittest2.nimble index 2f7d10c..9302194 100644 --- a/unittest2.nimble +++ b/unittest2.nimble @@ -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"