# 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.