Support disabling :monkeypatch-clojure-test.

This commit is contained in:
Phil Hagelberg 2013-08-12 16:43:18 -07:00
parent d661b1846a
commit 824552e449
3 changed files with 40 additions and 27 deletions

View file

@ -116,6 +116,9 @@
:test-selectors {:default (fn [m] (not (or (:integration m) (:regression m))))
:integration :integration
:regression :regression}
;; In order to support the `retest` task, Leiningen must monkeypatch the
;; clojure.test library. This disables that feature and breaks `lein retest`.
:monkeypatch-clojure-test false
;; These namespaces will be AOT-compiled. Needed for gen-class and
;; other Java interop functionality. Put a regex here to compile all
;; namespaces whose names match.

View file

@ -1,11 +1,14 @@
(ns leiningen.retest
(:require [leiningen.test :as test]))
(:require [leiningen.test :as test]
[leiningen.core.main :as main]))
(defn retest
"Run only the test namespaces which failed last time around."
[project & selectors]
(apply test/test project
(concat (if (.exists (java.io.File. ".lein-failures"))
(->> (slurp ".lein-failures")
read-string sort (map name)))
selectors)))
(if (:monkeypatch-clojure-test project true)
(apply test/test project
(concat (if (.exists (java.io.File. ".lein-failures"))
(->> (slurp ".lein-failures")
read-string sort (map name)))
selectors))
(main/abort "Cannot retest when :monkeypatch-clojure-test is disabled.")))

View file

@ -61,6 +61,9 @@
~selectors)]
ns#)))
;; TODO: make this an arg to form-for-testing-namespaces in 3.0.
(def ^:private ^:dynamic *monkeypatch?* true)
(defn form-for-testing-namespaces
"Return a form that when eval'd in the context of the project will test
each namespace and print an overall summary."
@ -70,27 +73,30 @@
(when (seq ~ns-sym)
(apply require :reload ~ns-sym))
(let [failures# (atom #{})
selected-namespaces# ~(form-for-nses-selectors-match selectors ns-sym)
_# (leiningen.core.injected/add-hook
#'clojure.test/report
(fn [report# m# & args#]
(when (#{:error :fail} (:type m#))
(when-let [first-var# (-> clojure.test/*testing-vars* first meta)]
(swap! failures# conj (ns-name (:ns first-var#)))
(newline)
(println "lein test :only"
(str (ns-name (:ns first-var#))
"/"
(:name first-var#)))))
(if (= :begin-test-ns (:type m#))
(clojure.test/with-test-out
(newline)
(println "lein test" (ns-name (:ns m#))))
(apply report# m# args#))))
selected-namespaces# ~(form-for-nses-selectors-match selectors ns-sym)
_# (when ~*monkeypatch?*
(leiningen.core.injected/add-hook
#'clojure.test/report
(fn [report# m# & args#]
(when (#{:error :fail} (:type m#))
(when-let [first-var# (-> clojure.test/*testing-vars* first meta)]
(swap! failures# conj (ns-name (:ns first-var#)))
(newline)
(println "lein test :only"
(str (ns-name (:ns first-var#)) "/"
(:name first-var#)))))
(if (= :begin-test-ns (:type m#))
(clojure.test/with-test-out
(newline)
(println "lein test" (ns-name (:ns m#))))
(apply report# m# args#)))))
summary# (binding [clojure.test/*test-out* *out*]
(~form-for-suppressing-unselected-tests selected-namespaces# ~selectors
#(apply ~'clojure.test/run-tests selected-namespaces#)))]
(spit ".lein-failures" (pr-str @failures#))
(~form-for-suppressing-unselected-tests
selected-namespaces# ~selectors
#(apply ~'clojure.test/run-tests selected-namespaces#)))]
(spit ".lein-failures" (if ~*monkeypatch?*
(pr-str @failures#)
"#<disabled :monkeypatch-clojure-test>"))
(if ~*exit-after-tests*
(System/exit (+ (:error summary#) (:fail summary#)))
(+ (:error summary#) (:fail summary#))))))))
@ -182,7 +188,8 @@ specified test. A default :all test-selector is available to run all tests."
main/*exit-process?*)
*exit-after-tests* (if (= :leiningen (:eval-in project))
false
*exit-after-tests*)]
*exit-after-tests*)
*monkeypatch?* (:monkeypatch-clojure-test project true)]
(let [project (project/merge-profiles project [:leiningen/test :test])
[nses selectors] (read-args tests project)
form (form-for-testing-namespaces nses nil (vec selectors))]