This file describes how the dune test suite is organized.

# Unit testing

The `unit-tests` directory contains unit tests, written in expectation
style. The test logic is implemented in `unit-tests/expect_test.mll`
and the various tests are in `.mlt` files.

The way they work is quite simple; each `.mlt` file is a succession of
toplevel phrases followed by the output reported by the OCaml toplevel
enclosed in an `[%%expect]` extension point. For instance:

```ocaml
6 * 7;;
[%%expect{|
- : int = 42
|}]
```

# Blackbox testing

The `blackbox-tests` contains blackbox tests. I.e. we are testing the
fully built `dune` executable on various example projects.

The tests are written in [cram](https://bitheap.org/cram/) style. The
logic is implemented in `blackbox-tests/cram.mll`. It only implements
a minimal subset of cram testing. In particular the shell environment
is currently not preserved between commands, so you cannot define a
variable and use it.

Test cases are in `blackbox-tests/test-cases`. Each sub-directory is a
full blown dune project. Each sub-directory contains a `run.t`
file, which represents a few invocations of dune along with the
expected output.

Here is a sample `.t` file:

```
This is a comment

  $ echo 'Hello, world!'
  Hello, world!

  $ cat plop
  cat: plop: No such file or directory
  [1]

The [1] represent the exit code of the command. It is printed when it
is non-zero
```
