A modern, C++-native, test framework for unit-tests, TDD and BDD - using C++14, C++17 and later (C++11 support is in v2.x branch, and C++03 on the Catch1.x branch)
Go to file
Martin Hořeňovský 28e651f152
Move SFINAE in decomposer into return type
This is needed so that we can use conjunction and other logical
type traits to workaround issue with older GCC versions (8 and
below), when they run into types that have ambiguous constructor
from `0`, see e.g. #2571.

However, using conjunction and friends in the SFINAE constraint
in the template parameter breaks for C++20 and up, due to the new
comparison operator rewriting rules. With C++20, when the compiler
see `a == b`, it also tries `b == a` and collects overload set
for both of these expressions.

In Catch2, this means that e.g. `REQUIRE( 1 == 2 )` would lead
the compiler to check overloads for both `ExprLhs<int> == int`
and `int == ExprLhs<int>`. Since the overload set and SFINAE
constraints assume that `ExprLhs<T>` is always on the left side,
when the compiler tries to resolve the template parameters, all
hell breaks loose and the compilation fails.

By moving the SFINAE constraints to the return type, the compiler
can discard the switched expression without having to resolve
the complex SFINAE constraints, and thus everything works the
way it is supposed to.

Fixes #2571
2022-12-09 00:40:01 +01:00
.conan Add support for Components 2020-11-02 15:37:35 +01:00
.github Add Clang-10 and GCC-10 C++20 builds 2022-11-22 16:17:18 +01:00
CMake Add support for PlayStation platforms (#2562) 2022-11-09 14:47:55 +01:00
data/artwork Use logo with bit of white background in README 2022-11-22 16:13:37 +01:00
docs v3.2.0 2022-11-16 20:05:48 +01:00
examples Don't set C++ standard in CMakeLists for tests 2022-10-29 21:04:58 +02:00
extras v3.2.0 2022-11-16 20:05:48 +01:00
fuzzing add fuzzer for columns 2020-10-07 17:38:27 +02:00
src Move SFINAE in decomposer into return type 2022-12-09 00:40:01 +01:00
tests Move SFINAE in decomposer into return type 2022-12-09 00:40:01 +01:00
third_party fixing UB 2020-07-22 17:17:33 +02:00
tools Cleanup the helper scripts 2022-11-06 21:23:16 +01:00
.bazelrc Make Bazel work with CATCH_CONFIG_SHARED_LIBRARY 2022-09-27 22:06:12 +02:00
.clang-format Improve the .clang-format file a bit 2022-11-07 23:14:29 +01:00
.gitattributes Update gitattributes 2018-07-23 10:15:52 +02:00
.gitignore Add support for building with Meson (#2530) 2022-10-01 23:28:30 +02:00
appveyor.yml Add tests for CMake configure toggles passing to Catch2 build 2022-02-20 19:32:30 +01:00
BUILD.bazel Fix Bazel build (#2563) 2022-11-11 16:54:22 +01:00
CMakeLists.txt v3.2.0 2022-11-16 20:05:48 +01:00
CMakePresets.json Add basic CMake presets 2022-02-22 15:47:11 +01:00
CODE_OF_CONDUCT.md Create CODE_OF_CONDUCT.md 2017-08-17 07:45:12 +01:00
codecov.yml Sweep out two leftover references to master 2020-10-23 23:02:44 +02:00
conanfile.py Add lib/cmake/Catch2 to conan builddirs in package recipe so extras/*.cmake files are packaged 2022-06-15 10:50:24 +02:00
Doxyfile Simple Doxygen file 2020-11-26 18:43:31 +01:00
LICENSE.txt Renamed licence file, license should now be detected by github 2017-03-20 08:59:25 +01:00
mdsnippets.json Add infrastructure for embedding code samples in docs. 2020-10-28 11:38:06 +01:00
meson.build v3.2.0 2022-11-16 20:05:48 +01:00
README.md Use logo with bit of white background in README 2022-11-22 16:13:37 +01:00
SECURITY.md Add SECURITY.md 2021-11-26 00:10:01 +01:00
WORKSPACE.bazel Bazel build: Update of skylib 2022-09-27 22:06:12 +02:00

Catch2 logo

Github Releases Linux build status Linux build status MacOS build status Build Status Code Coverage Try online Join the chat in Discord: https://discord.gg/4CWS9zD

What is Catch2?

Catch2 is mainly a unit testing framework for C++, but it also provides basic micro-benchmarking features, and simple BDD macros.

Catch2's main advantage is that using it is both simple and natural. Test names do not have to be valid identifiers, assertions look like normal C++ boolean expressions, and sections provide a nice and local way to share set-up and tear-down code in tests.

Example unit test

#include <catch2/catch_test_macros.hpp>

#include <cstdint>

uint32_t factorial( uint32_t number ) {
    return number <= 1 ? number : factorial(number-1) * number;
}

TEST_CASE( "Factorials are computed", "[factorial]" ) {
    REQUIRE( factorial( 1) == 1 );
    REQUIRE( factorial( 2) == 2 );
    REQUIRE( factorial( 3) == 6 );
    REQUIRE( factorial(10) == 3'628'800 );
}

Example microbenchmark

#include <catch2/catch_test_macros.hpp>
#include <catch2/benchmark/catch_benchmark.hpp>

#include <cstdint>

uint64_t fibonacci(uint64_t number) {
    return number < 2 ? 1 : fibonacci(number - 1) + fibonacci(number - 2);
}

TEST_CASE("Benchmark Fibonacci", "[!benchmark]") {
    REQUIRE(Fibonacci(5) == 5);

    REQUIRE(Fibonacci(20) == 6'765);
    BENCHMARK("Fibonacci 20") {
        return Fibonacci(20);
    };

    REQUIRE(Fibonacci(25) == 75'025);
    BENCHMARK("Fibonacci 25") {
        return Fibonacci(25);
    };
}

Catch2 v3 has been released!

You are on the devel branch, where the v3 version is being developed. v3 brings a bunch of significant changes, the big one being that Catch2 is no longer a single-header library. Catch2 now behaves as a normal library, with multiple headers and separately compiled implementation.

The documentation is slowly being updated to take these changes into account, but this work is currently still ongoing.

For migrating from the v2 releases to v3, you should look at our documentation. It provides a simple guidelines on getting started, and collects most common migration problems.

For the previous major version of Catch2 look into the v2.x branch here on GitHub.

How to use it

This documentation comprises these three parts:

More