1# Helper code for running tests
2
3(var num-tests-passed 0)
4(var num-tests-run 0)
5(var suite-num 0)
6(var start-time 0)
7
8(def is-verbose (os/getenv "VERBOSE"))
9
10(defn assert
11  "Override's the default assert with some nice error handling."
12  [x &opt e]
13  (default e "assert error")
14  (++ num-tests-run)
15  (when x (++ num-tests-passed))
16  (def str (string e))
17  (if x
18    (when is-verbose (eprintf "\e[32m✔\e[0m %s: %v" (describe e) x))
19    (eprintf "\n\e[31m✘\e[0m %s: %v" (describe e) x))
20  x)
21
22(defmacro assert-error
23  [msg & forms]
24  (def errsym (keyword (gensym)))
25  ~(assert (= ,errsym (try (do ,;forms) ([_] ,errsym))) ,msg))
26
27(defmacro assert-no-error
28  [msg & forms]
29  (def errsym (keyword (gensym)))
30  ~(assert (not= ,errsym (try (do ,;forms) ([_] ,errsym))) ,msg))
31
32(defn start-suite [x]
33  (set suite-num x)
34  (set start-time (os/clock))
35  (eprint "Starting suite " x "..."))
36
37(defn end-suite []
38  (def delta (- (os/clock) start-time))
39  (eprinf "Finished suite %d in %.3f seconds - " suite-num delta)
40  (eprint num-tests-passed " of " num-tests-run " tests passed.")
41  (if (not= num-tests-passed num-tests-run) (os/exit 1)))
42