| <a id="top"></a> | |
| # Contributing to Catch2 | |
| **Contents**<br> | |
| [Using Git(Hub)](#using-github)<br> | |
| [Testing your changes](#testing-your-changes)<br> | |
| [Writing documentation](#writing-documentation)<br> | |
| [Writing code](#writing-code)<br> | |
| [CoC](#coc)<br> | |
| So you want to contribute something to Catch2? That's great! Whether it's | |
| a bug fix, a new feature, support for additional compilers - or just | |
| a fix to the documentation - all contributions are very welcome and very | |
| much appreciated. Of course so are bug reports, other comments, and | |
| questions, but generally it is a better idea to ask questions in our | |
| [Discord](https://discord.gg/4CWS9zD), than in the issue tracker. | |
| This page covers some guidelines and helpful tips for contributing | |
| to the codebase itself. | |
| ## Using Git(Hub) | |
| Ongoing development happens in the `v2.x` branch for Catch2 v2, and in | |
| `devel` for the next major version, v3. | |
| Commits should be small and atomic. A commit is atomic when, after it is | |
| applied, the codebase, tests and all, still works as expected. Small | |
| commits are also preferred, as they make later operations with git history, | |
| whether it is bisecting, reverting, or something else, easier. | |
| _When submitting a pull request please do not include changes to the | |
| single include. This means do not include them in your git commits!_ | |
| When addressing review comments in a MR, please do not rebase/squash the | |
| commits immediately. Doing so makes it harder to review the new changes, | |
| slowing down the process of merging a MR. Instead, when addressing review | |
| comments, you should append new commits to the branch and only squash | |
| them into other commits when the MR is ready to be merged. We recommend | |
| creating new commits with `git commit --fixup` (or `--squash`) and then | |
| later squashing them with `git rebase --autosquash` to make things easier. | |
| ## Testing your changes | |
| _Note: Running Catch2's tests requires Python3_ | |
| Catch2 has multiple layers of tests that are then run as part of our CI. | |
| The most obvious one are the unit tests compiled into the `SelfTest` | |
| binary. These are then used in "Approval tests", which run (almost) all | |
| tests from `SelfTest` through a specific reporter and then compare the | |
| generated output with a known good output ("Baseline"). By default, new | |
| tests should be placed here. | |
| However, not all tests can be written as plain unit tests. For example, | |
| checking that Catch2 orders tests randomly when asked to, and that this | |
| random ordering is subset-invariant, is better done as an integration | |
| test using an external check script. Catch2 integration tests are written | |
| using CTest, either as a direct command invocation + pass/fail regex, | |
| or by delegating the check to a Python script. | |
| There are also two more kinds of tests, examples and "ExtraTests". | |
| Examples serve as a compilation test on the single-header distribution, | |
| and present a small and self-contained snippets of using Catch2 for | |
| writing tests. ExtraTests then are tests that either take a long time | |
| to run, or require separate compilation, e.g. because of testing compile | |
| time configuration options, and take a long time because of that. | |
| Both of these are compiled against the single-header distribution of | |
| Catch2, and thus might require you to regenerate it manually. This is | |
| done by calling the `generateSingleHeader.py` script in `scripts`. | |
| Examples and ExtraTests are not compiled by default. To compile them, | |
| add `-DCATCH_BUILD_EXAMPLES=ON` and `-DCATCH_BUILD_EXTRA_TESTS=ON` to | |
| the invocation of CMake configuration step. | |
| Bringing this all together, the steps below should configure, build, | |
| and run all tests in the `Debug` compilation. | |
| 1. Regenerate the single header distribution | |
| ``` | |
| $ cd Catch2 | |
| $ ./scripts/generateSingleHeader.py | |
| ``` | |
| 2. Configure the full test build | |
| ``` | |
| $ cmake -Bdebug-build -H. -DCMAKE_BUILD_TYPE=Debug -DCATCH_BUILD_EXAMPLES=ON -DCATCH_BUILD_EXTRA_TESTS=ON | |
| ``` | |
| 3. Run the actual build | |
| ``` | |
| $ cmake --build debug-build | |
| ``` | |
| 4. Run the tests using CTest | |
| ``` | |
| $ cd debug-build | |
| $ ctest -j 4 --output-on-failure -C Debug | |
| ``` | |
| ## Writing documentation | |
| If you have added new feature to Catch2, it needs documentation, so that | |
| other people can use it as well. This section collects some technical | |
| information that you will need for updating Catch2's documentation, and | |
| possibly some generic advise as well. | |
| ### Technicalities | |
| First, the technicalities: | |
| * If you have introduced a new document, there is a simple template you | |
| should use. It provides you with the top anchor mentioned to link to | |
| (more below), and also with a backlink to the top of the documentation: | |
| ```markdown | |
| <a id="top"></a> | |
| # Cool feature | |
| Text that explains how to use the cool feature. | |
| --- | |
| [Home](Readme.md#top) | |
| ``` | |
| * Crosslinks to different pages should target the `top` anchor, like this | |
| `[link to contributing](contributing.md#top)`. | |
| * We introduced version tags to the documentation, which show users in | |
| which version a specific feature was introduced. This means that newly | |
| written documentation should be tagged with a placeholder, that will | |
| be replaced with the actual version upon release. There are 2 styles | |
| of placeholders used through the documentation, you should pick one that | |
| fits your text better (if in doubt, take a look at the existing version | |
| tags for other features). | |
| * `> [Introduced](link-to-issue-or-PR) in Catch X.Y.Z` - this | |
| placeholder is usually used after a section heading | |
| * `> X (Y and Z) was [introduced](link-to-issue-or-PR) in Catch X.Y.Z` | |
| - this placeholder is used when you need to tag a subpart of something, | |
| e.g. a list | |
| * For pages with more than 4 subheadings, we provide a table of contents | |
| (ToC) at the top of the page. Because GitHub markdown does not support | |
| automatic generation of ToC, it has to be handled semi-manually. Thus, | |
| if you've added a new subheading to some page, you should add it to the | |
| ToC. This can be done either manually, or by running the | |
| `updateDocumentToC.py` script in the `scripts/` folder. | |
| ### Contents | |
| Now, for some content tips: | |
| * Usage examples are good. However, having large code snippets inline | |
| can make the documentation less readable, and so the inline snippets | |
| should be kept reasonably short. To provide more complex compilable | |
| examples, consider adding new .cpp file to `examples/`. | |
| * Don't be afraid to introduce new pages. The current documentation | |
| tends towards long pages, but a lot of that is caused by legacy, and | |
| we know that some of the pages are overly big and unfocused. | |
| * When adding information to an existing page, please try to keep your | |
| formatting, style and changes consistent with the rest of the page. | |
| * Any documentation has multiple different audiences, that desire | |
| different information from the text. The 3 basic user-types to try and | |
| cover are: | |
| * A beginner to Catch2, who requires closer guidance for the usage of Catch2. | |
| * Advanced user of Catch2, who want to customize their usage. | |
| * Experts, looking for full reference of Catch2's capabilities. | |
| ## Writing code | |
| If want to contribute code, this section contains some simple rules | |
| and tips on things like code formatting, code constructions to avoid, | |
| and so on. | |
| ### Formatting | |
| To make code formatting simpler for the contributors, Catch2 provides | |
| its own config for `clang-format`. However, because it is currently | |
| impossible to replicate existing Catch2's formatting in clang-format, | |
| using it to reformat a whole file would cause massive diffs. To keep | |
| the size of your diffs reasonable, you should only use clang-format | |
| on the newly changed code. | |
| ### Code constructs to watch out for | |
| This section is a (sadly incomplete) listing of various constructs that | |
| are problematic and are not always caught by our CI infrastructure. | |
| #### Naked exceptions and exceptions-related function | |
| If you are throwing an exception, it should be done via `CATCH_ERROR` | |
| or `CATCH_RUNTIME_ERROR` in `catch_enforce.h`. These macros will handle | |
| the differences between compilation with or without exceptions for you. | |
| However, some platforms (IAR) also have problems with exceptions-related | |
| functions, such as `std::current_exceptions`. We do not have IAR in our | |
| CI, but luckily there should not be too many reasons to use these. | |
| However, if you do, they should be kept behind a | |
| `CATCH_CONFIG_DISABLE_EXCEPTIONS` macro. | |
| #### Unqualified usage of functions from C's stdlib | |
| If you are using a function from C's stdlib, please include the header | |
| as `<cfoo>` and call the function qualified. The common knowledge that | |
| there is no difference is wrong, QNX and VxWorks won't compile if you | |
| include the header as `<cfoo>` and call the function unqualified. | |
| ## CoC | |
| This project has a [CoC](../CODE_OF_CONDUCT.md). Please adhere to it | |
| while contributing to Catch2. | |
| ----------- | |
| _This documentation will always be in-progress as new information comes | |
| up, but we are trying to keep it as up to date as possible._ | |
| --- | |
| [Home](Readme.md#top) | |