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