|
1 | 1 | (ns rules-clojure.testrunner |
2 | | - (:require [clojure.test]) |
3 | | - (:import [sun.misc Signal SignalHandler] |
4 | | - [java.lang.management ManagementFactory]) |
| 2 | + (:require [clojure.pprint :refer [pprint]] |
| 3 | + [clojure.stacktrace :as stack] |
| 4 | + [clojure.test :as c.test]) |
5 | 5 | (:gen-class)) |
6 | 6 |
|
7 | | -(def old-handler |
8 | | - (Signal/handle |
9 | | - (Signal. "TERM") |
10 | | - (reify SignalHandler |
11 | | - (handle [_ signal] |
12 | | - (run! println (.dumpAllThreads (ManagementFactory/getThreadMXBean) true true)) |
13 | | - (when-not (#{SignalHandler/SIG_DFL SignalHandler/SIG_IGN} old-handler) |
14 | | - (.handle old-handler signal)))))) |
| 7 | +(defn pp-str [x] |
| 8 | + (with-out-str (pprint x))) |
| 9 | + |
| 10 | +(defmulti |
| 11 | + ^{:doc "Prettier report printing method. |
| 12 | + Code is taken from clojure.test, with some added pretty-printing."} |
| 13 | + pretty-report :type) |
| 14 | + |
| 15 | +(defmethod pretty-report :default [m] |
| 16 | + (c.test/with-test-out (prn m))) |
| 17 | + |
| 18 | +(defmethod pretty-report :pass [_] |
| 19 | + (c.test/with-test-out (c.test/inc-report-counter :pass))) |
| 20 | + |
| 21 | +(defmethod pretty-report :fail [m] |
| 22 | + (c.test/with-test-out |
| 23 | + (c.test/inc-report-counter :fail) |
| 24 | + (println "\nFAIL in" (c.test/testing-vars-str m)) |
| 25 | + (when (seq c.test/*testing-contexts*) (println (c.test/testing-contexts-str))) |
| 26 | + (when-let [message (:message m)] (println message)) |
| 27 | + (print "expected:\n" (pp-str (:expected m))) |
| 28 | + (print "actual:\n" (pp-str (:actual m))))) |
| 29 | + |
| 30 | +(defmethod pretty-report :error [m] |
| 31 | + (c.test/with-test-out |
| 32 | + (c.test/inc-report-counter :error) |
| 33 | + (println "\nERROR in" (c.test/testing-vars-str m)) |
| 34 | + (when (seq c.test/*testing-contexts*) (println (c.test/testing-contexts-str))) |
| 35 | + (when-let [message (:message m)] (println message)) |
| 36 | + (print "expected:\n" (pp-str (:expected m))) |
| 37 | + (print "actual: ") |
| 38 | + (let [actual (:actual m)] |
| 39 | + (if (instance? Throwable actual) |
| 40 | + (stack/print-cause-trace actual c.test/*stack-trace-depth*) |
| 41 | + (prn actual))))) |
| 42 | + |
| 43 | +(defmethod pretty-report :summary [m] |
| 44 | + (c.test/with-test-out |
| 45 | + (println "\nRan" (:test m) "tests containing" |
| 46 | + (+ (:pass m) (:fail m) (:error m)) "assertions.") |
| 47 | + (println (:fail m) "failures," (:error m) "errors."))) |
| 48 | + |
| 49 | +(defmethod pretty-report :begin-test-ns [m] |
| 50 | + (c.test/with-test-out |
| 51 | + (println "\nTesting" (ns-name (:ns m))))) |
| 52 | + |
| 53 | +;; Ignore these message types: |
| 54 | +(defmethod pretty-report :end-test-ns [_]) |
| 55 | +(defmethod pretty-report :begin-test-var [_]) |
| 56 | +(defmethod pretty-report :end-test-var [_]) |
15 | 57 |
|
16 | 58 | (defn -main [& args] |
17 | 59 | (assert (string? (first args)) (print-str "first argument must be a string, got" args)) |
18 | 60 | (let [the-ns (-> args first symbol)] |
19 | | - (println "testing" the-ns) |
20 | 61 | (try |
21 | 62 | (require the-ns) |
22 | | - (let [test-report (clojure.test/run-tests the-ns)] |
23 | | - (println test-report) |
24 | | - (if (and (zero? (:fail test-report)) |
25 | | - (zero? (:error test-report))) |
26 | | - (System/exit 0) |
27 | | - (System/exit 1))) |
| 63 | + (binding [c.test/report pretty-report] |
| 64 | + (let [test-report (clojure.test/run-tests the-ns)] |
| 65 | + (println test-report) |
| 66 | + (if (and (zero? (:fail test-report)) |
| 67 | + (zero? (:error test-report))) |
| 68 | + (System/exit 0) |
| 69 | + (System/exit 1)))) |
28 | 70 | (catch Throwable t |
29 | 71 | (println t) |
30 | 72 | (System/exit 1))))) |
0 commit comments