logos.test reference
Copy Markdown
Every public, documented Var in logos.test, pulled live from its own docstring, each with a real, freshly-evaluated example and its own source. For prose/narrative explanation and worked examples, see the language reference; for everything else generated (the overview, special forms, primitives, and every other stdlib namespace), see the other pages in this "Stdlib Reference" section.
assert
macro -- (assert form)
Throws :assertion-failed (carrying the unevaluated form and the value it actually produced) if form evaluates to anything falsy; otherwise returns that (truthy) value.
Example:
(require '[logos.test :refer [:all]])
(assert (= 1 1))
;;=> trueSource:
(defmacro assert
[form]
`(let [v# ~form]
(if v# v# (throw :assertion-failed (list :form (quote ~form) :value v#)))))assert-throws
macro -- (assert-throws tag form)
Runs form, throwing :assertion-failed unless it throws tag. Returns the value form threw on success.
Example:
(require '[logos.test :refer [:all]])
(assert-throws :oops (throw :oops "bad"))
;;=> "bad"Source:
(defmacro assert-throws
[tag form]
`(try
(do ~form (throw :assertion-failed (list :expected-throw ~tag :form (quote ~form))))
(catch ~tag v# v#)))assert=
macro -- (assert= actual expected)
Throws :assertion-failed (carrying both sides, unevaluated, plus their actual values) unless (= actual expected); otherwise returns actual.
Example:
(require '[logos.test :refer [:all]])
(assert= (+ 1 1) 2)
;;=> 2Source:
(defmacro assert=
[actual expected]
`(let [a# ~actual e# ~expected]
(if (= a# e#)
a#
(throw :assertion-failed
(list
:expected (quote ~expected) :expected-value e#
:actual (quote ~actual) :actual-value a#)))))deftest
macro -- (deftest name & body)
Registers a named test. body runs as an ordinary zero-arg thunk; run-tests isolates it in its own process, so a failure here never affects any other test.
Example:
(require '[logos.test :refer [:all]])
(deftest my-test (assert true))
(first (first test-registry))
;;=> my-testSource:
(defmacro deftest
[name & body]
`(register-test! (quote ~name) (fn [] ~@body)))register-test!
fn -- (register-test! name test-fn)
Registers name/test-fn into test-registry -- the actual mutation deftest's expansion calls.
Example:
(require '[logos.test :refer [:all]])
(register-test! 'my-test2 (fn [] (assert true)))
(first (first test-registry))
;;=> my-test2Source:
(defn register-test!
[name test-fn]
(intern-var! 'logos.test/test-registry (cons (list name test-fn) test-registry)))run-one-test
fn -- (run-one-test name test-fn)
Spawns test-fn (registered under name) in its own monitored process and blocks for its result: (:pass name) if it exits normally, (:fail name reason) for any other exit reason. Uses normal-exit?, not (= reason :normal) -- a :DOWN reason is a raw Elixir term (the bare atom :normal on a clean exit), not a value Logos source can construct or =-compare against directly.
Example:
(require '[logos.test :refer [:all]])
(run-one-test 'ok-test (fn [] (assert true)))
;;=> (:pass ok-test)Source:
(defn run-one-test
[name test-fn]
(let [spawned (spawn-monitor test-fn)
pid (first spawned)]
(receive [msg]
((and (= (first msg) :DOWN) (= (first (rest (rest (rest msg)))) pid))
(let [reason (first (rest (rest (rest (rest msg)))))]
(if (normal-exit? reason) (list :pass name) (list :fail name reason)))))))run-tests
fn -- (run-tests)
Runs every deftest-registered test (in registration order), each isolated in its own process, and returns a summary map: {:total n :passed n :failed (list of (name reason) pairs)}. Built with assoc, not a {...} map literal -- unlike Clojure, a Logos map literal's elements are never evaluated (self-evaluating, element-wise, like every other collection literal -- see Logos.Eval's moduledoc), so {:total (count results)} would embed the literal, unevaluated form (count results) as the value rather than actually calling count.
Example:
(require '[logos.test :refer [:all]])
(deftest ok-test (assert true))
(run-tests)
;;=> {:failed () :passed 1 :total 1}Source:
(defn run-tests
[]
(let [entries (reverse test-registry)
results (map (fn [entry] (run-one-test (first entry) (first (rest entry)))) entries)
failed (filter (fn [r] (= (first r) :fail)) results)
passed-count (count (filter (fn [r] (= (first r) :pass)) results))
failed-summary (map (fn [r] (list (first (rest r)) (first (rest (rest r))))) failed)]
(assoc {} :total (count results) :passed passed-count :failed failed-summary)))test-registry
var
Every deftest-registered test, as a list of (name test-fn) pairs, most recently registered first. Re-deftesting the same name adds a second entry rather than replacing the first -- both run.
Example:
(require '[logos.test :refer [:all]])
(deftest reg-test (assert true))
(first (first test-registry))
;;=> reg-testSource:
(def test-registry
())