diff --git a/README.md b/README.md index a3556cb1..5edbd08e 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ Leiningen is a build tool for Clojure designed to not set your hair on fire. $ lein deps # install dependencies in lib/ + $ lein test [PRED] # run the project's tests, optionally filtered on PRED + $ lein compile # ahead-of-time compile into classes/ $ lein repl # launch a REPL with the project classpath configured diff --git a/src/leiningen/test.clj b/src/leiningen/test.clj new file mode 100644 index 00000000..c4a4b014 --- /dev/null +++ b/src/leiningen/test.clj @@ -0,0 +1,27 @@ +(ns leiningen.test + (:refer-clojure :exclude [test]) + (:use [clojure.test] + [clojure.contrib.java-utils :only [file]] + [clojure.contrib.find-namespaces :only [find-namespaces-in-dir]])) + +(defonce old-test-var test-var) + +(defn test-var-matching [pred var] + (when (pred (meta var)) + (old-test-var var))) + +(defn run-matching [pred namespaces] + (binding [test-var (partial test-var-matching pred)] + (apply run-tests namespaces))) + +(defn test + "Run the projects tests. Second argument is an optional filter predicate that + is called with each test's metadata map." + [project & [pred]] + (let [namespaces (find-namespaces-in-dir (file (:root project) "test")) + runner (if pred + (partial run-matching (eval pred)) + run-tests)] + (doseq [n namespaces] + (require n)) + (apply runner namespaces)))