Konrad Mrożek
2023-07-18 2f005129c7666f0fc0dd14fcd6201e5867133a87
commit | author | age
919581 1 (binding [*compile-files* true]
KM 2   (require 'clojure.test))
3
4 (ns test-runner
5   (:require [clojure.test :as t]))
6
7 (when-not (.exists (java.io.File. "classes"))
8   (.. (java.io.File. "classes") mkdir))
9
55439f 10 (defmulti vim-report :type)
919581 11
55439f 12 (defmethod vim-report :begin-test-ns [m]
KM 13   (println "\nTesting" (ns-name (:ns m))))
14
2f0051 15 (defmethod vim-report :begin-test-var [m]
KM 16   (println "\nExecuting" (:name (meta (:var m)))))
17
55439f 18 (defmethod vim-report :fail
919581 19   [m]
KM 20   (t/with-test-out
04e874 21     (when-let [source-file (some-> t/*testing-vars*
KM 22                                    first
23                                    meta
24                                    :file)]
2c210a 25       (println (str "FAIL:" source-file ":" (:line m) ":" (t/testing-vars-str m) ":" (t/testing-contexts-str) ":" (:message m "FAIL")))
KM 26       (println (str "FAIL-CONTINUE:EXPECTED:" (pr-str (:expected m))))
27       (println (str "FAIL-CONTINUE:ACTUAL:" (pr-str (:actual m)))))))
04e874 28
22b826 29 (defn- find-line-number [source-file m]
KM 30   (if (instance? Throwable (:actual m))
31     (let [fname (-> source-file (java.io.File.) (.getName))]
32       (->> m
33            :actual
34            Throwable->map
35            :trace
36            (some (fn [[_ _ e-file e-line]]
37                    (when (= e-file fname)
38                      e-line)))))
39     (:line m)))
40
55439f 41 (defmethod vim-report :error
04e874 42   [m]
KM 43   (when-let [source-file (some-> t/*testing-vars*
44                                  first
45                                  meta
46                                  :file)]
22b826 47     (let [line (find-line-number source-file m)]
KM 48       (println (str "ERROR:" source-file ":" line ":" (t/testing-vars-str m) ":" (t/testing-contexts-str) ":" (:message m "FAIL")))
49       (println (str "ERROR-CONTINUE:EXPECTED:" (pr-str (:expected m))))
50       (println (str "ERROR-CONTINUE:ACTUAL:"
51                     (if (instance? Throwable (:actual m))
52                       (ex-message (:actual m))
53                       (pr-str (:actual m))))))))
04e874 54
55439f 55 (defmethod vim-report :default
04e874 56   [_])
919581 57
9ae31a 58 (defn- clj-file? [f]
KM 59   (re-matches #"^.*\.cljs?$" (.getName f)))
60
61 (defn -main  [& {:strs [-test-file] :or {-test-file "test"}}]
919581 62   (binding  [*compile-files* true]
KM 63     (compile 'test-runner)
9ae31a 64     (println "Detecting test files in" -test-file)
KM 65     (let [test-files (->> -test-file
f5c518 66                           (java.io.File.)
KM 67                           (file-seq)
68                           (filter (memfn isFile))
9ae31a 69                           (filter clj-file?)
f5c518 70                           (map (memfn getAbsolutePath))
KM 71                           (set))]
72       (println "Loading test files...")
73       (run! load-file test-files)
55439f 74       (when (find-ns 'malli.core)
KM 75         (println "Malli detected. Instrument functions...")
76         (require 'malli.dev)
77         ((find-var 'malli.dev/start!)))
f5c518 78       (let [test-namespaces (->> (all-ns)
KM 79                                  (mapcat ns-publics)
80                                  (map (comp meta second))
81                                  (filter :test)
82                                  (filter (comp test-files :file))
83                                  (map :ns)
84                                  (set))]
85         (System/exit (if (pos? (reduce (fn [total-fails n]
55439f 86                                          (with-redefs [t/report vim-report]
22b826 87                                            (let [results (t/run-tests n)]
f5c518 88                                              (+ total-fails
KM 89                                                 (:fail results 0)
90                                                 (:error results 0)))))
91                                        0
92                                        test-namespaces))
93                        1
94                        0))))))