(binding [*compile-files* true] (require 'clojure.test)) (ns test-runner (:require [clojure.test :as t])) (when-not (.exists (java.io.File. "classes")) (.. (java.io.File. "classes") mkdir)) (defmulti emacs-report :type) (defmethod emacs-report :fail [m] (t/with-test-out (when-let [source-file (some-> t/*testing-vars* first meta :file)] (println (str "FAIL:" source-file ":" (:line m) ":" (t/testing-vars-str m) ":" (t/testing-contexts-str) ":" (:message m "FAIL"))) (println (str "FAIL-CONTINUE:EXPECTED:" (pr-str (:expected m)))) (println (str "FAIL-CONTINUE:ACTUAL:" (pr-str (:actual m))))))) (defmethod emacs-report :error [m] (when-let [source-file (some-> t/*testing-vars* first meta :file)] (println (str "ERROR:" source-file ":" (:line m) ":" (t/testing-vars-str m) ":" (t/testing-contexts-str) ":" (:message m "FAIL"))) (println (str "ERROR-CONTINUE:EXPECTED:" (pr-str (:expected m)))) (println (str "ERROR-CONTINUE:ACTUAL:" (if (instance? Throwable (:actual m)) (ex-message (:actual m)) (pr-str (:actual m))))))) (defmethod emacs-report :default [_]) (defn -main [& [test-file]] (binding [*compile-files* true] (compile 'test-runner) (let [test-namespaces (->> (or test-file "test") (java.io.File.) (file-seq) (filter (memfn isFile)) (map (memfn getPath)) (map load-file) (map (comp :ns meta)) (into #{}))] (System/exit (if (pos? (reduce (fn [total-fails n] (with-redefs [t/report emacs-report] (let [results (t/run-tests n)] (+ total-fails (:fail results 0) (:error results 0))))) 0 test-namespaces)) 1 0)))))