# Stan Test Structure

Just need a bit of help making sure that I understand how the math tests are structured, or how they should be structured in an ideal world, plus a couple of questions. Let me know if I’m completely off here (obvious questions may follow).

Based on the guide in the wiki:

`test/unit/math/mix/mat/util/autodiff_tester.hpp`
Implements the reverse, forward, and mixed autodiff tests for a 1- or 2-parameter function. But still requires a test in `test/unit/math/prim` to test that the correct values are returned by the function.

• If a function has a test specified with this framework, does that mean they don’t need tests in `rev` or `fwd`?
• If the function has analytic derivatives, does that change whether/how this testing framework is used?
• Are there limitations on the kinds of functions that can use this framework?

Next there are the frameworks for testing the vectorized versions of unary functions (i.e. `*/mat/`:

``````test/unit/math/prim/mat/vectorize/prim_scalar_unary_test.hpp
test/unit/math/rev/mat/vectorize/rev_scalar_unary_test.hpp
test/unit/math/fwd/mat/vectorize/fwd_scalar_unary_test.hpp
test/unit/math/mix/mat/vectorize/mix_scalar_unary_test.hpp
``````

These only test whether the vectorization process has affected the function in some way, and still requires tests for the function in `*/scal/`

For all other cases, a function needs to have a test in `prim`, `fwd`, `rev`, and `mix`

Have I missed anything?

Correct.

No.

There shouldn’t be, but if there are, we want to build out the testing framework to cope. I’ve just been building it out as I go.

The real goal here is to get all the forward-mode autodiff tested, then turn on Riemannian HMC.

Yes.

I think the vectorized tests probably cover the scalar case, too, but I’m not 100% sure.