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