Skip to content

Commit 3314d92

Browse files
committed
feat(Lib/unittest): TestCase: addCleanup,tearDown,setUp,run
1 parent 4853b49 commit 3314d92

File tree

5 files changed

+70
-4
lines changed

5 files changed

+70
-4
lines changed

src/pylib/Lib/unittest/case_py.nim

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ export TypeError
1111

1212
import ./case_py/[
1313
types,
14-
util
14+
util,
15+
prc_main,
16+
prc_cleanup,
17+
meth,
1518
]
16-
export types
19+
export types, meth, prc_main, prc_cleanup
1720

1821
template gen1(name, op){.dirty.} =
1922
bind check
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
import ./types
3+
4+
method setup*(self: TestCase){.base.} =
5+
discard
6+
7+
method teardown*(self: TestCase){.base.} =
8+
discard
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
import std/macros
3+
import ./types
4+
5+
macro addCleanup*(self: TestCase; cleanup: proc,
6+
argsOrKws: varargs[untyped]) =
7+
let attr = newDotExpr(self, ident("private.cleanups"))
8+
let cb =
9+
if argsOrKws.len == 0: cleanup
10+
else: quote do:
11+
proc() = `cleanup`(`argsOrKws`)
12+
result = newCall("add", attr, cb)
13+
14+
proc doCleanups*(self: TestCase) =
15+
for cleanup in self.`private.cleanups`:
16+
cleanup()
17+
18+
when isMainModule:
19+
var self = newTestCase()
20+
var glb = 0
21+
self.addCleanup(proc() = glb += 1)
22+
self.addCleanup(proc(x, y: int) = glb += x+y, 1, y=3)
23+
assert glb == 0
24+
self.doCleanups()
25+
assert glb == 5
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
2+
import std/macros
3+
import ./[types, prc_cleanup, meth]
4+
5+
6+
macro run*[T: TestCase](self: T) =
7+
result = newStmtList()
8+
when not declared(`T.dunder.dict.keys`):
9+
error "TestCase must be subclassed via `class` pysugar"
10+
else:
11+
template call(self, meth): NimNode =
12+
newCall(bindSym(astToStr(meth)), self)
13+
result.add call(self, setup)
14+
for fn in `T.dunder.dict.keys`():
15+
if fn.startsWith("test_"):
16+
let fnIdent = ident(fn)
17+
result.add quote do:
18+
`fnIdent`(`self`)
19+
result.add call(self, teardown)
20+
21+
let doCleanupsId = bindSym("doCleanups")
22+
result = quote do:
23+
try:
24+
`result`
25+
finally:
26+
`self`.`doCleanupsId`()
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11

2-
32
type
3+
Cleanup = proc ()
44
TestCase* = ref object of RootObj
5+
`private.testMethodName`*: string
6+
`private.cleanups`*: seq[Cleanup]
57

6-
func newTestCase*: TestCase = TestCase()
8+
func newTestCase*(methodName="runTest"): TestCase =
9+
result = TestCase()
10+
result.`private.testMethodName` = methodName

0 commit comments

Comments
 (0)