[#491] fix binding of clojure.test/report
This commit is contained in:
parent
b49a3047d0
commit
834c78c044
4 changed files with 59 additions and 26 deletions
|
|
@ -234,6 +234,7 @@
|
||||||
babashka.impl.clojure.test
|
babashka.impl.clojure.test
|
||||||
(:require [babashka.impl.common :refer [ctx]]
|
(:require [babashka.impl.common :refer [ctx]]
|
||||||
[clojure.stacktrace :as stack]
|
[clojure.stacktrace :as stack]
|
||||||
|
[clojure.string :as str]
|
||||||
[clojure.template :as temp]
|
[clojure.template :as temp]
|
||||||
[sci.core :as sci]
|
[sci.core :as sci]
|
||||||
[sci.impl.analyzer :as ana]
|
[sci.impl.analyzer :as ana]
|
||||||
|
|
@ -334,14 +335,11 @@
|
||||||
arguments for 'report'."
|
arguments for 'report'."
|
||||||
:dynamic true
|
:dynamic true
|
||||||
:added "1.1"}
|
:added "1.1"}
|
||||||
report :type)
|
report-impl :type)
|
||||||
|
|
||||||
(defn- stacktrace-file-and-line
|
(def tns (sci/create-ns 'clojure.test nil))
|
||||||
[stacktrace]
|
|
||||||
(if (seq stacktrace)
|
(def report (sci/copy-var report-impl tns))
|
||||||
(let [^StackTraceElement s (first stacktrace)]
|
|
||||||
{:file (.getFileName s) :line (.getLineNumber s)})
|
|
||||||
{:file nil :line nil}))
|
|
||||||
|
|
||||||
(defn do-report
|
(defn do-report
|
||||||
"Add file and line information to a test result and call report.
|
"Add file and line information to a test result and call report.
|
||||||
|
|
@ -353,16 +351,16 @@
|
||||||
(case
|
(case
|
||||||
(:type m)
|
(:type m)
|
||||||
:fail m
|
:fail m
|
||||||
:error (merge (stacktrace-file-and-line (.getStackTrace ^Throwable (:actual m))) m)
|
:error m
|
||||||
m)))
|
m)))
|
||||||
|
|
||||||
(defmethod report :default [m]
|
(defmethod report-impl :default [m]
|
||||||
(with-test-out-internal (prn m)))
|
(with-test-out-internal (prn m)))
|
||||||
|
|
||||||
(defmethod report :pass [m]
|
(defmethod report-impl :pass [m]
|
||||||
(with-test-out-internal (inc-report-counter :pass)))
|
(with-test-out-internal (inc-report-counter :pass)))
|
||||||
|
|
||||||
(defmethod report :fail [m]
|
(defmethod report-impl :fail [m]
|
||||||
(with-test-out-internal
|
(with-test-out-internal
|
||||||
(inc-report-counter :fail)
|
(inc-report-counter :fail)
|
||||||
(println "\nFAIL in" (testing-vars-str m))
|
(println "\nFAIL in" (testing-vars-str m))
|
||||||
|
|
@ -371,7 +369,7 @@
|
||||||
(println "expected:" (pr-str (:expected m)))
|
(println "expected:" (pr-str (:expected m)))
|
||||||
(println " actual:" (pr-str (:actual m)))))
|
(println " actual:" (pr-str (:actual m)))))
|
||||||
|
|
||||||
(defmethod report :error [m]
|
(defmethod report-impl :error [m]
|
||||||
(with-test-out-internal
|
(with-test-out-internal
|
||||||
(inc-report-counter :error)
|
(inc-report-counter :error)
|
||||||
(println "\nERROR in" (testing-vars-str m))
|
(println "\nERROR in" (testing-vars-str m))
|
||||||
|
|
@ -384,20 +382,20 @@
|
||||||
(stack/print-cause-trace actual @stack-trace-depth)
|
(stack/print-cause-trace actual @stack-trace-depth)
|
||||||
(prn actual)))))
|
(prn actual)))))
|
||||||
|
|
||||||
(defmethod report :summary [m]
|
(defmethod report-impl :summary [m]
|
||||||
(with-test-out-internal
|
(with-test-out-internal
|
||||||
(println "\nRan" (:test m) "tests containing"
|
(println "\nRan" (:test m) "tests containing"
|
||||||
(+ (:pass m) (:fail m) (:error m)) "assertions.")
|
(+ (:pass m) (:fail m) (:error m)) "assertions.")
|
||||||
(println (:fail m) "failures," (:error m) "errors.")))
|
(println (:fail m) "failures," (:error m) "errors.")))
|
||||||
|
|
||||||
(defmethod report :begin-test-ns [m]
|
(defmethod report-impl :begin-test-ns [m]
|
||||||
(with-test-out-internal
|
(with-test-out-internal
|
||||||
(println "\nTesting" (sci-namespaces/sci-ns-name (:ns m)))))
|
(println "\nTesting" (sci-namespaces/sci-ns-name (:ns m)))))
|
||||||
|
|
||||||
;; Ignore these message types:
|
;; Ignore these message types:
|
||||||
(defmethod report :end-test-ns [m])
|
(defmethod report-impl :end-test-ns [m])
|
||||||
(defmethod report :begin-test-var [m])
|
(defmethod report-impl :begin-test-var [m])
|
||||||
(defmethod report :end-test-var [m])
|
(defmethod report-impl :end-test-var [m])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -431,6 +429,8 @@
|
||||||
(clojure.test/do-report {:type :pass, :message ~msg,
|
(clojure.test/do-report {:type :pass, :message ~msg,
|
||||||
:expected '~form, :actual (cons ~pred values#)})
|
:expected '~form, :actual (cons ~pred values#)})
|
||||||
(clojure.test/do-report {:type :fail, :message ~msg,
|
(clojure.test/do-report {:type :fail, :message ~msg,
|
||||||
|
:file clojure.core/*file*
|
||||||
|
:line ~(:line (meta form))
|
||||||
:expected '~form, :actual (list '~'not (cons '~pred values#))}))
|
:expected '~form, :actual (list '~'not (cons '~pred values#))}))
|
||||||
result#)))
|
result#)))
|
||||||
|
|
||||||
|
|
@ -444,6 +444,8 @@
|
||||||
(clojure.test/do-report {:type :pass, :message ~msg,
|
(clojure.test/do-report {:type :pass, :message ~msg,
|
||||||
:expected '~form, :actual value#})
|
:expected '~form, :actual value#})
|
||||||
(clojure.test/do-report {:type :fail, :message ~msg,
|
(clojure.test/do-report {:type :fail, :message ~msg,
|
||||||
|
:file clojure.core/*file*
|
||||||
|
:line ~(:line (meta form))
|
||||||
:expected '~form, :actual value#}))
|
:expected '~form, :actual value#}))
|
||||||
value#))
|
value#))
|
||||||
|
|
||||||
|
|
@ -464,7 +466,9 @@
|
||||||
|
|
||||||
(defmethod assert-expr :always-fail [msg form]
|
(defmethod assert-expr :always-fail [msg form]
|
||||||
;; nil test: always fail
|
;; nil test: always fail
|
||||||
`(clojure.test/do-report {:type :fail, :message ~msg}))
|
`(clojure.test/do-report {:type :fail, :message ~msg
|
||||||
|
:file clojure.core/*file*
|
||||||
|
:line ~(:line (meta form))}))
|
||||||
|
|
||||||
(defmethod assert-expr :default [msg form]
|
(defmethod assert-expr :default [msg form]
|
||||||
(if (and (sequential? form) (function? (first form)))
|
(if (and (sequential? form) (function? (first form)))
|
||||||
|
|
@ -480,6 +484,8 @@
|
||||||
(clojure.test/do-report {:type :pass, :message ~msg,
|
(clojure.test/do-report {:type :pass, :message ~msg,
|
||||||
:expected '~form, :actual (class object#)})
|
:expected '~form, :actual (class object#)})
|
||||||
(clojure.test/do-report {:type :fail, :message ~msg,
|
(clojure.test/do-report {:type :fail, :message ~msg,
|
||||||
|
:file clojure.core/*file*
|
||||||
|
:line ~(:line (meta form))
|
||||||
:expected '~form, :actual (class object#)}))
|
:expected '~form, :actual (class object#)}))
|
||||||
result#)))
|
result#)))
|
||||||
|
|
||||||
|
|
@ -491,6 +497,8 @@
|
||||||
body (nthnext form 2)]
|
body (nthnext form 2)]
|
||||||
`(try ~@body
|
`(try ~@body
|
||||||
(clojure.test/do-report {:type :fail, :message ~msg,
|
(clojure.test/do-report {:type :fail, :message ~msg,
|
||||||
|
:file clojure.core/*file*
|
||||||
|
:line ~(:line (meta form))
|
||||||
:expected '~form, :actual nil})
|
:expected '~form, :actual nil})
|
||||||
(catch ~klass e#
|
(catch ~klass e#
|
||||||
(clojure.test/do-report {:type :pass, :message ~msg,
|
(clojure.test/do-report {:type :pass, :message ~msg,
|
||||||
|
|
@ -512,7 +520,9 @@
|
||||||
(if (re-find ~re m#)
|
(if (re-find ~re m#)
|
||||||
(clojure.test/do-report {:type :pass, :message ~msg,
|
(clojure.test/do-report {:type :pass, :message ~msg,
|
||||||
:expected '~form, :actual e#})
|
:expected '~form, :actual e#})
|
||||||
(clojure.test/do-report {:type :fail, :message ~msg,
|
(clojure.test/do-report {:file clojure.core/*file*
|
||||||
|
:line ~(:line (meta form))
|
||||||
|
:type :fail, :message ~msg,
|
||||||
:expected '~form, :actual e#})))
|
:expected '~form, :actual e#})))
|
||||||
e#))))
|
e#))))
|
||||||
|
|
||||||
|
|
@ -524,7 +534,9 @@
|
||||||
[msg form]
|
[msg form]
|
||||||
`(try ~(assert-expr msg form)
|
`(try ~(assert-expr msg form)
|
||||||
(catch Throwable t#
|
(catch Throwable t#
|
||||||
(clojure.test/do-report {:type :error, :message ~msg,
|
(clojure.test/do-report {:file clojure.core/*file*
|
||||||
|
:line ~(:line (meta form))
|
||||||
|
:type :error, :message ~msg,
|
||||||
:expected '~form, :actual t#}))))
|
:expected '~form, :actual t#}))))
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -690,7 +702,7 @@
|
||||||
|
|
||||||
;;; RUNNING TESTS: LOW-LEVEL FUNCTIONS
|
;;; RUNNING TESTS: LOW-LEVEL FUNCTIONS
|
||||||
|
|
||||||
(defn test-var
|
(defn test-var-impl
|
||||||
"If v has a function in its :test metadata, calls that function,
|
"If v has a function in its :test metadata, calls that function,
|
||||||
with *testing-vars* bound to (conj *testing-vars* v)."
|
with *testing-vars* bound to (conj *testing-vars* v)."
|
||||||
{:dynamic true, :added "1.1"}
|
{:dynamic true, :added "1.1"}
|
||||||
|
|
@ -705,6 +717,8 @@
|
||||||
:expected nil, :actual e})))
|
:expected nil, :actual e})))
|
||||||
(do-report {:type :end-test-var, :var v}))))
|
(do-report {:type :end-test-var, :var v}))))
|
||||||
|
|
||||||
|
(def test-var (sci/copy-var test-var-impl tns))
|
||||||
|
|
||||||
(defn test-vars
|
(defn test-vars
|
||||||
"Groups vars by their namespace and runs test-vars on them with
|
"Groups vars by their namespace and runs test-vars on them with
|
||||||
appropriate fixtures applied."
|
appropriate fixtures applied."
|
||||||
|
|
@ -720,7 +734,8 @@
|
||||||
(fn []
|
(fn []
|
||||||
(doseq [v vars]
|
(doseq [v vars]
|
||||||
(when (:test (meta v))
|
(when (:test (meta v))
|
||||||
(each-fixture-fn (fn [] (test-var v))))))))))
|
(each-fixture-fn (fn [] (test-var ;; this calls the sci var which can be rebound
|
||||||
|
v))))))))))
|
||||||
|
|
||||||
(defn test-all-vars
|
(defn test-all-vars
|
||||||
"Calls test-vars on every var interned in the namespace, with fixtures."
|
"Calls test-vars on every var interned in the namespace, with fixtures."
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@
|
||||||
(:require [babashka.impl.clojure.test :as t]
|
(:require [babashka.impl.clojure.test :as t]
|
||||||
[sci.core :as sci]))
|
[sci.core :as sci]))
|
||||||
|
|
||||||
(def tns (sci/create-ns 'clojure.test nil))
|
|
||||||
|
|
||||||
(defn macrofy [v]
|
(defn macrofy [v]
|
||||||
(with-meta v {:sci/macro true}))
|
(with-meta v {:sci/macro true}))
|
||||||
|
|
||||||
|
|
@ -23,7 +21,7 @@
|
||||||
'testing-vars-str t/testing-vars-str
|
'testing-vars-str t/testing-vars-str
|
||||||
'testing-contexts-str t/testing-contexts-str
|
'testing-contexts-str t/testing-contexts-str
|
||||||
'inc-report-counter t/inc-report-counter
|
'inc-report-counter t/inc-report-counter
|
||||||
'report (sci/copy-var t/report tns)
|
'report t/report
|
||||||
'do-report t/do-report
|
'do-report t/do-report
|
||||||
;; assertion utilities
|
;; assertion utilities
|
||||||
'function? t/function?
|
'function? t/function?
|
||||||
|
|
@ -49,7 +47,7 @@
|
||||||
'compose-fixtures t/compose-fixtures
|
'compose-fixtures t/compose-fixtures
|
||||||
'join-fixtures t/join-fixtures
|
'join-fixtures t/join-fixtures
|
||||||
;; running tests: low level
|
;; running tests: low level
|
||||||
'test-var (sci/copy-var t/test-var tns)
|
'test-var t/test-var
|
||||||
'test-vars t/test-vars
|
'test-vars t/test-vars
|
||||||
'test-all-vars (with-meta t/test-all-vars {:sci.impl/op :needs-ctx})
|
'test-all-vars (with-meta t/test-all-vars {:sci.impl/op :needs-ctx})
|
||||||
'test-ns (with-meta t/test-ns {:sci.impl/op :needs-ctx})
|
'test-ns (with-meta t/test-ns {:sci.impl/op :needs-ctx})
|
||||||
|
|
|
||||||
10
test-resources/babashka/test_report.clj
Normal file
10
test-resources/babashka/test_report.clj
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
(ns foo
|
||||||
|
(:require
|
||||||
|
[clojure.test :as t]))
|
||||||
|
|
||||||
|
(t/deftest bar
|
||||||
|
(t/is (= 1 2) "1 is not equal to 2"))
|
||||||
|
|
||||||
|
(binding [t/report (fn [m]
|
||||||
|
(prn (update m :var (comp :name meta))))]
|
||||||
|
(t/test-var #'bar))
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
(ns babashka.test-test
|
(ns babashka.test-test
|
||||||
(:require
|
(:require
|
||||||
[babashka.test-utils :as tu]
|
[babashka.test-utils :as tu]
|
||||||
|
[clojure.edn :as edn]
|
||||||
[clojure.java.io :as io]
|
[clojure.java.io :as io]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
[clojure.test :as t :refer [deftest is]]))
|
[clojure.test :as t :refer [deftest is]]))
|
||||||
|
|
@ -73,3 +74,12 @@
|
||||||
(deftest rebind-vars-test
|
(deftest rebind-vars-test
|
||||||
(is (bb "(binding [clojure.test/report (constantly true)] nil)"))
|
(is (bb "(binding [clojure.test/report (constantly true)] nil)"))
|
||||||
(is (bb "(binding [clojure.test/test-var (constantly true)] nil)")))
|
(is (bb "(binding [clojure.test/test-var (constantly true)] nil)")))
|
||||||
|
|
||||||
|
(deftest rebind-report-test
|
||||||
|
(let [[m1 m2 m3]
|
||||||
|
(edn/read-string (format "[%s]" (bb (io/file "test-resources" "babashka" "test_report.clj"))))]
|
||||||
|
(is (= m1 '{:type :begin-test-var, :var bar}))
|
||||||
|
(is (str/includes? (:file m2) "test_report.clj"))
|
||||||
|
(is (= (:message m2) "1 is not equal to 2"))
|
||||||
|
(is (= (:line m2) 6))
|
||||||
|
(is (= m3 '{:type :end-test-var, :var bar}))))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue