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