| # Unit Testing | |
| You can run the unit tests after completing a build using the following: | |
| After [building lean](../make/index.md) you can run all the tests using | |
| ``` | |
| cd build/release | |
| make test ARGS=-j4 | |
| ``` | |
| Change the 4 to the maximum number of parallel tests you want to | |
| allow. The best choice is the number of CPU cores on your machine as | |
| the tests are mostly CPU bound. You can find the number of processors | |
| on linux using `nproc` and on Windows it is the `NUMBER_OF_PROCESSORS` | |
| environment variable. | |
| You can run tests after [building a specific stage](bootstrap.md) by | |
| adding the `-C stageN` argument. The default when run as above is stage 1. The | |
| Lean tests will automatically use that stage's corresponding Lean | |
| executables | |
| You can also use `ctest` directly if you are in the right folder. So | |
| to run stage1 tests with a 300 second timeout run this: | |
| ```bash | |
| cd build/release/stage1 | |
| ctest -j 4 --output-on-failure --timeout 300 | |
| ``` | |
| To get verbose output from ctest pass the `--verbose` command line | |
| option. Test output is normally suppressed and only summary | |
| information is displayed. This option will show all test output | |
| Here is the summary of the test source code organization. | |
| All these tests are included by [/src/shell/CMakeLists.txt](https://github.com/leanprover/lean4/blob/master/src/shell/CMakeLists.txt): | |
| - `tests/lean`: contains tests that come equipped with a | |
| .lean.expected.out file. The driver script `test_single.sh` runs | |
| each test and checks the actual output (*.produced.out) with the | |
| checked in expected output. | |
| - `tests/lean/run`: contains tests that are run through the lean | |
| command line one file at a time. These tests only look for error | |
| codes and do not check the expected output even though output is | |
| produced, it is ignored. | |
| - `tests/lean/interactive`: are designed to test server requests at a | |
| given position in the input file. Each .lean file contains comments | |
| that indicate how to simulate a client request at that position. | |
| using a `--^` point to the line position. Example: | |
| ```lean,ignore | |
| open Foo in | |
| theorem tst2 (h : a ≤ b) : a + 2 ≤ b + 2 := | |
| Bla. | |
| --^ textDocument/completion | |
| ``` | |
| In this example, the test driver `test_single.sh` will simulate an | |
| auto-completion request at `Bla.`. The expected output is stored in | |
| a .lean.expected.out in the json format that is part of the | |
| [Language Server | |
| Protocol](https://microsoft.github.io/language-server-protocol/). | |
| This can also be used to test the following additional requests: | |
| ``` | |
| --^ textDocument/hover | |
| --^ textDocument/typeDefinition | |
| --^ textDocument/definition | |
| --^ $/lean/plainGoal | |
| --^ $/lean/plainTermGoal | |
| --^ insert: ... | |
| --^ collectDiagnostics | |
| ``` | |
| - `tests/lean/server`: Tests more of the Lean `--server` protocol. | |
| There are just a few of them, and it uses .log files containing | |
| JSON. | |
| - `tests/compiler`: contains tests that will run the Lean compiler and | |
| build an executable that is executed and the output is compared to | |
| the .lean.expected.out file. This test also contains a subfolder | |
| `foreign` which shows how to extend Lean using C++. | |
| - `tests/lean/trust0`: tests that run Lean in a mode that Lean doesn't | |
| even trust the .olean files (i.e., trust 0). | |
| - `tests/bench`: contains performance tests. | |
| - `tests/plugin`: tests that compiled Lean code can be loaded into | |
| `lean` via the `--plugin` command line option. |