Konrad Mrożek
2023-07-19 3dde4ce4104db48cc12581e3b58f5200b957f308
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
3dde4c 61 (defn find-closest-test [test-file test-line]
KM 62   (->> (all-ns)
63        (mapcat ns-publics)
64        (map second)
65        (filter (comp :test meta))
66        (filter (comp #{test-file} :file meta))
67        (map #(vector % (- test-line (-> % meta :line))))
68        (filterv (comp pos? second))
69        (sort-by second)
70        first
71        first))
72
73 (defn -main [& {:strs [-test-file -test-line] :or {-test-file "test"}}]
74   (binding [*compile-files* true]
919581 75     (compile 'test-runner)
9ae31a 76     (println "Detecting test files in" -test-file)
KM 77     (let [test-files (->> -test-file
f5c518 78                           (java.io.File.)
KM 79                           (file-seq)
80                           (filter (memfn isFile))
9ae31a 81                           (filter clj-file?)
f5c518 82                           (map (memfn getAbsolutePath))
KM 83                           (set))]
84       (println "Loading test files...")
85       (run! load-file test-files)
55439f 86       (when (find-ns 'malli.core)
KM 87         (println "Malli detected. Instrument functions...")
88         (require 'malli.dev)
89         ((find-var 'malli.dev/start!)))
f5c518 90       (let [test-namespaces (->> (all-ns)
KM 91                                  (mapcat ns-publics)
92                                  (map (comp meta second))
93                                  (filter :test)
94                                  (filter (comp test-files :file))
95                                  (map :ns)
96                                  (set))]
3dde4c 97         (with-redefs [t/report vim-report]
KM 98           (System/exit
99            (if (pos? (if (and -test-file -test-line)
100                        (let [results (t/test-vars [(find-closest-test (.. (java.io.File. -test-file) getAbsolutePath)
101                                                                       (parse-long -test-line))])]
102                          (+ (:fail results 0)
103                             (:error results 0)))
104                        (reduce (fn [total-fails n]
105                                  (let [results (t/run-tests n)]
106                                    (+ total-fails
107                                       (:fail results 0)
108                                       (:error results 0))))
109                                0
110                                test-namespaces)))
111              1
112              0)))))))
113
114
115
116