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