|
16 | 16 | [clojure.test.generative.event :as event] |
17 | 17 | [clojure.test.generative.generators :as gen] |
18 | 18 | [clojure.test.generative.io :as io] |
19 | | - [clojure.test.generative.clojure-test-adapter :as cta] |
20 | 19 | [clojure.test :as ctest])) |
21 | 20 |
|
22 | 21 | (set! *warn-on-reflection* true) |
23 | 22 |
|
| 23 | +;; non-nil binding means running inside the framework |
| 24 | +(def ^:dynamic *failed* nil) |
| 25 | + |
| 26 | +(defn failed! |
| 27 | + "Tell the runner that a test failed" |
| 28 | + [] |
| 29 | + (when *failed* |
| 30 | + (deliver *failed* :failed))) |
| 31 | + |
| 32 | +(defmulti ctevent->event |
| 33 | + "Convert a clojure.test reporting event to an event." |
| 34 | + :type) |
| 35 | + |
| 36 | +(defmethod ctevent->event :default |
| 37 | + [e] |
| 38 | + (event/create :clojure.test/unknown e)) |
| 39 | + |
| 40 | +(defmethod ctevent->event :pass |
| 41 | + [e] |
| 42 | + (event/create :type :assert/pass)) |
| 43 | + |
| 44 | +(defmethod ctevent->event :fail |
| 45 | + [e] |
| 46 | + (failed!) |
| 47 | + (event/create :type :assert/fail |
| 48 | + :level :warn |
| 49 | + :message (:message e) |
| 50 | + :test/actual (:actual e) |
| 51 | + :test/expected (:expected e) |
| 52 | + :file (:file e) |
| 53 | + :line (:line e) |
| 54 | + ::ctest/contexts (seq ctest/*testing-contexts*) |
| 55 | + ::ctest/vars (reverse (map #(:name (meta %)) ctest/*testing-vars*)))) |
| 56 | + |
| 57 | +(defmethod ctevent->event :error |
| 58 | + [e] |
| 59 | + (event/create :level :error |
| 60 | + :type :error |
| 61 | + ::ctest/contexts (seq ctest/*testing-contexts*) |
| 62 | + :message (:message e) |
| 63 | + :test/expected (:expected e) |
| 64 | + :exception (:actual e) |
| 65 | + :file (:file e) |
| 66 | + :line (:line e) |
| 67 | + ::ctest/vars (reverse (map #(:name (meta %)) ctest/*testing-vars*)))) |
| 68 | + |
| 69 | +(defmethod ctevent->event :summary |
| 70 | + [e] |
| 71 | + nil) |
| 72 | + |
| 73 | +(defmethod ctevent->event :begin-test-ns |
| 74 | + [e] |
| 75 | + (event/create :type :test/group |
| 76 | + :tags #{:begin} |
| 77 | + :name (ns-name (:ns e)))) |
| 78 | + |
| 79 | +(defmethod ctevent->event :end-test-ns |
| 80 | + [e] |
| 81 | + (event/create :type :test/group |
| 82 | + :tags #{:end} |
| 83 | + :name (ns-name (:ns e)))) |
| 84 | + |
| 85 | +(defmethod ctevent->event :begin-test-var |
| 86 | + [e] |
| 87 | + (event/create :type :test/test |
| 88 | + :tags #{:begin} |
| 89 | + :name (event/fqname (:var e)))) |
| 90 | + |
| 91 | +(defmethod ctevent->event :end-test-var |
| 92 | + [e] |
| 93 | + (event/create :type :test/test |
| 94 | + :tags #{:end} |
| 95 | + :name (event/fqname (:var e)))) |
| 96 | + |
| 97 | +(defn ct-adapter |
| 98 | + "Adapt clojure.test event model to fire c.t.g events." |
| 99 | + [m] |
| 100 | + (when-let [e (ctevent->event m)] |
| 101 | + (event/report-fn e))) |
| 102 | + |
24 | 103 | (defprotocol Test |
25 | 104 | (test-name [_]) |
26 | 105 | (test-fn [_]) |
|
41 | 120 | [v] |
42 | 121 | (map #(%) (:clojure.test.generative/inputs (meta v))))) |
43 | 122 |
|
44 | | -;; non-nil binding means running inside the framework |
45 | | -(def ^:dynamic *failed* nil) |
46 | | - |
47 | 123 | (defn run-iter |
48 | 124 | "Run a single test iteration" |
49 | 125 | [test] |
|
99 | 175 | (doseq [test tests] |
100 | 176 | (run-for test nthreads test-msec)))) |
101 | 177 |
|
102 | | -(defn failed! |
103 | | - "Tell the runner that a test failed" |
104 | | - [] |
105 | | - (when *failed* |
106 | | - (deliver *failed* :failed))) |
107 | | - |
108 | 178 | #_(defn set-seed |
109 | 179 | [n] |
110 | 180 | (set! gen/*rnd* (java.util.Random. n))) |
|
160 | 230 | (defn run-all-tests |
161 | 231 | "Run generative tests and clojure.test tests" |
162 | 232 | [nses threads msec] |
163 | | - (let [run-with-counts |
164 | | - (fn [lib f] |
165 | | - (let [event-counts (atom {}) |
166 | | - event-counter #(when-not (contains? (:tags %) :begin) |
167 | | - (when-let [type (:type %)] |
168 | | - (swap! event-counts update-in [type] (fnil inc 0))))] |
169 | | - (event/report :test/library :name lib) |
170 | | - (event/with-handler event-counter (f)) |
171 | | - @event-counts)) |
172 | | - ct-results (run-with-counts 'clojure.test |
173 | | - #(binding [ctest/report cta/report-adapter] |
174 | | - (when-let [ctnses (seq (filter has-clojure-test-tests? nses))] |
175 | | - (apply ctest/run-tests ctnses)))) |
176 | | - ctg-results (run-with-counts 'clojure.test.generative |
177 | | - #(run-generative-tests nses threads msec))] |
178 | | - (io/await) |
179 | | - {'clojure.test ct-results |
180 | | - 'clojure.test.generative ctg-results})) |
| 233 | + (binding [ctest/report ct-adapter] |
| 234 | + (let [run-with-counts |
| 235 | + (fn [lib f] |
| 236 | + (let [event-counts (atom {}) |
| 237 | + event-counter #(when-not (contains? (:tags %) :begin) |
| 238 | + (when-let [type (:type %)] |
| 239 | + (swap! event-counts update-in [type] (fnil inc 0))))] |
| 240 | + (event/report :test/library :name lib) |
| 241 | + (event/with-handler event-counter (f)) |
| 242 | + @event-counts)) |
| 243 | + ct-results (run-with-counts 'clojure.test |
| 244 | + #(when-let [ctnses (seq (filter has-clojure-test-tests? nses))] |
| 245 | + (apply ctest/run-tests ctnses))) |
| 246 | + ctg-results (run-with-counts 'clojure.test.generative |
| 247 | + #(run-generative-tests nses threads msec))] |
| 248 | + (io/await) |
| 249 | + {'clojure.test ct-results |
| 250 | + 'clojure.test.generative ctg-results}))) |
181 | 251 |
|
182 | 252 | (defn failed? |
183 | 253 | [result] |
|
0 commit comments