-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoop_utils.nimble
122 lines (100 loc) · 3.06 KB
/
oop_utils.nimble
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# Package
version = "0.1.0"
author = "Fabian Keller"
description = "Macro for building OOP class hierarchies based on closure methods."
license = "MIT"
srcDir = "src"
# Dependencies
requires "nim >= 0.19.9"
import ospaths
import oswalkdir
import algorithm
import sequtils
import sugar
import strutils
import strformat
type
Mode = enum
ModeC, ModeJS
File = string
proc getFiles(baseDir: File): seq[File] =
result = newSeq[File]()
for file in oswalkdir.walkDirRec(baseDir):
let (_, name, ext) = file.splitFile()
if ext == ".nim" and (name.contains("test") or name.contains("error")):
result.add(file)
result.sort((a, b) => cmp(a, b))
proc deleteRunnable(file: File, mode: Mode) =
let binFileName =
if mode == ModeC:
file.changeFileExt(ExeExt)
else:
file.changeFileExt("js")
rmFile(binFileName)
proc relativeTo(path: File, base: File): File =
let baseSuffixed = base & "/"
if path.len > baseSuffixed.len:
path[baseSuffixed.len..^1]
else:
path
let colRed = "\e[1;31m"
let colGreen = "\e[1;32m"
let colYellow = "\e[1;33m"
let colBlue = "\e[1;34m"
let colWhite = "\e[1;37m"
let colReset = "\e[00m"
hint("QuitCalled", false)
proc printPassed() =
echo &" {colGreen}[passed]{colReset}"
proc printFailed(output: string, suffix = "") =
echo &" {colRed}[failed] {suffix}{colReset}"
echo &"{colRed}------------------------------------------------{colReset}"
echo output
echo &"{colRed}------------------------------------------------{colReset}"
task test, "Runs the test suite":
## Executes all tests.
let baseDir = system.getCurrentDir() / "tests"
var files = getFiles(baseDir)
if files.len < 1:
echo &"{colRed}Warning{colReset}: No tests found!"
quit("", 1)
let mode = ModeC
let compiler = if mode == ModeC: "c" else: "js"
var numPassed = 0
var numFailed = 0
for file in files:
let (_, name, _) = file.splitFile()
let expectedError = name.contains("error")
let relativePath = file.relativeTo(baseDir)
echo &" * {colYellow}{relativePath}{colReset}"
let ret = gorgeEx &"nim -r -d:release --colors:on {compiler} {file}"
deleteRunnable(file, mode)
if not expectedError:
if ret.exitCode == 0:
printPassed()
numPassed += 1
else:
numFailed += 1
printFailed(ret.output)
else:
if ret.exitCode == 0:
printFailed(ret.output, "test expected to fail, but passed")
numFailed += 1
else:
var expectedMessage: string
var i = 0
for line in staticRead(file).splitLines():
if i == 1:
expectedMessage = line.strip()
inc i
if ret.output.contains(expectedMessage):
numPassed += 1
printPassed()
else:
numFailed += 1
printFailed(ret.output, &"missing error message '{expectedMessage}'")
if numFailed == 0:
echo &"\n{colGreen}Success{colReset}: All {numPassed} tests passed."
else:
echo &"\n{colRed}Failed{colReset}: {numFailed} out of {numFailed+numPassed} tests failed."
quit("", 1)