# Tests ## Directory structure Top level directory structure: - `src`: Testing code. - `suite`: Input files. Mostly organized in parallel to the code. Each file can contain multiple tests, each of which is a section of Typst code following `--- {name} ---`. - `ref`: References which the output is compared with to determine whether a test passed or failed. - `store`: Store for PNG, PDF, and SVG output files produced by the tests. ## Running the tests Running all tests (including unit tests): ```bash cargo test --workspace ``` Running just the integration tests (the tests in this directory): ```bash cargo test --workspace --test tests ``` You may want to [make yourself an alias](#making-an-alias) `testit` so that you can write shorter commands. In the examples below, we will use this alias. Running all tests with the given name pattern. You can use [regular expression](https://docs.rs/regex/latest/regex/)s. ```bash testit math # The name has "math" anywhere testit math page # The name has "math" or "page" anywhere testit "^math" "^page" # The name begins with "math" or "page" testit "^(math|page)" # Same as above. ``` Running all tests discovered under given paths: ```bash testit -p tests/suite/math/attach.typ testit -p tests/suite/model -p tests/suite/text ``` Running tests that begin with `issue` under a given path: ```bash testit "^issue" -p tests/suite/model ``` Running a test with the exact test name `math-attach-mixed`. ```bash testit --exact math-attach-mixed ``` You may find more options in the help message: ```bash testit --help ``` To make the integration tests go faster they don't generate PDFs or SVGs by default. Pass the `--pdf` or `--svg` flag to generate those. Mind that PDFs and SVGs are **not** tested automatically at the moment, so you should always check the output manually when making changes. ```bash testit --pdf ``` ## Writing tests The syntax for an individual test is `--- {name} {attr}* ---` followed by some Typst code that should be tested. The name must be globally unique in the test suite, so that tests can be easily migrated across files. A test name can be followed by space-separated attributes. For instance, `--- my-test html ---` adds the `html` modifier to `my-test`, instructing the test runner to also test HTML output. The following attributes are currently defined: - `render`: Tests paged output against a reference image (the default, only needs to be specified when `html` is also specified to enable both at the same) - `html`: Tests HTML output against a reference HTML file. Disables the `render` default. - `large`: Permits a reference image size exceeding 20 KiB. Should be used sparingly. There are, broadly speaking, three kinds of tests: - Tests that just ensure that the code runs successfully: Those typically make use of `test` or `assert.eq` (both are very similar, `test` is just shorter) to ensure certain properties hold when executing the Typst code. - Tests that ensure the code emits particular diagnostic messages: Those have inline annotations like `// Error: 2-7 thing was wrong`. An annotation can start with either "Error", "Warning", or "Hint". The range designates the code span the diagnostic message refers to in the first non-comment line below. If the code span is in a line further below, you can write ranges like `3:2-3:7` to indicate the 2-7 column in the 3rd non-comment line. - Tests that ensure certain output is produced: - Visual output: By default, the compiler produces paged output, renders it with the `typst-render` crate, and compares it against a reference image stored in the repository. The test runner automatically detects whether a test has visual output and requires a reference image in this case. To prevent bloat, it is important that the test images are kept as small as possible. To that effect, the test runner enforces a maximum size of 20 KiB. If you're updating a test and hit `reference output size exceeds`, see the section on "Updating reference images" below. If truly necessary, the size limit can be lifted by adding a `large` attribute after the test name, but this should be the case very rarely. - HTML output: When a test has the `html` attribute, the compiler produces HTML output and compares it against a reference file stored in the repository. By default, this enables testing of paged output, but you can test both at once by passing both `render` and `html` as attributes. If you have the choice between writing a test using assertions or using reference images, prefer assertions. This makes the test easier to understand in isolation and prevents bloat due to images. ## Updating reference images If you created a new test or fixed a bug in an existing test, you may need to update the reference output used for comparison. For this, you can use the `--update` flag: ```bash testit --exact my-test-name --update ``` For visual tests, this will generally generate compressed reference images (to remain within the size limit). If you use the VS Code test helper extension (see the `tools` folder), you can alternatively use the save button to update the reference output. ## Making an alias If you want to have a quicker way to run the tests, consider adding a shortcut to your shell profile so that you can simply write something like: ```bash testit --exact my-test-name ``` ### Bash Open your Bash configuration by executing `nano ~/.bashrc`. ```bash alias testit="cargo test --workspace --test tests --" ``` ### PowerShell Open your PowerShell profile by executing `notepad $profile`. ```ps function testit { cargo test --workspace --test tests -- $args } ```