cljs.test/assert-expr
multimethod | since v1.8.51 | Edit |
(assert-expr menv msg form)
(defmulti assert-expr
(fn [menv msg form]
(cond
(nil? form) :always-fail
(seq? form) (first form)
:else :default)))
(defmethod assert-expr :always-fail [menv msg form]
(let [{:keys [file line end-line column end-column]} (meta form)]
`(report {:type :fail, :message ~msg
:file ~file :line ~line :end-line ~end-line :column ~column :end-column ~end-column})))
(defmethod assert-expr :default [menv msg form]
(if (and (sequential? form)
(function? menv (first form)))
(assert-predicate msg form)
(assert-any msg form)))
(defmethod assert-expr 'instance? [menv msg form]
(let [{:keys [file line end-line column end-column]} (meta form)]
`(let [klass# ~(nth form 1)
object# ~(nth form 2)]
(let [result# (instance? klass# object#)]
(if result#
(report
{:type :pass, :message ~msg,
:file ~file :line ~line :end-line ~end-line :column ~column :end-column ~end-column
:expected '~form, :actual (type object#)})
(report
{:type :fail, :message ~msg,
:file ~file :line ~line :end-line ~end-line :column ~column :end-column ~end-column
:expected '~form, :actual (type object#)}))
result#))))
(defmethod assert-expr 'thrown? [menv msg form]
(let [{:keys [file line end-line column end-column]} (meta form)
klass (second form)
body (nthnext form 2)]
`(try
~@body
(report
{:type :fail, :message ~msg,
:file ~file :line ~line :end-line ~end-line :column ~column :end-column ~end-column
:expected '~form, :actual nil})
(catch ~klass e#
(report
{:type :pass, :message ~msg,
:file ~file :line ~line :end-line ~end-line :column ~column :end-column ~end-column
:expected '~form, :actual e#})
e#))))
(defmethod assert-expr 'thrown-with-msg? [menv msg form]
(let [{:keys [file line end-line column end-column]} (meta form)
klass (nth form 1)
re (nth form 2)
body (nthnext form 3)]
`(try
~@body
(report {:type :fail, :message ~msg, :expected '~form, :actual nil
:file ~file :line ~line :end-line ~end-line :column ~column :end-column ~end-column})
(catch ~klass e#
(let [m# (.-message e#)]
(if (re-find ~re m#)
(report
{:type :pass, :message ~msg,
:file ~file :line ~line :end-line ~end-line :column ~column :end-column ~end-column
:expected '~form, :actual e#})
(report
{:type :fail, :message ~msg,
:file ~file :line ~line :end-line ~end-line :column ~column :end-column ~end-column
:expected '~form, :actual e#}))
e#)))))