public
Created

A nestable with-test-tags macro to tag clojure.test tests for use with external tools

  • Download Gist
core.clj
Clojure
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
;;; See
;;; http://stackoverflow.com/questions/7240947/is-a-transparent-macrolet-possible
;;; for a discussion.
 
;;; src/deftest_magic/core.clj
 
(ns deftest-magic.core
(:use [clojure.tools.macro :only [macrolet]]))
 
(comment
 
(def ^:dynamic *tags* #{})
 
(defmacro with-test-tags [tags & body]
`(binding [*tags* (into *tags* ~tags)]
~@body))
 
(defmacro deftest [name & body]
`(let [n# (vary-meta '~name update-in [:tags] (fnil into #{}) *tags*)
form# (list* 'clojure.test/deftest n# '~body)]
(eval form#)))
 
)
 
(def ^:dynamic *tags* #{})
 
(defmacro with-test-tags [tags & body]
`(macrolet [~'(deftest [name & body]
`(let [n# (vary-meta '~name update-in [:tags] (fnil into #{}) *tags*)
form# (list* 'clojure.test/deftest n# '~body)]
(eval form#)))]
(binding [*tags* (into *tags* ~tags)]
~@body)))
project.clj
Clojure
1 2 3 4
(defproject deftest-magic "0.1.0-SNAPSHOT"
:description "A nestable with-test-tags macro to tag clojure.test tests for use with external tools."
:dependencies [[org.clojure/clojure "1.3.0-beta2"]
[org.clojure/tools.macro "0.1.1"]])
test_core.clj
Clojure
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
;;; test/deftest_magic/test/core.clj
 
(ns deftest-magic.test.core
(:use [deftest-magic.core :only [with-test-tags]])
(:use [clojure.test])
)
 
(deftest plain-deftest
(is (= :foo :foo)))
 
(with-test-tags #{:foo}
 
(deftest foo
(is true))
 
(with-test-tags #{:bar}
 
(deftest foo-bar
(is true))))
 
(deftest test-tags
(let [plaintest-tags (:tags (meta #'plain-deftest))]
(is (or (nil? plaintest-tags) (empty? plaintest-tags))))
(is (= #{:foo} (:tags (meta #'foo))))
(is (= #{:foo :bar} (:tags (meta #'foo-bar)))))

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.