Testing¶
Radicle provides a :test
macro which allows you to write tests next
to your code.
(def not
(fn [x] (if x #f #t)))
(:test "not"
[ (not #t) ==> #f ]
[ (not #f) ==> #t ]
)
The test/prelude.rad
script runs all tests defined in the prelude.
Test Definition¶
Each test definition consists of a test name and a list of steps
(:test "my test" step1 step2 ...)
Each step is a vector triple with the symbol ==>
in the middle. For
example
[ (not #t) ==> #f ]
When a test step is run the value left of ==>
is evaluated in the
environment captured at the definition site of the test. The resulting value is
then compared with the right-hand side. The test passes if both are
equal. The right-hand side is not evaluated.
If the evaluation of the left-hand side throws an error the test fails with the message produced by the error.
Changes to reference in a test step evaluation have no effect and all tests steps are run independently.
Test Setup¶
There is a special setup test step that allows you to change the environment that tests steps run in.
(:test "with setup"
[ :setup (do
(def foo 5)
)]
[ (+ foo 2) ==> 7 ]
[ (- foo 2) ==> 3 ]
)
Similar to test steps the body of the :setup
step is evaluated in
the environment of the definition site. Changes to the environment
introduced by evaluating the setup code are then available in all test
steps.
Running Tests¶
All tests defined with the :test
macro are collected in the tests
reference. Tests can be executed using the run-all
function from
the prelude/test
module.