Compare commits
96 Commits
v3.8.1
...
devel-c++1
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8efee9b763 | ||
![]() |
a5735af2f7 | ||
![]() |
db46dc4cb2 | ||
![]() |
c6cefc6596 | ||
![]() |
dc3a4ea41a | ||
![]() |
cd93d202e0 | ||
![]() |
227af796b4 | ||
![]() |
33adb4c779 | ||
![]() |
25319fd304 | ||
![]() |
85c4bad86b | ||
![]() |
582200a1f8 | ||
![]() |
f4e05a67bb | ||
![]() |
fb2e4fbe41 | ||
![]() |
78a9518a28 | ||
![]() |
3e82ef9317 | ||
![]() |
7cad6d7539 | ||
![]() |
644821ce28 | ||
![]() |
03c62cdf2e | ||
![]() |
9a3d68315b | ||
![]() |
bcd4116df7 | ||
![]() |
9b3f508a1b | ||
![]() |
c5e0ef4e67 | ||
![]() |
17fe5eaa5c | ||
![]() |
fbfd13501c | ||
![]() |
ccabd4de89 | ||
![]() |
a1c7ee115f | ||
![]() |
d547cae549 | ||
![]() |
fee81626d2 | ||
![]() |
b6c5a635bb | ||
![]() |
4ed3088190 | ||
![]() |
bdc634e9f1 | ||
![]() |
2a8a8a7210 | ||
![]() |
900a6d5516 | ||
![]() |
1aa6fa215c | ||
![]() |
5aa8d11321 | ||
![]() |
9c5c21df82 | ||
![]() |
10aef62f21 | ||
![]() |
98b4bbb35e | ||
![]() |
8c3ffe05e1 | ||
![]() |
715558fd97 | ||
![]() |
55b14e1b34 | ||
![]() |
ce128f584c | ||
![]() |
db6171a706 | ||
![]() |
c22096846c | ||
![]() |
ae33e5b99a | ||
![]() |
0e8112a762 | ||
![]() |
9be81c0e05 | ||
![]() |
efcb76874e | ||
![]() |
895b8af6bd | ||
![]() |
066f00acf5 | ||
![]() |
1b72e45354 | ||
![]() |
f7968e9697 | ||
![]() |
3ebc346bcb | ||
![]() |
a483b6d7d3 | ||
![]() |
b9c018b38a | ||
![]() |
050e14dce0 | ||
![]() |
6097bd6ee9 | ||
![]() |
b62413aee3 | ||
![]() |
3839e27f05 | ||
![]() |
39c32b9662 | ||
![]() |
2de12cb05f | ||
![]() |
8dc9f1a124 | ||
![]() |
038ee6ea13 | ||
![]() |
bd2d918f32 | ||
![]() |
d134b0cae3 | ||
![]() |
ceed26842b | ||
![]() |
04cbcfa1d1 | ||
![]() |
416b075211 | ||
![]() |
334827eb53 | ||
![]() |
ac207fc90f | ||
![]() |
1de7d0ed7b | ||
![]() |
65cd203926 | ||
![]() |
3013cb897b | ||
![]() |
74fcff6e5b | ||
![]() |
5abfc0aa9c | ||
![]() |
1e7b879fae | ||
![]() |
4ff57aba42 | ||
![]() |
dde8220613 | ||
![]() |
cecb02e68f | ||
![]() |
66085dac55 | ||
![]() |
5a6d70eebb | ||
![]() |
10d1a2750c | ||
![]() |
c17d69f813 | ||
![]() |
4c93a595a1 | ||
![]() |
e8f4b60e62 | ||
![]() |
371b11b5a8 | ||
![]() |
8039e3ea1e | ||
![]() |
1d3bfb324d | ||
![]() |
5c97a8583d | ||
![]() |
8cfca70ae8 | ||
![]() |
6aac11e17d | ||
![]() |
ec571515c8 | ||
![]() |
edb6f80867 | ||
![]() |
25b86ef3fd | ||
![]() |
4c8671cfbb | ||
![]() |
5b3b228603 |
4
.bazelrc
@@ -1,10 +1,8 @@
|
||||
# Enable Bzlmod for every Bazel command
|
||||
common --enable_bzlmod
|
||||
|
||||
build --enable_platform_specific_config
|
||||
|
||||
build:gcc9 --cxxopt=-std=c++2a
|
||||
build:gcc11 --cxxopt=-std=c++2a
|
||||
build:gcc13 --cxxopt=-std=c++2a
|
||||
build:clang13 --cxxopt=-std=c++17
|
||||
build:vs2019 --cxxopt=/std:c++17
|
||||
build:vs2022 --cxxopt=/std:c++17
|
||||
|
@@ -1,6 +1,6 @@
|
||||
---
|
||||
Language: Cpp
|
||||
Standard: c++14
|
||||
Standard: c++17
|
||||
|
||||
# Note that we cannot use IncludeIsMainRegex functionality, because it
|
||||
# does not support includes in angle brackets (<>)
|
||||
|
@@ -28,13 +28,12 @@ Checks: >-
|
||||
-modernize-concat-nested-namespaces,
|
||||
-modernize-use-nodiscard,
|
||||
-modernize-use-default-member-init,
|
||||
-modernize-type-traits,# we need to support C++14,
|
||||
-modernize-deprecated-headers,
|
||||
,# There's a lot of these and most of them are probably not useful,
|
||||
-modernize-pass-by-value,
|
||||
|
||||
performance-*,
|
||||
performance-enum-size,
|
||||
-performance-enum-size,
|
||||
|
||||
portability-*,
|
||||
|
||||
|
@@ -1,8 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(PackageTest CXX)
|
||||
project(PackageTest LANGUAGES CXX)
|
||||
|
||||
find_package(Catch2 CONFIG REQUIRED)
|
||||
|
||||
add_executable(test_package test_package.cpp)
|
||||
target_link_libraries(test_package Catch2::Catch2WithMain)
|
||||
target_compile_features(test_package PRIVATE cxx_std_14)
|
||||
|
10
.github/workflows/linux-bazel-builds.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: Bazel build
|
||||
name: Linux Builds (Bazel)
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
@@ -7,18 +7,18 @@ jobs:
|
||||
name: Linux Ubuntu 22.04 Bazel build <GCC 11.2.0>
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
compilation_mode: [fastbuild, dbg, opt]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Mount bazel cache
|
||||
- name: Mount Bazel cache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: "/home/runner/.cache/bazel"
|
||||
key: bazel-ubuntu22-gcc11
|
||||
|
||||
- name: Build Catch2
|
||||
run: |
|
||||
bazelisk build --compilation_mode=${{matrix.compilation_mode}} //...
|
||||
- name: Build
|
||||
run: bazelisk build --compilation_mode=${{matrix.compilation_mode}} //...
|
||||
|
17
.github/workflows/linux-meson-builds.yml
vendored
@@ -1,18 +1,18 @@
|
||||
name: Linux builds (meson)
|
||||
name: Linux Builds (Meson)
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: meson ${{matrix.cxx}}, C++${{matrix.std}}, ${{matrix.build_type}}
|
||||
name: meson ${{matrix.cxx}}, ${{matrix.build_type}}
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
cxx:
|
||||
- g++-11
|
||||
- clang++-11
|
||||
build_type: [debug, release]
|
||||
std: [14, 17]
|
||||
include:
|
||||
- cxx: clang++-11
|
||||
other_pkgs: clang-11
|
||||
@@ -25,20 +25,19 @@ jobs:
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y meson ninja-build ${{matrix.other_pkgs}}
|
||||
|
||||
- name: Configure build
|
||||
- name: Configure
|
||||
env:
|
||||
CXX: ${{matrix.cxx}}
|
||||
CXXFLAGS: -std=c++${{matrix.std}} ${{matrix.cxxflags}}
|
||||
CXXFLAGS: -std=c++17 ${{matrix.cxxflags}}
|
||||
# Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}.
|
||||
# This is important
|
||||
run: |
|
||||
meson -Dbuildtype=${{matrix.build_type}} ${{runner.workspace}}/meson-build
|
||||
|
||||
- name: Build tests + lib
|
||||
- name: Build
|
||||
working-directory: ${{runner.workspace}}/meson-build
|
||||
run: ninja
|
||||
|
||||
- name: Run tests
|
||||
- name: Test
|
||||
working-directory: ${{runner.workspace}}/meson-build
|
||||
run: |
|
||||
meson test --verbose
|
||||
run: meson test --verbose
|
||||
|
133
.github/workflows/linux-other-builds.yml
vendored
@@ -1,72 +1,59 @@
|
||||
# The builds in this file are more complex (e.g. they need custom CMake
|
||||
# configuration) and thus are unsuitable to the simple build matrix
|
||||
# approach used in simple-builds
|
||||
name: Linux builds (complex)
|
||||
name: Linux Builds (Complex)
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: ${{matrix.build_description}}, ${{matrix.cxx}}, C++${{matrix.std}} ${{matrix.build_type}}
|
||||
runs-on: ubuntu-20.04
|
||||
name: ${{matrix.build_description}}, ${{matrix.cxx}}, ${{matrix.build_type}}
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# We add builds one by one in this case, because there are no
|
||||
# dimensions that are shared across the builds
|
||||
include:
|
||||
|
||||
# Single surrogate header build
|
||||
- cxx: clang++-10
|
||||
- cxx: clang++-14
|
||||
build_description: Surrogates build
|
||||
build_type: Debug
|
||||
std: 14
|
||||
other_pkgs: clang-10
|
||||
other_pkgs: clang-14
|
||||
cmake_configurations: -DCATCH_BUILD_SURROGATES=ON
|
||||
|
||||
# Extras and examples with gcc-7
|
||||
- cxx: g++-7
|
||||
# Extras and examples with gcc-11
|
||||
- cxx: g++-11
|
||||
build_description: Extras + Examples
|
||||
build_type: Debug
|
||||
std: 14
|
||||
other_pkgs: g++-7
|
||||
other_pkgs: g++-11
|
||||
cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
|
||||
- cxx: g++-7
|
||||
- cxx: g++-11
|
||||
build_description: Extras + Examples
|
||||
build_type: Release
|
||||
std: 14
|
||||
other_pkgs: g++-7
|
||||
other_pkgs: g++-11
|
||||
cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
|
||||
|
||||
# Extras and examples with Clang-10
|
||||
- cxx: clang++-10
|
||||
# Extras and examples with Clang-14
|
||||
- cxx: clang++-14
|
||||
build_description: Extras + Examples
|
||||
build_type: Debug
|
||||
std: 17
|
||||
other_pkgs: clang-10
|
||||
other_pkgs: clang-14
|
||||
cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
|
||||
- cxx: clang++-10
|
||||
- cxx: clang++-14
|
||||
build_description: Extras + Examples
|
||||
build_type: Release
|
||||
std: 17
|
||||
other_pkgs: clang-10
|
||||
other_pkgs: clang-14
|
||||
cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
|
||||
|
||||
# Configure tests with Clang-10
|
||||
- cxx: clang++-10
|
||||
build_description: CMake configuration tests
|
||||
build_type: Debug
|
||||
std: 14
|
||||
other_pkgs: clang-10
|
||||
cmake_configurations: -DCATCH_ENABLE_CONFIGURE_TESTS=ON
|
||||
|
||||
# Valgrind test Clang-10
|
||||
- cxx: clang++-10
|
||||
build_description: Valgrind tests
|
||||
build_type: Debug
|
||||
std: 14
|
||||
other_pkgs: clang-10 valgrind
|
||||
cmake_configurations: -DMEMORYCHECK_COMMAND=`which valgrind` -DMEMORYCHECK_COMMAND_OPTIONS="-q --track-origins=yes --leak-check=full --num-callers=50 --show-leak-kinds=definite --error-exitcode=1"
|
||||
other_ctest_args: -T memcheck -LE uses-python
|
||||
# Valgrind test Clang-14
|
||||
# - cxx: clang++-14
|
||||
# build_description: Valgrind tests
|
||||
# build_type: Debug
|
||||
# other_pkgs: clang-14 valgrind
|
||||
# cmake_configurations: -DMEMORYCHECK_COMMAND=`which valgrind` -DMEMORYCHECK_COMMAND_OPTIONS="-q --track-origins=yes --leak-check=full --num-callers=50 --show-leak-kinds=definite --error-exitcode=1"
|
||||
# other_ctest_args: -T memcheck -LE uses-python
|
||||
|
||||
|
||||
steps:
|
||||
@@ -78,77 +65,45 @@ jobs:
|
||||
sudo apt-get install -y ninja-build ${{matrix.other_pkgs}}
|
||||
|
||||
- name: Configure build
|
||||
working-directory: ${{runner.workspace}}
|
||||
env:
|
||||
CXX: ${{matrix.cxx}}
|
||||
CXXFLAGS: ${{matrix.cxxflags}}
|
||||
# Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}.
|
||||
# This is important
|
||||
run: |
|
||||
cmake -Bbuild -H$GITHUB_WORKSPACE \
|
||||
cmake --preset basic-tests -GNinja \
|
||||
-DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
|
||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
||||
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
|
||||
-DCMAKE_CXX_EXTENSIONS=OFF \
|
||||
-DCATCH_DEVELOPMENT_BUILD=ON \
|
||||
${{matrix.cmake_configurations}} \
|
||||
-G Ninja
|
||||
-DCMAKE_CXX_COMPILER=${{matrix.cxx}} \
|
||||
${{matrix.cmake_configurations}}
|
||||
|
||||
- name: Build tests + lib
|
||||
working-directory: ${{runner.workspace}}/build
|
||||
run: ninja
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
|
||||
- name: Test
|
||||
run: ctest --test-dir build -j --output-on-failure
|
||||
|
||||
- name: Run tests
|
||||
env:
|
||||
CTEST_OUTPUT_ON_FAILURE: 1
|
||||
working-directory: ${{runner.workspace}}/build
|
||||
run: ctest -C ${{matrix.build_type}} -j `nproc` ${{matrix.other_ctest_args}}
|
||||
clang-tidy:
|
||||
name: clang-tidy ${{matrix.version}}, ${{matrix.build_description}}, C++${{matrix.std}} ${{matrix.build_type}}
|
||||
name: clang-tidy
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- version: "15"
|
||||
build_description: all
|
||||
build_type: Debug
|
||||
std: 17
|
||||
other_pkgs: ''
|
||||
cmake_configurations: -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Prepare environment
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ninja-build clang-${{matrix.version}} clang-tidy-${{matrix.version}} ${{matrix.other_pkgs}}
|
||||
sudo apt-get install -y ninja-build clang-15 clang-tidy-15
|
||||
|
||||
- name: Configure build
|
||||
working-directory: ${{runner.workspace}}
|
||||
env:
|
||||
CXX: clang++-${{matrix.version}}
|
||||
CXXFLAGS: ${{matrix.cxxflags}}
|
||||
# Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}.
|
||||
# This is important
|
||||
- name: Configure
|
||||
run: |
|
||||
clangtidy="clang-tidy-${{matrix.version}};-use-color"
|
||||
clangtidy="clang-tidy-15;-use-color"
|
||||
# Use a dummy compiler/linker/ar/ranlib to effectively disable the
|
||||
# compilation and only run clang-tidy.
|
||||
cmake -Bbuild -H$GITHUB_WORKSPACE \
|
||||
-DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
|
||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
||||
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
|
||||
-DCMAKE_CXX_EXTENSIONS=OFF \
|
||||
-DCATCH_DEVELOPMENT_BUILD=ON \
|
||||
-DCMAKE_CXX_CLANG_TIDY="$clangtidy" \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=/usr/bin/true \
|
||||
cmake --preset basic-tests -GNinja \
|
||||
-DCMAKE_AR=/usr/bin/true \
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
-DCMAKE_CXX_CLANG_TIDY="$clangtidy" \
|
||||
-DCMAKE_CXX_COMPILER_AR=/usr/bin/true \
|
||||
-DCMAKE_RANLIB=/usr/bin/true \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=/usr/bin/true \
|
||||
-DCMAKE_CXX_COMPILER=clang++-15 \
|
||||
-DCMAKE_CXX_LINK_EXECUTABLE=/usr/bin/true \
|
||||
${{matrix.cmake_configurations}} \
|
||||
-G Ninja
|
||||
-DCMAKE_RANLIB=/usr/bin/true \
|
||||
-DCATCH_BUILD_EXAMPLES=ON \
|
||||
-DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
|
||||
|
||||
- name: Run clang-tidy
|
||||
working-directory: ${{runner.workspace}}/build
|
||||
run: ninja
|
||||
run: cmake --build build
|
||||
|
112
.github/workflows/linux-simple-builds.yml
vendored
@@ -1,42 +1,38 @@
|
||||
name: Linux builds (basic)
|
||||
name: Linux Builds (Basic)
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: ${{matrix.cxx}}, C++${{matrix.std}}, ${{matrix.build_type}}
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
cxx:
|
||||
- g++-5
|
||||
- g++-6
|
||||
- g++-7
|
||||
- g++-8
|
||||
- g++-9
|
||||
- g++-10
|
||||
- clang++-6.0
|
||||
- g++-11
|
||||
- g++-12
|
||||
- clang++-7
|
||||
- clang++-8
|
||||
- clang++-9
|
||||
- clang++-10
|
||||
- clang++-11
|
||||
- clang++-12
|
||||
- clang++-13
|
||||
- clang++-14
|
||||
build_type: [Debug, Release]
|
||||
std: [14]
|
||||
std: [17]
|
||||
include:
|
||||
- cxx: g++-5
|
||||
other_pkgs: g++-5
|
||||
- cxx: g++-6
|
||||
other_pkgs: g++-6
|
||||
- cxx: g++-7
|
||||
other_pkgs: g++-7
|
||||
- cxx: g++-8
|
||||
other_pkgs: g++-8
|
||||
- cxx: g++-9
|
||||
other_pkgs: g++-9
|
||||
- cxx: g++-10
|
||||
other_pkgs: g++-10
|
||||
- cxx: clang++-6.0
|
||||
other_pkgs: clang-6.0
|
||||
- cxx: g++-11
|
||||
other_pkgs: g++-11
|
||||
- cxx: g++-12
|
||||
other_pkgs: g++-12
|
||||
- cxx: clang++-7
|
||||
other_pkgs: clang-7
|
||||
- cxx: clang++-8
|
||||
@@ -45,79 +41,53 @@ jobs:
|
||||
other_pkgs: clang-9
|
||||
- cxx: clang++-10
|
||||
other_pkgs: clang-10
|
||||
# Clang 6 + C++17
|
||||
# does not work with the default libstdc++ version thanks
|
||||
# to a disagreement on variant implementation.
|
||||
# - cxx: clang++-6.0
|
||||
# build_type: Debug
|
||||
# std: 17
|
||||
# other_pkgs: clang-6.0
|
||||
# - cxx: clang++-6.0
|
||||
# build_type: Release
|
||||
# std: 17
|
||||
# other_pkgs: clang-6.0
|
||||
# Clang 10 + C++17
|
||||
- cxx: clang++-10
|
||||
build_type: Debug
|
||||
std: 17
|
||||
other_pkgs: clang-10
|
||||
- cxx: clang++-10
|
||||
build_type: Release
|
||||
std: 17
|
||||
other_pkgs: clang-10
|
||||
- cxx: clang++-10
|
||||
- cxx: clang++-11
|
||||
other_pkgs: clang-11
|
||||
- cxx: clang++-12
|
||||
other_pkgs: clang-12
|
||||
- cxx: clang++-13
|
||||
other_pkgs: clang-13
|
||||
- cxx: clang++-14
|
||||
other_pkgs: clang-14
|
||||
- cxx: clang++-14
|
||||
build_type: Debug
|
||||
std: 20
|
||||
other_pkgs: clang-10
|
||||
- cxx: clang++-10
|
||||
other_pkgs: clang-14
|
||||
- cxx: clang++-14
|
||||
build_type: Release
|
||||
std: 20
|
||||
other_pkgs: clang-10
|
||||
- cxx: g++-10
|
||||
other_pkgs: clang-14
|
||||
- cxx: g++-11
|
||||
build_type: Debug
|
||||
std: 20
|
||||
other_pkgs: g++-10
|
||||
- cxx: g++-10
|
||||
other_pkgs: g++-11
|
||||
- cxx: g++-11
|
||||
build_type: Release
|
||||
std: 20
|
||||
other_pkgs: g++-10
|
||||
other_pkgs: g++-11
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Add repositories for older GCC
|
||||
- name: Add repositories for older compilers
|
||||
run: |
|
||||
sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ bionic main'
|
||||
sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ bionic universe'
|
||||
if: ${{ matrix.cxx == 'g++-5' || matrix.cxx == 'g++-6' }}
|
||||
sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ focal main'
|
||||
sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ focal universe'
|
||||
|
||||
- name: Prepare environment
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ninja-build ${{matrix.other_pkgs}}
|
||||
|
||||
- name: Configure build
|
||||
working-directory: ${{runner.workspace}}
|
||||
env:
|
||||
CXX: ${{matrix.cxx}}
|
||||
CXXFLAGS: ${{matrix.cxxflags}}
|
||||
# Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}.
|
||||
# This is important
|
||||
- name: Configure
|
||||
run: |
|
||||
cmake -Bbuild -H$GITHUB_WORKSPACE \
|
||||
cmake --preset basic-tests -GNinja \
|
||||
-DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
|
||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
||||
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
|
||||
-DCMAKE_CXX_EXTENSIONS=OFF \
|
||||
-DCATCH_DEVELOPMENT_BUILD=ON \
|
||||
-G Ninja
|
||||
-DCMAKE_CXX_COMPILER=${{matrix.cxx}} \
|
||||
-DCMAKE_CXX_STANDARD=${{matrix.std}}
|
||||
|
||||
- name: Build tests + lib
|
||||
working-directory: ${{runner.workspace}}/build
|
||||
run: ninja
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
|
||||
- name: Run tests
|
||||
env:
|
||||
CTEST_OUTPUT_ON_FAILURE: 1
|
||||
working-directory: ${{runner.workspace}}/build
|
||||
run: ctest -C ${{matrix.build_type}} -j `nproc`
|
||||
- name: Test
|
||||
run: ctest --test-dir build -j --output-on-failure
|
||||
|
44
.github/workflows/mac-builds-m1.yml
vendored
@@ -1,44 +0,0 @@
|
||||
name: Arm Mac builds
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: macos-14
|
||||
strategy:
|
||||
matrix:
|
||||
cxx:
|
||||
- clang++
|
||||
build_type: [Debug, Release]
|
||||
std: [14, 17]
|
||||
include:
|
||||
- build_type: Debug
|
||||
examples: ON
|
||||
extra_tests: ON
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Configure build
|
||||
working-directory: ${{runner.workspace}}
|
||||
env:
|
||||
CXX: ${{matrix.cxx}}
|
||||
CXXFLAGS: ${{matrix.cxxflags}}
|
||||
run: |
|
||||
cmake -Bbuild -H$GITHUB_WORKSPACE \
|
||||
-DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
|
||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
||||
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
|
||||
-DCATCH_DEVELOPMENT_BUILD=ON \
|
||||
-DCATCH_BUILD_EXAMPLES=${{matrix.examples}} \
|
||||
-DCATCH_BUILD_EXTRA_TESTS=${{matrix.examples}}
|
||||
|
||||
- name: Build tests + lib
|
||||
working-directory: ${{runner.workspace}}/build
|
||||
run: make -j `sysctl -n hw.ncpu`
|
||||
|
||||
- name: Run tests
|
||||
env:
|
||||
CTEST_OUTPUT_ON_FAILURE: 1
|
||||
working-directory: ${{runner.workspace}}/build
|
||||
run: ctest -C ${{matrix.build_type}} -j `sysctl -n hw.ncpu`
|
44
.github/workflows/mac-builds.yml
vendored
@@ -1,48 +1,30 @@
|
||||
name: Intel Mac builds
|
||||
name: Mac Builds
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
# From macos-14 forward, the baseline "macos-X" image is Arm based,
|
||||
# and not Intel based. Thus this is the newest image we can use for
|
||||
# Intel MacOS CI, and there don't seem to be any plans to keep providing
|
||||
# the Intel based images for free to OSS projects.
|
||||
runs-on: macos-13
|
||||
# and not Intel based.
|
||||
runs-on: ${{matrix.image}}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
cxx:
|
||||
- clang++
|
||||
image: [macos-13, macos-14, macos-15]
|
||||
build_type: [Debug, Release]
|
||||
std: [14, 17]
|
||||
include:
|
||||
- build_type: Debug
|
||||
examples: ON
|
||||
extra_tests: ON
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Configure build
|
||||
working-directory: ${{runner.workspace}}
|
||||
env:
|
||||
CXX: ${{matrix.cxx}}
|
||||
CXXFLAGS: ${{matrix.cxxflags}}
|
||||
- name: Configure
|
||||
run: |
|
||||
cmake -Bbuild -H$GITHUB_WORKSPACE \
|
||||
cmake --preset basic-tests -GNinja \
|
||||
-DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
|
||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
||||
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
|
||||
-DCATCH_DEVELOPMENT_BUILD=ON \
|
||||
-DCATCH_BUILD_EXAMPLES=${{matrix.examples}} \
|
||||
-DCATCH_BUILD_EXTRA_TESTS=${{matrix.examples}}
|
||||
-DCATCH_BUILD_EXAMPLES=ON \
|
||||
-DCATCH_BUILD_EXTRA_TESTS=ON
|
||||
|
||||
- name: Build tests + lib
|
||||
working-directory: ${{runner.workspace}}/build
|
||||
run: make -j `sysctl -n hw.ncpu`
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
|
||||
- name: Run tests
|
||||
env:
|
||||
CTEST_OUTPUT_ON_FAILURE: 1
|
||||
working-directory: ${{runner.workspace}}/build
|
||||
run: ctest -C ${{matrix.build_type}} -j `sysctl -n hw.ncpu`
|
||||
- name: Test
|
||||
run: ctest --test-dir build -j --output-on-failure
|
||||
|
@@ -5,7 +5,7 @@ on: [push, pull_request]
|
||||
jobs:
|
||||
conan_builds:
|
||||
name: Conan ${{matrix.conan_version}}
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
conan_version:
|
||||
|
2
.github/workflows/validate-header-guards.yml
vendored
@@ -5,7 +5,7 @@ on: [push, pull_request]
|
||||
jobs:
|
||||
build:
|
||||
# Set the type of machine to run on
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
|
||||
- name: Checkout source code
|
||||
|
22
.github/workflows/windows-simple-builds.yml
vendored
@@ -1,37 +1,29 @@
|
||||
name: Windows builds (basic)
|
||||
name: Windows Builds (Basic)
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: ${{matrix.os}}, ${{matrix.std}}, ${{matrix.build_type}}, ${{matrix.platform}}
|
||||
name: ${{matrix.os}}, ${{matrix.build_type}}, ${{matrix.platform}}
|
||||
runs-on: ${{matrix.os}}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [windows-2019, windows-2022]
|
||||
os: [windows-2022, windows-2025]
|
||||
platform: [Win32, x64]
|
||||
build_type: [Debug, Release]
|
||||
std: [14, 17]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Configure build
|
||||
working-directory: ${{runner.workspace}}
|
||||
run: |
|
||||
cmake -S $Env:GITHUB_WORKSPACE `
|
||||
-B ${{runner.workspace}}/build `
|
||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} `
|
||||
-A ${{matrix.platform}} `
|
||||
--preset all-tests
|
||||
cmake --preset all-tests `
|
||||
-A ${{matrix.platform}} `
|
||||
|
||||
- name: Build tests
|
||||
working-directory: ${{runner.workspace}}
|
||||
run: cmake --build build --config ${{matrix.build_type}} --parallel %NUMBER_OF_PROCESSORS%
|
||||
shell: cmd
|
||||
|
||||
- name: Run tests
|
||||
working-directory: ${{runner.workspace}}/build
|
||||
env:
|
||||
CTEST_OUTPUT_ON_FAILURE: 1
|
||||
run: ctest -C ${{matrix.build_type}} -j %NUMBER_OF_PROCESSORS%
|
||||
run: ctest --test-dir build -C ${{matrix.build_type}} -j %NUMBER_OF_PROCESSORS% --output-on-failure
|
||||
shell: cmd
|
||||
|
32
BUILD.bazel
@@ -1,4 +1,20 @@
|
||||
load("@bazel_skylib//rules:expand_template.bzl", "expand_template")
|
||||
load("@rules_cc//cc:cc_library.bzl", "cc_library")
|
||||
load("@rules_license//rules:license.bzl", "license")
|
||||
|
||||
package(
|
||||
default_applicable_licenses = [":license"],
|
||||
)
|
||||
|
||||
exports_files([
|
||||
"LICENSE.MIT",
|
||||
])
|
||||
|
||||
license(
|
||||
name = "license",
|
||||
license_kinds = ["@rules_license//licenses/spdx:BSL-1.0"],
|
||||
license_text = "LICENSE.MIT",
|
||||
)
|
||||
|
||||
expand_template(
|
||||
name = "catch_user_config",
|
||||
@@ -11,11 +27,7 @@ expand_template(
|
||||
"#cmakedefine CATCH_CONFIG_COLOUR_WIN32": "",
|
||||
"#cmakedefine CATCH_CONFIG_COUNTER": "",
|
||||
"#cmakedefine CATCH_CONFIG_CPP11_TO_STRING": "",
|
||||
"#cmakedefine CATCH_CONFIG_CPP17_BYTE": "",
|
||||
"#cmakedefine CATCH_CONFIG_CPP17_OPTIONAL": "",
|
||||
"#cmakedefine CATCH_CONFIG_CPP17_STRING_VIEW": "",
|
||||
"#cmakedefine CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS": "",
|
||||
"#cmakedefine CATCH_CONFIG_CPP17_VARIANT": "",
|
||||
"#cmakedefine CATCH_CONFIG_DEPRECATION_ANNOTATIONS": "",
|
||||
"#cmakedefine CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER": "",
|
||||
"#cmakedefine CATCH_CONFIG_DISABLE_EXCEPTIONS": "",
|
||||
"#cmakedefine CATCH_CONFIG_DISABLE_STRINGIFICATION": "",
|
||||
@@ -34,11 +46,7 @@ expand_template(
|
||||
"#cmakedefine CATCH_CONFIG_NO_COLOUR_WIN32": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_COUNTER": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_CPP11_TO_STRING": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_CPP17_BYTE": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_CPP17_OPTIONAL": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_CPP17_STRING_VIEW": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_CPP17_VARIANT": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_DEPRECATION_ANNOTATIONS": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_GETENV": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_GLOBAL_NEXTAFTER": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_POSIX_SIGNALS": "",
|
||||
@@ -58,6 +66,8 @@ expand_template(
|
||||
"#cmakedefine CATCH_CONFIG_WINDOWS_SEH": "",
|
||||
"#cmakedefine CATCH_CONFIG_USE_BUILTIN_CONSTANT_P": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_USE_BUILTIN_CONSTANT_P": "",
|
||||
"#cmakedefine CATCH_CONFIG_EXPERIMENTAL_THREAD_SAFE_ASSERTIONS": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_EXPERIMENTAL_THREAD_SAFE_ASSERTIONS": "",
|
||||
},
|
||||
template = "src/catch2/catch_user_config.hpp.in",
|
||||
)
|
||||
@@ -68,7 +78,7 @@ expand_template(
|
||||
cc_library(
|
||||
name = "catch2_generated",
|
||||
hdrs = ["catch2/catch_user_config.hpp"],
|
||||
include_prefix = ".", # to manipulate -I of dependenices
|
||||
include_prefix = ".", # to manipulate -I of dependencies
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
|
@@ -1,10 +1,9 @@
|
||||
@PACKAGE_INIT@
|
||||
|
||||
|
||||
# Avoid repeatedly including the targets
|
||||
if(NOT TARGET Catch2::Catch2)
|
||||
# Provide path for scripts
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
|
||||
# Provide path for scripts
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/Catch2Targets.cmake)
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/Catch2Targets.cmake)
|
||||
endif()
|
||||
|
@@ -14,7 +14,6 @@
|
||||
#
|
||||
# For detailed docs look into docs/configuration.md
|
||||
|
||||
|
||||
macro(AddOverridableConfigOption OptionBaseName)
|
||||
option(CATCH_CONFIG_${OptionBaseName} "Read docs/configuration.md for details" OFF)
|
||||
option(CATCH_CONFIG_NO_${OptionBaseName} "Read docs/configuration.md for details" OFF)
|
||||
@@ -32,11 +31,6 @@ set(_OverridableOptions
|
||||
"COLOUR_WIN32"
|
||||
"COUNTER"
|
||||
"CPP11_TO_STRING"
|
||||
"CPP17_BYTE"
|
||||
"CPP17_OPTIONAL"
|
||||
"CPP17_STRING_VIEW"
|
||||
"CPP17_UNCAUGHT_EXCEPTIONS"
|
||||
"CPP17_VARIANT"
|
||||
"GLOBAL_NEXTAFTER"
|
||||
"POSIX_SIGNALS"
|
||||
"USE_ASYNC"
|
||||
@@ -45,6 +39,8 @@ set(_OverridableOptions
|
||||
"GETENV"
|
||||
"EXPERIMENTAL_STATIC_ANALYSIS_SUPPORT"
|
||||
"USE_BUILTIN_CONSTANT_P"
|
||||
"DEPRECATION_ANNOTATIONS"
|
||||
"EXPERIMENTAL_THREAD_SAFE_ASSERTIONS"
|
||||
)
|
||||
|
||||
foreach(OptionName ${_OverridableOptions})
|
||||
@@ -74,9 +70,9 @@ foreach(OptionName ${_OtherConfigOptions})
|
||||
AddConfigOption(${OptionName})
|
||||
endforeach()
|
||||
if(DEFINED BUILD_SHARED_LIBS)
|
||||
set(CATCH_CONFIG_SHARED_LIBRARY ${BUILD_SHARED_LIBS})
|
||||
set(CATCH_CONFIG_SHARED_LIBRARY ${BUILD_SHARED_LIBS})
|
||||
else()
|
||||
set(CATCH_CONFIG_SHARED_LIBRARY "")
|
||||
set(CATCH_CONFIG_SHARED_LIBRARY "")
|
||||
endif()
|
||||
|
||||
set(CATCH_CONFIG_DEFAULT_REPORTER "console" CACHE STRING "Read docs/configuration.md for details. The name of the reporter should be without quotes.")
|
||||
|
@@ -8,108 +8,107 @@
|
||||
|
||||
include(CheckCXXCompilerFlag)
|
||||
function(add_cxx_flag_if_supported_to_targets flagname targets)
|
||||
string(MAKE_C_IDENTIFIER ${flagname} flag_identifier )
|
||||
check_cxx_compiler_flag("${flagname}" HAVE_FLAG_${flag_identifier})
|
||||
string(MAKE_C_IDENTIFIER ${flagname} flag_identifier)
|
||||
check_cxx_compiler_flag("${flagname}" HAVE_FLAG_${flag_identifier})
|
||||
|
||||
if (HAVE_FLAG_${flag_identifier})
|
||||
foreach(target ${targets})
|
||||
target_compile_options(${target} PRIVATE ${flagname})
|
||||
endforeach()
|
||||
endif()
|
||||
if(HAVE_FLAG_${flag_identifier})
|
||||
foreach(target ${targets})
|
||||
target_compile_options(${target} PRIVATE ${flagname})
|
||||
endforeach()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Assumes that it is only called for development builds, where warnings
|
||||
# and Werror is desired, so it also enables Werror.
|
||||
function(add_warnings_to_targets targets)
|
||||
LIST(LENGTH targets TARGETS_LEN)
|
||||
# For now we just assume 2 possibilities: msvc and msvc-like compilers,
|
||||
# and other.
|
||||
if (MSVC)
|
||||
foreach(target ${targets})
|
||||
# Force MSVC to consider everything as encoded in utf-8
|
||||
target_compile_options( ${target} PRIVATE /utf-8 )
|
||||
# Enable Werror equivalent
|
||||
if (CATCH_ENABLE_WERROR)
|
||||
target_compile_options( ${target} PRIVATE /WX )
|
||||
endif()
|
||||
LIST(LENGTH targets TARGETS_LEN)
|
||||
# For now we just assume 2 possibilities: msvc and msvc-like compilers,
|
||||
# and other.
|
||||
if(MSVC)
|
||||
foreach(target ${targets})
|
||||
# Force MSVC to consider everything as encoded in utf-8
|
||||
target_compile_options(${target} PRIVATE /utf-8)
|
||||
# Enable Werror equivalent
|
||||
if(CATCH_ENABLE_WERROR)
|
||||
target_compile_options(${target} PRIVATE /WX)
|
||||
endif()
|
||||
|
||||
# MSVC is currently handled specially
|
||||
if ( CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
|
||||
STRING(REGEX REPLACE "/W[0-9]" "/W4" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # override default warning level
|
||||
target_compile_options( ${target} PRIVATE /w44265 /w44061 /w44062 /w45038 )
|
||||
endif()
|
||||
endforeach()
|
||||
# MSVC is currently handled specially
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||
STRING(REGEX REPLACE "/W[0-9]" "/W4" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # override default warning level
|
||||
target_compile_options(${target} PRIVATE /w44265 /w44061 /w44062 /w45038)
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
if(NOT MSVC)
|
||||
set(CHECKED_WARNING_FLAGS
|
||||
"-Wabsolute-value"
|
||||
"-Wall"
|
||||
"-Wcall-to-pure-virtual-from-ctor-dtor"
|
||||
"-Wcast-align"
|
||||
"-Wcatch-value"
|
||||
"-Wdangling"
|
||||
"-Wdeprecated"
|
||||
"-Wdeprecated-register"
|
||||
"-Wexceptions"
|
||||
"-Wexit-time-destructors"
|
||||
"-Wextra"
|
||||
"-Wextra-semi"
|
||||
"-Wfloat-equal"
|
||||
"-Wglobal-constructors"
|
||||
"-Winit-self"
|
||||
"-Wmisleading-indentation"
|
||||
"-Wmismatched-new-delete"
|
||||
"-Wmismatched-return-types"
|
||||
"-Wmismatched-tags"
|
||||
"-Wmissing-braces"
|
||||
"-Wmissing-declarations"
|
||||
"-Wmissing-noreturn"
|
||||
"-Wmissing-prototypes"
|
||||
"-Wmissing-variable-declarations"
|
||||
"-Wnon-virtual-dtor"
|
||||
"-Wnull-dereference"
|
||||
"-Wold-style-cast"
|
||||
"-Woverloaded-virtual"
|
||||
"-Wparentheses"
|
||||
"-Wpedantic"
|
||||
"-Wredundant-decls"
|
||||
"-Wreorder"
|
||||
"-Wreturn-std-move"
|
||||
"-Wshadow"
|
||||
"-Wstrict-aliasing"
|
||||
"-Wsubobject-linkage"
|
||||
"-Wsuggest-destructor-override"
|
||||
"-Wsuggest-override"
|
||||
"-Wundef"
|
||||
"-Wuninitialized"
|
||||
"-Wunneeded-internal-declaration"
|
||||
"-Wunreachable-code-aggressive"
|
||||
"-Wunused"
|
||||
"-Wunused-function"
|
||||
"-Wunused-parameter"
|
||||
"-Wvla"
|
||||
"-Wweak-vtables"
|
||||
|
||||
# This is a useful warning, but our tests sometimes rely on
|
||||
# functions being present, but not picked (e.g. various checks
|
||||
# for stringification implementation ordering).
|
||||
# Ergo, we should use it every now and then, but we cannot
|
||||
# enable it by default.
|
||||
# "-Wunused-member-function"
|
||||
)
|
||||
foreach(warning ${CHECKED_WARNING_FLAGS})
|
||||
add_cxx_flag_if_supported_to_targets(${warning} "${targets}")
|
||||
endforeach()
|
||||
|
||||
if(CATCH_ENABLE_WERROR)
|
||||
foreach(target ${targets})
|
||||
# Enable Werror equivalent
|
||||
target_compile_options(${target} PRIVATE -Werror)
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
if (NOT MSVC)
|
||||
set(CHECKED_WARNING_FLAGS
|
||||
"-Wabsolute-value"
|
||||
"-Wall"
|
||||
"-Wcall-to-pure-virtual-from-ctor-dtor"
|
||||
"-Wcast-align"
|
||||
"-Wcatch-value"
|
||||
"-Wdangling"
|
||||
"-Wdeprecated"
|
||||
"-Wdeprecated-register"
|
||||
"-Wexceptions"
|
||||
"-Wexit-time-destructors"
|
||||
"-Wextra"
|
||||
"-Wextra-semi"
|
||||
"-Wfloat-equal"
|
||||
"-Wglobal-constructors"
|
||||
"-Winit-self"
|
||||
"-Wmisleading-indentation"
|
||||
"-Wmismatched-new-delete"
|
||||
"-Wmismatched-return-types"
|
||||
"-Wmismatched-tags"
|
||||
"-Wmissing-braces"
|
||||
"-Wmissing-declarations"
|
||||
"-Wmissing-noreturn"
|
||||
"-Wmissing-prototypes"
|
||||
"-Wmissing-variable-declarations"
|
||||
"-Wnon-virtual-dtor"
|
||||
"-Wnull-dereference"
|
||||
"-Wold-style-cast"
|
||||
"-Woverloaded-virtual"
|
||||
"-Wparentheses"
|
||||
"-Wpedantic"
|
||||
"-Wredundant-decls"
|
||||
"-Wreorder"
|
||||
"-Wreturn-std-move"
|
||||
"-Wshadow"
|
||||
"-Wstrict-aliasing"
|
||||
"-Wsubobject-linkage"
|
||||
"-Wsuggest-destructor-override"
|
||||
"-Wsuggest-override"
|
||||
"-Wundef"
|
||||
"-Wuninitialized"
|
||||
"-Wunneeded-internal-declaration"
|
||||
"-Wunreachable-code-aggressive"
|
||||
"-Wunused"
|
||||
"-Wunused-function"
|
||||
"-Wunused-parameter"
|
||||
"-Wvla"
|
||||
"-Wweak-vtables"
|
||||
|
||||
# This is a useful warning, but our tests sometimes rely on
|
||||
# functions being present, but not picked (e.g. various checks
|
||||
# for stringification implementation ordering).
|
||||
# Ergo, we should use it every now and then, but we cannot
|
||||
# enable it by default.
|
||||
# "-Wunused-member-function"
|
||||
)
|
||||
foreach(warning ${CHECKED_WARNING_FLAGS})
|
||||
add_cxx_flag_if_supported_to_targets(${warning} "${targets}")
|
||||
endforeach()
|
||||
|
||||
if (CATCH_ENABLE_WERROR)
|
||||
foreach(target ${targets})
|
||||
# Enable Werror equivalent
|
||||
target_compile_options( ${target} PRIVATE -Werror )
|
||||
endforeach()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Adds flags required for reproducible build to the target
|
||||
|
@@ -1,10 +1,10 @@
|
||||
includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
|
||||
libdir=@CMAKE_INSTALL_FULL_LIBDIR@
|
||||
prefix=@CMAKE_INSTALL_PREFIX@
|
||||
libdir=${prefix}/@lib_dir@
|
||||
pkg_version=@Catch2_VERSION@
|
||||
|
||||
Name: Catch2-With-Main
|
||||
Description: A modern, C++-native test framework for C++14 and above (links in default main)
|
||||
Name: Catch2 with main function
|
||||
Description: A modern, C++-native test framework for C++17 and above (links in default main)
|
||||
URL: https://github.com/catchorg/Catch2
|
||||
Version: ${pkg_version}
|
||||
Requires: catch2 = ${pkg_version}
|
||||
Cflags: -I${includedir}
|
||||
Libs: -L${libdir} -lCatch2Main
|
||||
Libs: -L${libdir} -l@lib_name@
|
||||
|
@@ -1,11 +1,11 @@
|
||||
prefix=@CMAKE_INSTALL_PREFIX@
|
||||
exec_prefix=${prefix}
|
||||
includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
|
||||
libdir=@CMAKE_INSTALL_FULL_LIBDIR@
|
||||
includedir=${prefix}/@include_dir@
|
||||
libdir=${prefix}/@lib_dir@
|
||||
|
||||
Name: Catch2
|
||||
Description: A modern, C++-native, test framework for C++14 and above
|
||||
Description: A modern, C++-native, test framework for C++17 and above
|
||||
URL: https://github.com/catchorg/Catch2
|
||||
Version: @Catch2_VERSION@
|
||||
Cflags: -I${includedir}
|
||||
Libs: -L${libdir} -lCatch2
|
||||
Libs: -L${libdir} -l@lib_name@
|
||||
|
204
CMakeLists.txt
@@ -26,16 +26,15 @@ cmake_dependent_option(CATCH_BUILD_SURROGATES "Enable generating and building su
|
||||
cmake_dependent_option(CATCH_ENABLE_CONFIGURE_TESTS "Enable CMake configuration tests. WARNING: VERY EXPENSIVE" OFF "CATCH_DEVELOPMENT_BUILD" OFF)
|
||||
cmake_dependent_option(CATCH_ENABLE_CMAKE_HELPER_TESTS "Enable CMake helper tests. WARNING: VERY EXPENSIVE" OFF "CATCH_DEVELOPMENT_BUILD" OFF)
|
||||
|
||||
|
||||
# Catch2's build breaks if done in-tree. You probably should not build
|
||||
# things in tree anyway, but we can allow projects that include Catch2
|
||||
# as a subproject to build in-tree as long as it is not in our tree.
|
||||
if (CMAKE_BINARY_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||
message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt")
|
||||
if(CMAKE_BINARY_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||
message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt")
|
||||
endif()
|
||||
|
||||
project(Catch2
|
||||
VERSION 3.8.1 # CML version placeholder, don't delete
|
||||
VERSION 3.10.0 # CML version placeholder, don't delete
|
||||
LANGUAGES CXX
|
||||
HOMEPAGE_URL "https://github.com/catchorg/Catch2"
|
||||
DESCRIPTION "A modern, C++-native, unit test framework."
|
||||
@@ -46,7 +45,7 @@ project(Catch2
|
||||
# Then we also add path that we use to configure the project, but is of
|
||||
# no use to top level projects.
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/extras")
|
||||
if (NOT NOT_SUBPROJECT)
|
||||
if(NOT NOT_SUBPROJECT)
|
||||
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE)
|
||||
endif()
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake")
|
||||
@@ -67,10 +66,9 @@ set(CATCH_CMAKE_CONFIG_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Catch2")
|
||||
# are built during these tests, so this is required here, before
|
||||
# the subdirectories are added.
|
||||
if(CATCH_TEST_USE_WMAIN)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:wmainCRTStartup")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:wmainCRTStartup")
|
||||
endif()
|
||||
|
||||
|
||||
# Basic paths
|
||||
set(CATCH_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(SOURCES_DIR ${CATCH_DIR}/src/catch2)
|
||||
@@ -80,119 +78,147 @@ set(SELF_TEST_DIR ${CATCH_DIR}/tests/SelfTest)
|
||||
add_subdirectory(src)
|
||||
|
||||
# Build tests only if requested
|
||||
if (BUILD_TESTING AND CATCH_BUILD_TESTING AND NOT_SUBPROJECT)
|
||||
find_package(PythonInterp 3 REQUIRED)
|
||||
if (NOT PYTHONINTERP_FOUND)
|
||||
message(FATAL_ERROR "Python not found, but required for tests")
|
||||
endif()
|
||||
set(CMAKE_FOLDER "tests")
|
||||
add_subdirectory(tests)
|
||||
if(BUILD_TESTING AND CATCH_BUILD_TESTING AND NOT_SUBPROJECT)
|
||||
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
||||
if(NOT TARGET Python3::Interpreter)
|
||||
message(FATAL_ERROR "Python not found, but required for tests")
|
||||
endif()
|
||||
set(CMAKE_FOLDER "tests")
|
||||
add_subdirectory(tests)
|
||||
endif()
|
||||
|
||||
if(CATCH_BUILD_EXAMPLES)
|
||||
set(CMAKE_FOLDER "Examples")
|
||||
add_subdirectory(examples)
|
||||
set(CMAKE_FOLDER "Examples")
|
||||
add_subdirectory(examples)
|
||||
endif()
|
||||
|
||||
if(CATCH_BUILD_EXTRA_TESTS)
|
||||
set(CMAKE_FOLDER "tests/ExtraTests")
|
||||
add_subdirectory(tests/ExtraTests)
|
||||
set(CMAKE_FOLDER "tests/ExtraTests")
|
||||
add_subdirectory(tests/ExtraTests)
|
||||
endif()
|
||||
|
||||
if(CATCH_BUILD_FUZZERS)
|
||||
set(CMAKE_FOLDER "fuzzing")
|
||||
add_subdirectory(fuzzing)
|
||||
set(CMAKE_FOLDER "fuzzing")
|
||||
add_subdirectory(fuzzing)
|
||||
endif()
|
||||
|
||||
if (CATCH_DEVELOPMENT_BUILD)
|
||||
add_warnings_to_targets("${CATCH_WARNING_TARGETS}")
|
||||
if(CATCH_DEVELOPMENT_BUILD)
|
||||
set(CATCH_ALL_TARGETS ${CATCH_IMPL_TARGETS} ${CATCH_TEST_TARGETS})
|
||||
add_warnings_to_targets("${CATCH_ALL_TARGETS}")
|
||||
# After we added the noreturn hint to FAIL and SKIP, Clang became
|
||||
# extremely good at diagnosing tests that test these macros as being
|
||||
# noreturn, but not marked as such. This made the warning useless for
|
||||
# our test files.
|
||||
add_cxx_flag_if_supported_to_targets("-Wno-missing-noreturn" "${CATCH_TEST_TARGETS}")
|
||||
endif()
|
||||
|
||||
# Only perform the installation steps when Catch is not being used as
|
||||
# a subproject via `add_subdirectory`, or the destinations will break,
|
||||
# see https://github.com/catchorg/Catch2/issues/1373
|
||||
if (NOT_SUBPROJECT)
|
||||
configure_package_config_file(
|
||||
${CMAKE_CURRENT_LIST_DIR}/CMake/Catch2Config.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake
|
||||
INSTALL_DESTINATION
|
||||
${CATCH_CMAKE_CONFIG_DESTINATION}
|
||||
)
|
||||
if(NOT_SUBPROJECT)
|
||||
configure_package_config_file(
|
||||
${CMAKE_CURRENT_LIST_DIR}/CMake/Catch2Config.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake
|
||||
INSTALL_DESTINATION
|
||||
${CATCH_CMAKE_CONFIG_DESTINATION}
|
||||
)
|
||||
|
||||
write_basic_package_version_file(
|
||||
write_basic_package_version_file(
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake"
|
||||
COMPATIBILITY
|
||||
SameMajorVersion
|
||||
)
|
||||
|
||||
install(
|
||||
FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake"
|
||||
COMPATIBILITY
|
||||
SameMajorVersion
|
||||
)
|
||||
DESTINATION
|
||||
${CATCH_CMAKE_CONFIG_DESTINATION}
|
||||
)
|
||||
|
||||
# Install documentation
|
||||
if(CATCH_INSTALL_DOCS)
|
||||
install(
|
||||
DIRECTORY
|
||||
docs/
|
||||
DESTINATION
|
||||
"${CMAKE_INSTALL_DOCDIR}"
|
||||
PATTERN "doxygen" EXCLUDE
|
||||
)
|
||||
endif()
|
||||
|
||||
if(CATCH_INSTALL_EXTRAS)
|
||||
# Install CMake scripts
|
||||
install(
|
||||
FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake"
|
||||
"extras/ParseAndAddCatchTests.cmake"
|
||||
"extras/Catch.cmake"
|
||||
"extras/CatchAddTests.cmake"
|
||||
"extras/CatchShardTests.cmake"
|
||||
"extras/CatchShardTestsImpl.cmake"
|
||||
DESTINATION
|
||||
${CATCH_CMAKE_CONFIG_DESTINATION}
|
||||
)
|
||||
|
||||
# Install documentation
|
||||
if(CATCH_INSTALL_DOCS)
|
||||
install(
|
||||
DIRECTORY
|
||||
docs/
|
||||
DESTINATION
|
||||
"${CMAKE_INSTALL_DOCDIR}"
|
||||
PATTERN "doxygen" EXCLUDE
|
||||
)
|
||||
endif()
|
||||
|
||||
if(CATCH_INSTALL_EXTRAS)
|
||||
# Install CMake scripts
|
||||
install(
|
||||
FILES
|
||||
"extras/ParseAndAddCatchTests.cmake"
|
||||
"extras/Catch.cmake"
|
||||
"extras/CatchAddTests.cmake"
|
||||
"extras/CatchShardTests.cmake"
|
||||
"extras/CatchShardTestsImpl.cmake"
|
||||
DESTINATION
|
||||
${CATCH_CMAKE_CONFIG_DESTINATION}
|
||||
)
|
||||
|
||||
# Install debugger helpers
|
||||
install(
|
||||
FILES
|
||||
"extras/gdbinit"
|
||||
"extras/lldbinit"
|
||||
DESTINATION
|
||||
${CMAKE_INSTALL_DATAROOTDIR}/Catch2
|
||||
)
|
||||
endif()
|
||||
|
||||
## Provide some pkg-config integration
|
||||
set(PKGCONFIG_INSTALL_DIR
|
||||
"${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig"
|
||||
CACHE PATH "Path where catch2.pc is installed"
|
||||
)
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2.pc.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/catch2.pc
|
||||
@ONLY
|
||||
)
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2-with-main.pc.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc
|
||||
@ONLY
|
||||
)
|
||||
# Install debugger helpers
|
||||
install(
|
||||
FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/catch2.pc"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc"
|
||||
"extras/gdbinit"
|
||||
"extras/lldbinit"
|
||||
DESTINATION
|
||||
${PKGCONFIG_INSTALL_DIR}
|
||||
${CMAKE_INSTALL_DATAROOTDIR}/Catch2
|
||||
)
|
||||
endif()
|
||||
|
||||
set(CPACK_PACKAGE_CONTACT "https://github.com/catchorg/Catch2/")
|
||||
## Provide some pkg-config integration
|
||||
set(PKGCONFIG_INSTALL_DIR
|
||||
"${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig"
|
||||
CACHE PATH "Path where catch2.pc is installed"
|
||||
)
|
||||
|
||||
# Generate the pkg-config files
|
||||
# To understand the script below, you have to understand that it works in two steps.
|
||||
# 1) A CMake script is generated at configuration time
|
||||
# 2) It is executed at install time.
|
||||
# And both of these have access to different parts of the information we need.
|
||||
#
|
||||
# Further, the variables before "[[" are expanded at configuration time,
|
||||
# while the ones inside the [[]] block are expanded at script execution (install) time.
|
||||
string(
|
||||
JOIN "\n"
|
||||
install_script
|
||||
"set(install_pkgconfdir \"${PKGCONFIG_INSTALL_DIR}\")"
|
||||
"set(impl_pc_file \"${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2.pc.in\")"
|
||||
"set(main_pc_file \"${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2-with-main.pc.in\")"
|
||||
"set(Catch2_VERSION ${Catch2_VERSION})"
|
||||
"set(include_dir \"${CMAKE_INSTALL_INCLUDEDIR}\")"
|
||||
"set(lib_dir \"${CMAKE_INSTALL_LIBDIR}\")"
|
||||
[[
|
||||
message(STATUS "DESTDIR: $ENV{DESTDIR}")
|
||||
set(DESTDIR_PREFIX "")
|
||||
if (DEFINED ENV{DESTDIR})
|
||||
set(DESTDIR_PREFIX "$ENV{DESTDIR}")
|
||||
endif ()
|
||||
message(STATUS "PREFIX: ${DESTDIR_PREFIX}")
|
||||
set(lib_name "$<TARGET_FILE_BASE_NAME:Catch2>")
|
||||
configure_file(
|
||||
"${impl_pc_file}"
|
||||
"${DESTDIR_PREFIX}${CMAKE_INSTALL_PREFIX}/${install_pkgconfdir}/catch2.pc"
|
||||
@ONLY
|
||||
)
|
||||
|
||||
include( CPack )
|
||||
set(lib_name "$<TARGET_FILE_BASE_NAME:Catch2WithMain>")
|
||||
configure_file(
|
||||
"${main_pc_file}"
|
||||
"${DESTDIR_PREFIX}${CMAKE_INSTALL_PREFIX}/${install_pkgconfdir}/catch2-with-main.pc"
|
||||
@ONLY
|
||||
)
|
||||
]]
|
||||
)
|
||||
install(CODE "${install_script}")
|
||||
|
||||
set(CPACK_PACKAGE_CONTACT "https://github.com/catchorg/Catch2/")
|
||||
|
||||
include(CPack)
|
||||
endif()
|
||||
|
@@ -3,10 +3,16 @@
|
||||
"configurePresets": [
|
||||
{
|
||||
"name": "basic-tests",
|
||||
"binaryDir": "build",
|
||||
"installDir": "build/install",
|
||||
"displayName": "Basic development build",
|
||||
"description": "Enables development build with basic tests that are cheap to build and run",
|
||||
"cacheVariables": {
|
||||
"CATCH_DEVELOPMENT_BUILD": "ON"
|
||||
"CMAKE_CXX_EXTENSIONS": "OFF",
|
||||
"CMAKE_CXX_STANDARD_REQUIRED": "ON",
|
||||
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
|
||||
"CATCH_DEVELOPMENT_BUILD": "ON",
|
||||
"CATCH_ENABLE_REPRODUCIBLE_BUILD": "OFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
11
MAINTAINERS.md
Normal file
@@ -0,0 +1,11 @@
|
||||
<a id="top"></a>
|
||||
# Catch2 Maintainers
|
||||
|
||||
## Current
|
||||
|
||||
* Chris Thrasher ([@christhrasher](https://github.com/ChrisThrasher)), gpg key: 56FB686C9DFC8E2C
|
||||
* Martin Hořeňovský ([@horenmar](https://github.com/horenmar)), gpg key: E29C46F3B8A7502860793B7DECC9C20E314B2360
|
||||
|
||||
## Retired
|
||||
|
||||
* Phil Nash ([@philsquared](https://github.com/philsquared))
|
@@ -1,4 +1,5 @@
|
||||
module(name = "catch2")
|
||||
|
||||
bazel_dep(name = "bazel_skylib", version = "1.7.1")
|
||||
bazel_dep(name = "rules_cc", version = "0.0.17")
|
||||
bazel_dep(name = "rules_cc", version = "0.1.1")
|
||||
bazel_dep(name = "rules_license", version = "1.0.0")
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<a id="top"></a>
|
||||

|
||||

|
||||
|
||||
[](https://github.com/catchorg/catch2/releases)
|
||||
[](https://github.com/catchorg/Catch2/actions/workflows/linux-simple-builds.yml)
|
||||
|
Before Width: | Height: | Size: 10 KiB |
105
data/artwork/catch2-c-logo.svg
Normal file
@@ -0,0 +1,105 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="104.41245mm"
|
||||
height="120.99883mm"
|
||||
viewBox="0 0 101.59999 117.7396"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4-beta (62f545ba5e, 2024-04-22)"
|
||||
sodipodi:docname="catch2-c-logo.svg"
|
||||
xml:space="preserve"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="2"
|
||||
inkscape:cx="181"
|
||||
inkscape:cy="192.25"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1411"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-6"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1"
|
||||
inkscape:clip-to-page="false" /><defs
|
||||
id="defs1"><inkscape:path-effect
|
||||
effect="bspline"
|
||||
id="path-effect21"
|
||||
is_visible="true"
|
||||
lpeversion="1.3"
|
||||
weight="33.333333"
|
||||
steps="2"
|
||||
helper_size="0"
|
||||
apply_no_weight="true"
|
||||
apply_with_weight="true"
|
||||
only_selected="false"
|
||||
uniform="false" /><inkscape:path-effect
|
||||
effect="mirror_symmetry"
|
||||
start_point="73.777381,64.846856"
|
||||
end_point="82.510207,65.15"
|
||||
center_point="78.143794,64.998428"
|
||||
id="path-effect17"
|
||||
is_visible="true"
|
||||
lpeversion="1.2"
|
||||
lpesatellites=""
|
||||
mode="free"
|
||||
discard_orig_path="false"
|
||||
fuse_paths="true"
|
||||
oposite_fuse="false"
|
||||
split_items="false"
|
||||
split_open="false"
|
||||
link_styles="false" /></defs><g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="Layer 1"
|
||||
style="display:inline;opacity:1"><path
|
||||
style="display:inline;opacity:1;fill:#ff2500;fill-opacity:1;stroke:none"
|
||||
d="m 51.144204,74.60863 c 2.755126,3.847649 8.114087,5.089451 12.620377,4.385634 2.354879,-0.367807 8.839176,-2.41493 8.839176,-4.301423 V 61.300036 c 0,-0.274854 -4.644748,-5.35579 -14.139807,-4.033868 -7.781631,0.854243 -12.297148,10.391313 -7.319746,17.342462 z"
|
||||
id="path19" /><path
|
||||
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
|
||||
d="M 51.858331,11.754161 C 41.642983,13.144685 33.527664,20.30548 26.946464,27.781252 13.41997,43.146393 1.1940791,63.412939 0.27499404,84.40209 c -0.2484557,5.673984 0.0720803,11.551339 2.02561406,16.93334 6.4303318,17.71559 27.0809729,18.5262 42.4139739,13.56112 9.635256,-3.12006 19.559145,-9.05196 26.722916,-16.206958 2.544515,-2.541399 6.489211,-6.811827 4.760053,-10.836485 -0.807945,-1.880505 -3.120844,-1.771387 -4.760053,-1.239217 -3.777039,1.226226 -7.054253,3.815005 -10.31875,5.990284 -8.595381,5.727494 -18.582582,10.587386 -29.104166,10.583336 -5.314431,-0.002 -11.064865,-1.53917 -14.276067,-6.085419 C 14.249559,92.162607 14.966246,85.515419 15.941144,79.904173 18.379578,65.869225 26.039129,51.275896 34.494849,39.952087 37.975232,35.291195 43.042486,28.027749 49.477081,27.54157 c 2.673121,-0.201974 4.452111,1.728755 5.613208,3.943849 2.172279,4.144192 2.284401,8.974146 4.143505,13.229168 1.160297,2.655628 3.911041,5.951729 7.175599,4.380934 4.423264,-2.128318 5.563981,-8.759454 5.557271,-13.112185 -0.0164,-10.64231 -7.561412,-25.937074 -20.108333,-24.229175"
|
||||
id="path14" /><path
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.14596;stroke-linecap:round"
|
||||
d="m 53.953228,68.740885 v -1.206827 h 3.137751 v -3.266479 h 1.174645 v 3.266479 h 3.073387 v 1.206827 h -3.073387 v 3.202116 h -1.174645 v -3.202116 z"
|
||||
id="path15"
|
||||
sodipodi:nodetypes="ccccccccccccc" /><path
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.14596;stroke-linecap:round"
|
||||
d="m 62.418518,68.740885 v -1.206827 h 3.137751 v -3.266479 h 1.174645 v 3.266479 h 3.073387 v 1.206827 h -3.073387 v 3.202116 h -1.174645 v -3.202116 z"
|
||||
id="path16"
|
||||
sodipodi:nodetypes="ccccccccccccc" /><path
|
||||
d="M 85.440222,24.062768 C 86.646399,22.95745 88.272019,22.342526 89.673556,21.247484 94.611094,17.389708 103.0499,9.5981005 101.23198,3.5611216 100.54356,1.2749953 97.954172,0.02851298 95.475242,0.19207103 92.915127,0.3609856 90.311542,1.5166605 88.615222,2.3873449 86.831645,3.3028167 85.048448,3.2384541 84.477375,4.6552681 83.67664,6.6418721 85.77327,9.3242102 87.820455,9.0669662 88.433774,8.9898962 89.041201,8.700584 89.29669,8.1526509 89.865278,6.9332293 90.823337,6.6449856 92.781525,5.7141794 94.684453,4.8096405 96.75508,4.4020758 95.458862,7.6585999 93.598546,12.332323 85.734679,17.924982 80.774891,21.407129 c 0,0 -2.282573,1.504251 -2.853005,1.705572 -1.235548,0.436059 -2.378469,0.514326 -2.192851,1.747903 0.209704,1.393648 1.686087,2.720176 2.912476,2.922238 2.91246,0.479863 3.255425,0.04457 7.857045,0.896861 1.782728,0.330191 4.511564,1.873082 5.236267,1.861978 1.114192,-0.01707 2.38496,-5.01e-4 3.098369,-0.950708 1.003097,-1.336037 0.164345,-3.66292 -1.202522,-4.426382 -2.017657,-1.126959 -6.832185,-0.826419 -8.190448,-1.101823"
|
||||
style="display:inline;opacity:1;fill:#ff2500;fill-opacity:1;stroke:none"
|
||||
id="path1"
|
||||
inkscape:label="path1"
|
||||
sodipodi:nodetypes="csssssssssssssssssc" /><circle
|
||||
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.14596;stroke-linecap:round"
|
||||
id="path20"
|
||||
cx="81.427208"
|
||||
cy="64.690056"
|
||||
r="1.1207407" /><circle
|
||||
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.14596;stroke-linecap:round"
|
||||
id="circle21"
|
||||
cx="81.427208"
|
||||
cy="71.551033"
|
||||
r="1.1207407" /><path
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.14596;stroke-linecap:round"
|
||||
d="M 73.866479,74.571917 V 61.475751 c 0.716819,0.227562 4.096107,2.192671 4.096107,6.519638 0,4.326967 -3.010942,6.386799 -4.096107,6.576528 z"
|
||||
id="path21"
|
||||
sodipodi:nodetypes="cczc" /><path
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.14596;stroke-linecap:round"
|
||||
d="m 77.405059,65.799422 3.424802,-1.331236 0.204807,0.933002 -3.652363,1.353992 z"
|
||||
id="path22" /><path
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.14596;stroke-linecap:round"
|
||||
d="m 77.427815,70.4303 3.094839,1.115049 0.40961,-0.739575 -3.402045,-1.433636 z"
|
||||
id="path23" /></g></svg>
|
After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 33 KiB |
83
data/artwork/catch2-hand-logo.svg
Normal file
@@ -0,0 +1,83 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="221.19167mm"
|
||||
height="254mm"
|
||||
viewBox="0 0 221.19167 254"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4-beta (62f545ba5e, 2024-04-22)"
|
||||
sodipodi:docname="catch2-hand-logo.svg"
|
||||
xml:space="preserve"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="false"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="0.75528389"
|
||||
inkscape:cx="423.01975"
|
||||
inkscape:cy="494.51604"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1411"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-6"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer3" /><defs
|
||||
id="defs1" /><g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="Layer 1"
|
||||
style="display:inline;opacity:1"><path
|
||||
style="display:inline;fill:#ff2500;fill-opacity:1;stroke:none;stroke-width:0.997109"
|
||||
d="m 167.951,135.96691 c 2.74718,3.83654 8.09064,5.07475 12.58391,4.37297 2.34808,-0.36675 8.81363,-2.40795 8.81363,-4.28899 v -13.3541 c 0,-0.27407 -4.63132,-5.34032 -14.09894,-4.02222 -7.75915,0.85177 -12.26161,10.36129 -7.2986,17.29234 z"
|
||||
id="path19" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.997109"
|
||||
d="m 168.66307,73.294073 c -10.18583,1.386506 -18.27769,8.526609 -24.83988,15.980778 -13.4874,15.320749 -25.67797,35.528729 -26.59439,56.457219 -0.24775,5.65759 0.0719,11.51796 2.01975,16.88442 6.41176,17.66439 27.00272,18.47266 42.29142,13.52193 9.6074,-3.11105 19.50262,-9.0258 26.64569,-16.16012 2.53716,-2.53406 6.47045,-6.79215 4.7463,-10.80518 -0.80561,-1.87507 -3.11182,-1.76626 -4.7463,-1.23563 -3.76612,1.22268 -7.03387,3.80398 -10.28893,5.97297 -8.57055,5.71095 -18.52889,10.55679 -29.02007,10.55276 -5.29907,-0.002 -11.03289,-1.53473 -14.23481,-6.06784 -3.47888,-4.92522 -2.76426,-11.55319 -1.79218,-17.14822 2.43139,-13.99439 10.06881,-28.54555 18.5001,-39.83664 3.47032,-4.647428 8.52293,-11.889884 14.93893,-12.374659 2.6654,-0.20139 4.43924,1.72376 5.59699,3.932453 2.166,4.132217 2.2778,8.948216 4.13153,13.190946 1.15694,2.64795 3.89974,5.93453 7.15487,4.36828 4.41048,-2.12217 5.5479,-8.73415 5.5412,-13.074306 -0.0164,-10.611557 -7.53956,-25.862124 -20.05022,-24.159161"
|
||||
id="path14" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.145538;stroke-linecap:round"
|
||||
d="m 170.75192,130.11613 v -1.20334 h 3.12868 v -3.25705 h 1.17125 v 3.25705 h 3.0645 v 1.20334 h -3.0645 v 3.19287 h -1.17125 v -3.19287 z"
|
||||
id="path15"
|
||||
sodipodi:nodetypes="ccccccccccccc" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.145538;stroke-linecap:round"
|
||||
d="m 179.19274,130.11613 v -1.20334 h 3.12869 v -3.25705 h 1.17125 v 3.25705 h 3.0645 v 1.20334 h -3.0645 v 3.19287 h -1.17125 v -3.19287 z"
|
||||
id="path16"
|
||||
sodipodi:nodetypes="ccccccccccccc" /><path
|
||||
d="m 204.99654,83.647387 c 1.20269,-1.102124 2.82361,-1.715271 4.2211,-2.807149 4.92327,-3.846627 13.33769,-11.61572 11.52502,-17.635254 -0.68642,-2.27952 -3.26833,-3.5224 -5.7401,-3.359314 -2.55271,0.168426 -5.14878,1.320761 -6.8402,2.18893 -1.77842,0.912826 -3.55647,0.84865 -4.12589,2.26137 -0.79842,1.980862 1.29215,4.655449 3.33343,4.398949 0.61154,-0.07684 1.21721,-0.365323 1.47197,-0.911673 0.56694,-1.215898 1.52223,-1.503309 3.47476,-2.431425 1.89743,-0.901925 3.96207,-1.308312 2.6696,1.938802 -1.85495,4.660217 -9.69609,10.236715 -14.64154,13.7088 0,0 -2.27598,1.499904 -2.84476,1.700643 -1.23198,0.434799 -2.37159,0.512839 -2.18652,1.742852 0.2091,1.38962 1.68122,2.712316 2.90406,2.913793 2.90404,0.478477 3.24602,0.04444 7.83434,0.89427 1.77758,0.329237 4.49854,1.867669 5.22114,1.856598 1.11097,-0.01702 2.37807,-5e-4 3.08942,-0.947962 1.00019,-1.332175 0.16387,-3.652334 -1.19905,-4.41359 -2.01182,-1.123702 -6.81244,-0.824031 -8.16678,-1.09864"
|
||||
style="display:inline;fill:#ff2500;fill-opacity:1;stroke:none;stroke-width:0.997109"
|
||||
id="path1-4"
|
||||
inkscape:label="path2"
|
||||
sodipodi:nodetypes="csssssssssssssssssc" /><circle
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.145538;stroke-linecap:round"
|
||||
id="path20"
|
||||
cx="198.14651"
|
||||
cy="126.077"
|
||||
r="1.117502" /><circle
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.145538;stroke-linecap:round"
|
||||
id="circle21"
|
||||
cx="198.14651"
|
||||
cy="132.91815"
|
||||
r="1.117502" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.145538;stroke-linecap:round"
|
||||
d="m 190.60762,135.93031 v -13.05833 c 0.71475,0.22692 4.08427,2.18634 4.08427,6.50081 0,4.31446 -3.00224,6.36834 -4.08427,6.55752 z"
|
||||
id="path21"
|
||||
sodipodi:nodetypes="cczc" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.145538;stroke-linecap:round"
|
||||
d="m 194.13597,127.18316 3.41491,-1.32739 0.20422,0.93031 -3.64181,1.35009 z"
|
||||
id="path22" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.145538;stroke-linecap:round"
|
||||
d="m 194.15867,131.80066 3.08589,1.11183 0.40843,-0.73744 -3.39221,-1.42949 z"
|
||||
id="path23" /><path
|
||||
style="opacity:1;fill:#000000"
|
||||
d="m 52.485231,274.30677 c -1.44545,-0.96726 -2.86981,-3.09456 -3.13906,-4.6882 -0.39677,-2.34847 0.81078,-4.39701 5.15499,-8.74518 20.43177,-20.45035 46.487389,-31.49087 92.078009,-39.01608 2.25557,-0.37231 4.92152,-0.92104 5.92434,-1.21941 4.02143,-1.19651 9.24392,-3.85561 19.87253,-10.11836 9.8535,-5.80602 12.12477,-6.79037 15.66794,-6.79037 2.05936,0 4.57269,2.67656 4.57269,4.86966 0,1.68904 -2.6986,6.0579 -4.7121,7.6286 -2.28208,1.78021 -6.58253,4.6015 -11.7076,7.68073 -9.06231,5.44478 -11.98022,6.71427 -21.41534,9.31715 -5.04752,1.39246 -16.38447,4.02852 -25.53267,5.93683 -25.13851,5.24388 -25.00563,5.21162 -29.765619,7.22491 -7.03101,2.97384 -16.88366,8.57665 -28.32629,16.10804 -4.97279,3.27302 -5.23095,3.48606 -6.59919,5.44572 -2.03051,2.90821 -4.81825,5.75178 -6.42266,6.55129 -2.02273,1.00797 -3.9618,0.94437 -5.64997,-0.18533 z M 2.1166706,214.04812 c -4.43974,-1.17966 -6.29001,-2.86592 -6.50258,-5.92618 -0.0561,-0.80826 -0.34243,-2.18306 -0.6362,-3.05512 -0.29378,-0.87205 -0.53414,-2.12574 -0.53414,-2.78598 0,-2.4519 9.57939,-32.76364 14.76039,-46.70584 C 21.897901,121.41582 36.072191,94.814185 53.824111,71.834375 c 11.92384,-15.435387 26.74991,-30.208723 41.2936,-41.146727 5.899709,-4.437045 11.752929,-7.682035 15.523289,-8.606009 2.83253,-0.694146 6.49309,-0.456289 8.54715,0.55538 0.86947,0.428233 2.07876,1.254856 2.6873,1.836939 1.24377,1.189682 1.58018,2.435151 1.36349,5.048044 -0.19501,2.351645 -1.01118,3.232511 -6.23188,6.725914 -2.50094,1.67349 -7.49666,5.375621 -11.10159,8.226959 -8.626469,6.823143 -12.675559,9.813426 -18.592969,13.731047 -4.5713,3.026431 -5.19257,3.540143 -9.40057,7.773067 -6.75068,6.79066 -18.35611,20.995666 -21.41793,26.215466 -7.26888,12.392015 -19.02869,38.165965 -27.46982,60.205545 -7.14782,18.66277 -15.28897,43.14897 -16.8808,50.77253 -1.36968,6.55961 -2.3943804,8.86415 -4.6390304,10.43312 -1.42141,0.99355 -2.86689,1.11226 -5.38768,0.44247 z M 84.451711,131.53763 c -2.71586,-1.44798 -4.39099,-4.45284 -3.91041,-7.01452 0.22361,-1.19197 2.16953,-4.12452 4.94017,-7.44499 2.77937,-3.33091 13.49664,-14.08622 17.176859,-17.237833 20.86316,-17.866412 44.82366,-30.594172 72.62813,-38.579882 13.98648,-4.017052 21.64688,-4.578234 28.9691,-2.122202 2.68998,0.902278 3.92015,1.642753 4.93107,2.968151 2.42706,3.182092 1.37728,7.464086 -2.28839,9.334167 -1.72612,0.880603 -5.30307,1.720503 -18.52445,4.349714 -34.65213,6.890939 -45.21368,10.483785 -64.01962,21.778305 -4.90594,2.94642 -12.73144,8.97117 -19.60898,15.0967 -4.21536,3.75444 -5.629099,5.40595 -7.922789,9.25525 -2.61622,4.39059 -3.64884,5.89007 -5.11311,7.42481 -2.32969,2.44183 -5.17662,3.30181 -7.25758,2.19233 z m -19.34134,-7.37312 c -0.67308,-0.23773 -1.75582,-0.98544 -2.55596,-1.76505 -1.563,-1.52288 -2.12938,-2.99059 -1.84499,-4.78105 0.49788,-3.13453 6.69521,-13.63592 13.12251,-22.236119 17.01101,-22.761971 41.464519,-41.822254 69.705419,-54.331885 8.97055,-3.973604 14.33402,-5.413308 20.23973,-5.432901 6.16545,-0.02045 10.0683,1.082726 12.13437,3.429906 2.78341,3.162114 2.82958,6.444745 0.12416,8.826153 -1.53485,1.351031 -4.80881,2.63842 -18.21165,7.161207 -31.8573,10.75024 -42.5879,16.147741 -58.492839,29.421967 -5.67746,4.738392 -13.21765,12.843914 -18.77808,20.185972 -2.50637,3.30944 -3.41949,5.02515 -5.06932,9.525 -2.27988,6.21828 -3.86567,8.69854 -6.28046,9.823 -1.53672,0.71558 -2.4493,0.75433 -4.09289,0.1738 z"
|
||||
id="path1"
|
||||
sodipodi:nodetypes="sssssssssssssssssscssssssssssssssssssssscssssssssssssssssssssssss"
|
||||
transform="translate(5.8208328,-21.43125)" /></g></svg>
|
After Width: | Height: | Size: 9.1 KiB |
104
data/artwork/catch2-logo-full-with-background.svg
Normal file
@@ -0,0 +1,104 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="145.25626mm"
|
||||
height="76.199997mm"
|
||||
viewBox="0 0 145.25626 76.199997"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xml:space="preserve"
|
||||
inkscape:version="1.4-beta (62f545ba5e, 2024-04-22)"
|
||||
sodipodi:docname="catch2-logo-full-with-background.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="2.1362654"
|
||||
inkscape:cx="260.73539"
|
||||
inkscape:cy="75.599221"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1411"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-6"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1" /><defs
|
||||
id="defs1"><inkscape:path-effect
|
||||
effect="bspline"
|
||||
id="path-effect3"
|
||||
is_visible="true"
|
||||
lpeversion="1.3"
|
||||
weight="33.333333"
|
||||
steps="2"
|
||||
helper_size="0"
|
||||
apply_no_weight="true"
|
||||
apply_with_weight="true"
|
||||
only_selected="false"
|
||||
uniform="false" /></defs><path
|
||||
style="display:inline;opacity:1;fill:#ffffff;stroke-width:0.15;stroke-linecap:round"
|
||||
d="m 20.956995,75.891056 c -0.345757,0 -1.03727,0 -1.868118,-0.381881 -0.830849,-0.38188 -1.801033,-1.145642 -2.611239,-1.78039 -0.810207,-0.634747 -1.460436,-1.140482 -2.141629,-2.265482 -0.681193,-1.125 -1.393348,-2.869267 -2.275802,-4.458716 C 11.177753,65.415137 10.125,63.980505 9.288991,63.18578 8.4529816,62.391055 7.8337157,62.236239 6.9719037,61.730505 6.1100917,61.224771 5.005734,60.36812 4.3142201,59.790138 3.6227063,59.212156 3.3440368,58.912844 2.7521924,58.147933 2.1603479,57.383023 1.2553288,56.152515 0.80464381,54.814747 0.35395881,53.476979 0.35760785,52.03195 0.54006088,50.402645 0.72251392,48.773339 1.0837708,46.959757 1.6841117,44.78319 c 0.600341,-2.176566 1.4397661,-4.716117 2.4787447,-7.477291 1.0389785,-2.761174 2.2775105,-5.743971 3.7379462,-8.690646 1.4604358,-2.946674 3.1427754,-5.857225 4.9334864,-8.581996 1.790711,-2.724771 3.689793,-5.263761 5.90883,-7.756307 2.219037,-2.492546 4.758028,-4.9386471 6.873854,-6.7138764 2.115825,-1.7752293 3.808486,-2.8795875 5.294724,-3.6227067 1.486239,-0.7431192 2.766056,-1.12499991 3.627868,-1.34174306 0.861812,-0.21674314 1.305618,-0.26834858 2.002293,-0.24770639 0.696674,0.0206422 1.646216,0.11353208 3.240826,0.46961002 1.59461,0.35607793 3.834289,0.97534413 5.692086,1.43463303 1.857798,0.4592889 3.333716,0.758601 4.226491,0.9392202 0.892775,0.1806192 1.202408,0.2425458 1.708142,0.4076835 0.505734,0.1651376 1.207568,0.4334861 1.888761,0.7276375 0.681193,0.2941515 1.341744,0.6141056 2.14679,1.0837157 0.805046,0.4696101 1.754587,1.0888762 2.564794,1.6462156 0.810206,0.5573395 1.481078,1.0527523 2.327409,1.6616971 0.84633,0.6089449 1.86812,1.3314219 2.52867,1.7855509 0.660551,0.454128 0.959862,0.639908 1.486238,1.13016 0.526376,0.490253 1.279815,1.284977 2.012613,1.986812 0.732798,0.701835 1.444954,1.31078 1.955848,1.759748 0.510895,0.448968 0.820528,0.737959 1.739106,1.290138 0.918578,0.552179 2.446102,1.367546 3.860093,1.661697 1.413991,0.294152 2.71445,0.06709 3.530437,-0.08893 0.815986,-0.15602 1.147498,-0.240994 2.178082,-0.626493 1.030584,-0.385499 2.760238,-1.071523 4.061129,-1.628004 1.30089,-0.556482 2.192163,-0.992796 2.978809,-1.214324 0.786645,-0.221529 1.541055,-0.248227 2.342041,-0.216499 0.800986,0.03173 1.690589,0.123491 2.387555,0.320239 0.696966,0.196747 1.263209,0.515637 2.793374,1.465114 1.530165,0.949478 4.037903,2.537347 5.959128,3.296351 1.92123,0.759005 3.25679,0.689673 4.91893,0.56378 1.66215,-0.125892 3.65089,-0.308346 5.73086,-1.636604 2.07996,-1.328258 4.25115,-3.80232 5.64509,-5.265593 1.39394,-1.463273 2.01063,-1.915757 3.01777,-2.432099 1.00714,-0.516342 2.40473,-1.0965425 3.9574,-1.6530243 1.55268,-0.5564818 3.26044,-1.0892445 4.73466,-1.6694444 1.47422,-0.5801999 2.71491,-1.2078409 3.99573,-1.6384293 1.28082,-0.4305884 2.60178,-0.6641283 3.75853,-0.7407587 1.15675,-0.07663 2.1493,0.00365 3.1017,0.3466601 0.9524,0.3430107 1.86467,0.9487579 2.56894,1.5143606 0.70426,0.5656028 1.20054,1.0910709 1.68951,1.7989884 0.48898,0.7079176 0.97065,1.5982856 1.26623,2.8791066 0.29557,1.280821 0.40505,2.95209 0.11312,5.079492 -0.29192,2.127402 -0.98525,4.710938 -1.51071,7.049986 -0.52547,2.339048 -0.88307,4.433606 -0.88672,6.758058 -0.004,2.324452 0.34666,4.878795 0.85388,7.46233 0.50722,2.583535 1.17134,5.196259 1.45962,7.133911 0.28827,1.937653 0.2007,3.200226 -0.51087,4.627009 -0.71157,1.426784 -2.04712,3.01777 -3.52499,3.857055 -1.47787,0.839284 -3.10388,0.927177 -5.00548,0.843658 -1.90159,-0.08352 -4.13587,-0.343101 -6.08337,-0.281904 -1.94751,0.0612 -3.72418,0.445924 -5.61643,0.945314 -1.89226,0.499389 -3.93016,1.120257 -7.01361,1.499759 -3.08346,0.379502 -7.21419,0.518166 -11.35952,0.499921 -4.14534,-0.01825 -8.305268,-0.1934 -12.516283,-0.218943 -4.211016,-0.02554 -8.473119,0.09853 -12.950516,0.135015 -4.477396,0.03649 -9.170088,-0.0146 -11.88134,0.08028 -2.711251,0.09488 -3.441064,0.335715 -4.495642,0.864829 -1.054578,0.529114 -2.433923,1.346502 -3.692849,2.21133 -1.258925,0.864827 -2.397433,1.777092 -3.638113,2.557992 -1.240681,0.780899 -2.583535,1.430431 -3.959231,2.014281 -1.375696,0.583849 -2.784233,1.102015 -4.966371,1.726004 -2.182138,0.62399 -5.137876,1.353802 -7.425836,2.010633 -2.287961,0.656831 -3.908144,1.24068 -5.094089,1.718707 -1.185945,0.478026 -1.937652,0.850231 -2.981283,1.426783 -1.043632,0.576551 -2.379187,1.357451 -3.473905,2.028878 -1.094718,0.671427 -1.948598,1.233381 -2.729497,1.572744 -0.780899,0.339362 -1.488816,0.456133 -2.20046,0.515384 -0.711644,0.05925 -1.427013,0.06099 -1.784698,0.06185 -0.357685,8.67e-4 -0.357685,8.69e-4 -0.703442,8.69e-4 z"
|
||||
id="path3"
|
||||
inkscape:path-effect="#path-effect3"
|
||||
inkscape:original-d="m 21.302752,75.891056 c -0.691514,0 -1.383027,0 -2.074541,0 -0.970183,-0.763761 -1.940367,-1.527523 -2.91055,-2.291284 -0.65023,-0.505734 -1.300459,-1.011469 -1.950689,-1.517203 C 13.654816,70.338303 12.942661,68.594036 12.230505,66.84977 11.177753,65.415137 10.125,63.980505 9.0722478,62.545872 8.4529817,62.391055 7.8337156,62.236239 7.2144495,62.081422 6.1100917,61.224771 5.005734,60.36812 3.9013762,59.511469 3.6227064,59.212156 3.3440367,58.912844 3.0653669,58.613531 2.1603479,57.383023 1.2553288,56.152515 0.35030978,54.922007 c 0.003649,-1.445028 0.007298,-2.890057 0.0109471,-4.335085 0.36125697,-1.813583 0.72251392,-3.627165 1.08377092,-5.440748 0.839425,-2.53955 1.6788499,-5.079101 2.5182749,-7.618651 1.2385321,-2.982798 2.4770643,-5.965595 3.7155964,-8.948393 1.6823393,-2.910551 3.3646789,-5.821102 5.0470179,-8.731653 1.899083,-2.538991 3.798165,-5.077981 5.697248,-7.616972 2.538991,-2.446101 5.077982,-4.8922021 7.616973,-7.3383031 1.69266,-1.1043578 3.385321,-2.2087156 5.077981,-3.3130734 1.279817,-0.3818808 2.559634,-0.76376151 3.839451,-1.14564226 0.443807,-0.0516055 0.887613,-0.10321101 1.33142,-0.15481652 0.949542,0.0928899 1.899084,0.18577981 2.848626,0.27866972 2.239678,0.61926606 4.479357,1.23853206 6.719035,1.85779816 1.475917,0.2993119 2.951835,0.5986238 4.427752,0.8979357 0.309633,0.061927 0.619266,0.1238532 0.928899,0.1857798 0.701835,0.2683486 1.403669,0.5366973 2.105504,0.8050459 0.660551,0.3199542 1.321102,0.6399083 1.981653,0.9598625 0.949541,0.619266 1.899082,1.2385321 2.848623,1.8577981 0.670872,0.4954129 1.341744,0.9908257 2.012616,1.4862386 1.021789,0.7224769 2.043579,1.4449538 3.065368,2.1674308 0.299312,0.18578 0.598623,0.37156 0.897935,0.55734 0.75344,0.794725 1.506879,1.589449 2.260319,2.384174 0.712156,0.608945 1.424312,1.21789 2.136468,1.826835 0.309633,0.288991 0.619266,0.577982 0.928899,0.866973 1.527523,0.815367 3.055047,1.630734 4.58257,2.446101 1.300459,-0.227064 2.600918,-0.454129 3.901377,-0.681193 0.331513,-0.08498 0.663026,-0.169949 0.994539,-0.254924 1.729655,-0.686023 3.459309,-1.372047 5.188964,-2.05807 0.872126,-0.42694 1.674426,-1.045002 2.616377,-1.28082 0.720313,-0.02549 1.474723,-0.05219 2.20945,-0.07819 0.867245,0.08946 1.756848,0.18122 2.607953,0.269012 0.606407,0.192807 1.10907,0.624593 1.663328,0.936734 2.546995,1.522183 5.01381,3.174683 7.520715,4.762024 1.33555,-0.06933 2.67111,-0.138664 4.00666,-0.207996 1.98874,-0.182453 3.97748,-0.364907 5.96622,-0.54736 2.17119,-2.474063 4.34238,-4.948125 6.51357,-7.422188 0.61669,-0.452483 1.23338,-0.904967 1.85007,-1.35745 1.39759,-0.580201 2.79518,-1.1604015 4.19277,-1.7406023 1.70776,-0.5327628 3.41552,-1.0655255 5.12328,-1.5982883 1.24068,-0.6276383 2.48137,-1.2552767 3.72205,-1.882915 1.32096,-0.2335398 2.64192,-0.4670797 3.96288,-0.7006195 0.99254,0.080279 1.98509,0.1605585 2.97763,0.2408377 0.91226,0.6057441 1.82453,1.2114881 2.73679,1.8172322 0.49627,0.5254647 0.99255,1.0509294 1.48882,1.5763941 0.48168,0.8903707 0.96335,1.7807411 1.44503,2.6711121 0.10947,1.67127 0.21895,3.342539 0.32842,5.013809 -0.69332,2.583535 -1.38665,5.167069 -2.07997,7.750604 -0.35761,2.094561 -0.71521,4.189121 -1.07282,6.283682 0.35031,2.554342 0.70062,5.108685 1.05093,7.663027 0.66413,2.612727 1.32825,5.225453 1.99238,7.83818 -0.0876,1.262575 -0.17515,2.52515 -0.26273,3.787725 -1.33556,1.59099 -2.67111,3.18198 -4.00667,4.77297 -1.62018,0.08758 -3.23877,0.312749 -4.86055,0.262733 -2.18883,-0.254302 -4.42311,-0.513883 -6.5902,-0.765659 -1.72792,0.37417 -3.50459,0.758897 -5.25465,1.137862 -2.06002,0.53587 -4.07235,1.240681 -6.10852,1.861021 -4.13074,0.138665 -8.26147,0.277329 -12.39221,0.415994 -4.15993,-0.175155 -8.319858,-0.35031 -12.479787,-0.525465 -4.262102,0.124068 -8.524205,0.248137 -12.786307,0.372205 -4.692691,-0.05109 -9.385383,-0.102175 -14.078074,-0.153263 -0.729812,0.240839 -1.459625,0.481678 -2.189437,0.722517 -1.379344,0.817389 -2.758689,1.634777 -4.138033,2.452166 -1.138507,0.912266 -2.277015,1.824531 -3.415522,2.736797 -1.342854,0.649533 -2.685708,1.299065 -4.028562,1.948598 -1.408538,0.518166 -2.817075,1.036332 -4.225613,1.554498 -2.955738,0.729813 -5.911476,1.459625 -8.867214,2.189438 -1.620183,0.583849 -3.240366,1.167698 -4.860549,1.751547 -0.751707,0.372204 -1.503414,0.744409 -2.255121,1.116613 -1.335556,0.780899 -2.671111,1.561799 -4.006667,2.342698 -0.85388,0.561955 -1.70776,1.123909 -2.56164,1.685864 -0.707918,0.11677 -1.415835,0.233541 -2.123753,0.350311 -0.71537,0.0017 -1.430739,0.0035 -2.146109,0.0052 z"
|
||||
sodipodi:nodetypes="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" /><g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-32.146873,-110.33125)"
|
||||
style="display:inline;opacity:1"><path
|
||||
style="display:inline;fill:#ff2500;fill-opacity:1;stroke:none;stroke-width:0.250889"
|
||||
d="m 80.95419,150.8289 c 0.691236,0.96533 2.035742,1.27689 3.166324,1.10031 0.590818,-0.0922 2.217659,-0.60588 2.217659,-1.07918 v -3.36013 c 0,-0.069 -1.165318,-1.34371 -3.547531,-1.01206 -1.952335,0.21432 -3.085228,2.60709 -1.836452,4.35106 z"
|
||||
id="path19" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.250889"
|
||||
d="m 81.13336,135.05935 c -2.562928,0.34888 -4.598977,2.14544 -6.250134,4.02102 -3.393658,3.85496 -6.461012,8.93964 -6.691599,14.2056 -0.06234,1.42355 0.01809,2.8981 0.508204,4.2484 1.613307,4.44467 6.794341,4.64804 10.641236,3.40234 2.417384,-0.78278 4.907188,-2.27103 6.704505,-4.06615 0.638393,-0.63761 1.628076,-1.70902 1.19425,-2.71876 -0.202704,-0.4718 -0.782987,-0.44442 -1.19425,-0.31091 -0.947618,0.30765 -1.76984,0.95715 -2.588867,1.50289 -2.156496,1.43698 -4.662182,2.65628 -7.301941,2.65526 -1.333335,-5e-4 -2.776062,-0.38616 -3.581718,-1.52678 -0.875345,-1.23926 -0.695536,-2.90697 -0.450943,-4.31477 0.611778,-3.52124 2.533483,-7.18254 4.654937,-10.02357 0.873192,-1.16937 2.144513,-2.99169 3.758888,-3.11367 0.670659,-0.0506 1.116987,0.43373 1.408297,0.98948 0.545003,1.03973 0.573135,2.25152 1.039561,3.31906 0.291107,0.66626 0.981242,1.49322 1.800288,1.09911 1.109752,-0.53395 1.395945,-2.19764 1.39426,-3.28969 -0.0041,-2.67006 -1.897081,-6.50736 -5.044974,-6.07886"
|
||||
id="path14" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
d="m 81.65895,149.35674 v -0.30278 h 0.787228 v -0.81953 h 0.294706 v 0.81953 h 0.771081 v 0.30278 h -0.771081 v 0.80337 h -0.294706 v -0.80337 z"
|
||||
id="path15"
|
||||
sodipodi:nodetypes="ccccccccccccc" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
d="m 83.782802,149.35674 v -0.30278 h 0.787231 v -0.81953 h 0.294707 v 0.81953 h 0.77108 v 0.30278 h -0.77108 v 0.80337 h -0.294707 v -0.80337 z"
|
||||
id="path16"
|
||||
sodipodi:nodetypes="ccccccccccccc" /><path
|
||||
d="m 164.85789,130.59556 c 0.4642,-0.42537 1.08982,-0.66203 1.62919,-1.08343 1.9002,-1.4847 5.14786,-4.48328 4.44823,-6.80658 -0.26492,-0.87983 -1.26145,-1.35951 -2.21547,-1.29658 -0.98523,0.0649 -1.98724,0.50977 -2.64007,0.84484 -0.6864,0.35231 -1.37265,0.32755 -1.59243,0.87281 -0.30817,0.76454 0.49873,1.79683 1.28659,1.69784 0.23602,-0.0295 0.4698,-0.14082 0.56812,-0.35185 0.21882,-0.46933 0.58753,-0.58023 1.34113,-0.93846 0.73235,-0.34812 1.52921,-0.50494 1.03038,0.7483 -0.71596,1.79868 -3.74234,3.95101 -5.65111,5.2911 0,0 -0.87845,0.57891 -1.09797,0.6564 -0.47551,0.16781 -0.91536,0.19794 -0.84393,0.67269 0.0807,0.5363 0.64891,1.04684 1.12086,1.12458 1.12086,0.18468 1.25286,0.0172 3.02378,0.34516 0.68608,0.12686 1.73627,0.72085 2.01516,0.71659 0.4288,-0.006 0.91785,-2e-4 1.19241,-0.36589 0.38604,-0.51416 0.0632,-1.40966 -0.46279,-1.70348 -0.7765,-0.43372 -2.62935,-0.31806 -3.15208,-0.42404"
|
||||
style="display:inline;fill:#ff2500;fill-opacity:1;stroke:none;stroke-width:0.384847"
|
||||
id="path1-4"
|
||||
inkscape:label="path2"
|
||||
sodipodi:nodetypes="csssssssssssssssssc" /><circle
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
id="path20"
|
||||
cx="88.551903"
|
||||
cy="148.34044"
|
||||
r="0.28118241" /><circle
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
id="circle21"
|
||||
cx="88.551903"
|
||||
cy="150.06178"
|
||||
r="0.28118241" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
d="m 86.654979,150.81969 v -3.2857 c 0.179844,0.0571 1.027671,0.55011 1.027671,1.63571 0,1.0856 -0.755414,1.60237 -1.027671,1.64999 z"
|
||||
id="path21"
|
||||
sodipodi:nodetypes="cczc" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
d="m 87.542772,148.61874 0.859248,-0.33398 0.05138,0.23408 -0.91634,0.3397 z"
|
||||
id="path22" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
d="m 87.548483,149.78059 0.776462,0.27976 0.102767,-0.18555 -0.853537,-0.35969 z"
|
||||
id="path23" /><path
|
||||
style="display:inline;fill:#000000;stroke-width:0.251618"
|
||||
d="m 53.365672,180.24507 c -0.3637,-0.24337 -0.722092,-0.77863 -0.78984,-1.17963 -0.09983,-0.59091 0.204006,-1.10636 1.297083,-2.20043 5.140978,-5.14565 11.697013,-7.92364 23.168383,-9.81711 0.56754,-0.0937 1.238338,-0.23174 1.490665,-0.30682 1.011859,-0.30107 2.325926,-0.97015 5.000265,-2.54594 2.479307,-1.46091 3.050796,-1.70859 3.942317,-1.70859 0.518171,0 1.150566,0.67347 1.150566,1.22529 0,0.425 -0.679012,1.52428 -1.185643,1.91949 -0.57421,0.44794 -1.656275,1.15781 -2.94583,1.9326 -2.280231,1.36999 -3.014427,1.68943 -5.388463,2.34435 -1.27004,0.35037 -4.122609,1.01365 -6.424451,1.4938 -6.325272,1.31945 -6.291838,1.31134 -7.489532,1.81791 -1.769123,0.74828 -4.248215,2.15803 -7.127375,4.05307 -1.251238,0.82355 -1.316194,0.87715 -1.660467,1.37023 -0.51091,0.73176 -1.212354,1.44725 -1.616051,1.64842 -0.508953,0.25361 -0.996853,0.23763 -1.421627,-0.0466 z m -12.67358,-15.16209 c -1.117114,-0.29682 -1.582673,-0.72112 -1.636159,-1.49113 -0.01411,-0.20337 -0.08617,-0.54929 -0.160079,-0.76872 -0.07391,-0.21941 -0.134398,-0.53487 -0.134398,-0.70099 0,-0.61695 2.410337,-8.2439 3.713963,-11.75198 3.193966,-8.59503 6.760455,-15.28845 11.227138,-21.07057 3.000239,-3.88379 6.730729,-7.60101 10.390169,-10.3532 1.484468,-1.11645 2.957235,-1.93293 3.905921,-2.16542 0.712713,-0.17466 1.633772,-0.11481 2.150608,0.13975 0.218773,0.10778 0.523051,0.31574 0.67617,0.46219 0.312953,0.29934 0.3976,0.61273 0.343077,1.27018 -0.04907,0.5917 -0.25443,0.81335 -1.568046,1.69235 -0.629278,0.42108 -1.886286,1.35259 -2.793347,2.07005 -2.170567,1.71681 -3.189387,2.46922 -4.678307,3.45496 -1.150216,0.76149 -1.306538,0.89075 -2.365342,1.95583 -1.698584,1.70864 -4.618708,5.28287 -5.389113,6.59626 -1.828972,3.11804 -4.78794,9.6032 -6.91187,15.14872 -1.798512,4.69589 -3.846964,10.85701 -4.247495,12.77525 -0.344636,1.65049 -0.602466,2.23034 -1.167259,2.62515 -0.357651,0.24998 -0.721358,0.27984 -1.355631,0.11132 z m 20.716887,-20.76104 c -0.683356,-0.36433 -1.104849,-1.1204 -0.983924,-1.76497 0.05627,-0.29992 0.54589,-1.0378 1.243028,-1.87329 0.699338,-0.83811 3.395984,-3.54431 4.32199,-4.33732 5.249523,-4.4955 11.27839,-7.69801 18.274464,-9.70734 3.519236,-1.01076 5.446721,-1.15198 7.289115,-0.53399 0.676845,0.22703 0.986378,0.41335 1.240742,0.74684 0.610689,0.80066 0.346547,1.87808 -0.575798,2.34864 -0.434322,0.22155 -1.334341,0.4329 -4.661064,1.09445 -8.719062,1.73387 -11.376528,2.63789 -16.108419,5.47979 -1.234418,0.74136 -3.203445,2.2573 -4.93395,3.79859 -1.060656,0.94467 -1.416377,1.36021 -1.993509,2.32877 -0.658285,1.10475 -0.91811,1.48204 -1.286545,1.86821 -0.58619,0.6144 -1.302525,0.83079 -1.82613,0.55162 z m -4.866609,-1.8552 c -0.169358,-0.0598 -0.441793,-0.24795 -0.643122,-0.44412 -0.393278,-0.38317 -0.535787,-0.75247 -0.464232,-1.20299 0.125276,-0.7887 1.684629,-3.43102 3.301847,-5.59497 4.280257,-5.7273 10.433175,-10.52319 17.539062,-13.67083 2.257142,-0.99983 3.606682,-1.36208 5.092658,-1.367 1.551331,-0.005 2.533355,0.27242 3.053214,0.86301 0.700352,0.79565 0.711968,1.62161 0.03125,2.22082 -0.386196,0.33993 -1.209978,0.66386 -4.58236,1.80187 -8.015835,2.70495 -10.715836,4.06305 -14.717787,7.40307 -1.428546,1.19226 -3.325785,3.23175 -4.724883,5.07912 -0.630645,0.83273 -0.860401,1.26441 -1.275526,2.39667 -0.573656,1.56462 -0.972669,2.18868 -1.580271,2.47163 -0.386663,0.18004 -0.616285,0.18979 -1.02984,0.0437 z"
|
||||
id="path1"
|
||||
sodipodi:nodetypes="sssssssssssssssssscssssssssssssssssssssscssssssssssssssssssssssss" /><path
|
||||
style="display:inline;fill:#000000"
|
||||
d="m 133.48506,160.85705 c -1.47006,-0.34869 -2.86219,-1.46379 -3.53601,-2.83237 -0.53009,-1.07667 -0.6102,-1.73748 -0.61653,-3.78777 -0.011,-3.55286 1.28597,-6.9802 3.99822,-10.78446 3.43411,-4.81674 7.24916,-6.89675 9.52931,-5.1955 1.72479,1.2869 2.67857,4.71416 1.81712,6.52955 -0.91147,1.92077 -2.00698,1.48885 -2.77637,-1.09461 -0.2958,-0.99324 -0.76382,-2.01041 -1.04004,-2.2604 -1.06699,-0.9656 -3.02778,0.57303 -5.16237,4.05092 -2.47566,4.03359 -3.69767,8.15661 -3.01852,10.18444 0.54006,1.61256 1.47424,2.14444 3.73914,2.12893 2.12704,-0.0146 3.80866,-0.64763 6.67945,-2.51452 1.66456,-1.08247 2.6727,-1.3143 2.91942,-0.67136 0.40619,1.05851 -1.98505,3.43599 -4.97282,4.94421 -2.71974,1.37292 -5.35218,1.82661 -7.56,1.30294 z m -26.78525,-0.34019 c -1.00102,-0.4946 -2.07206,-2.89401 -2.37957,-5.33083 -0.14531,-1.15147 -0.29901,-2.12839 -0.34156,-2.17094 -0.0425,-0.0425 -0.6917,0.63471 -1.44256,1.50503 -5.097966,5.90905 -10.482428,7.32464 -12.29287,3.23184 -1.649103,-3.72807 1.189051,-10.83392 6.372938,-15.95586 2.290109,-2.26273 4.183682,-3.38708 6.083252,-3.61206 1.87581,-0.22216 2.58127,0.036 3.3272,1.21764 0.43316,0.68618 0.91266,1.08745 1.43709,1.20263 1.44053,0.3164 1.4918,0.5906 0.83147,4.44616 -0.77497,4.52496 -0.95582,7.82865 -0.5391,9.8479 0.26514,1.28476 0.52698,1.77788 1.37305,2.58583 1.26224,1.20536 1.25691,1.90371 -0.0211,2.76289 -1.01949,0.68539 -1.46589,0.7354 -2.40826,0.26977 z m -10.504047,-4.06394 c 2.39178,-1.21409 6.010807,-5.18201 7.530037,-8.25596 0.84799,-1.7158 0.96989,-2.20587 0.97911,-3.93623 0.009,-1.76456 -0.0564,-2.03067 -0.6141,-2.48242 -0.34354,-0.27829 -0.91383,-0.50598 -1.26731,-0.50598 -2.55868,0 -7.424923,5.64575 -9.066579,10.51894 -1.294302,3.84207 -0.172132,5.98701 2.438842,4.66165 z m 20.405737,3.87902 c -1.50995,-0.76805 -2.28207,-2.23504 -2.43136,-4.61949 -0.0912,-1.45637 0.0947,-2.89929 0.83642,-6.49387 1.31879,-6.39083 1.39459,-5.96188 -1.05348,-5.96188 -1.79007,0 -2.06198,-0.0676 -2.51357,-0.62462 -0.57501,-0.7093 -0.65793,-1.63152 -0.18886,-2.10059 0.20399,-0.20399 1.24978,-0.3175 2.92529,-0.3175 h 2.60779 l 0.49503,-1.12448 c 0.27227,-0.61846 0.80837,-2.36434 1.19133,-3.87972 0.93274,-3.69084 1.24255,-4.25731 2.32558,-4.25216 0.99699,0.005 1.32698,0.18687 1.73146,0.95566 0.23837,0.45307 0.10873,1.24024 -0.66474,4.03611 -0.52847,1.91029 -0.90529,3.52883 -0.83737,3.59675 0.0679,0.0679 1.20789,0.002 2.53328,-0.14556 1.32538,-0.14798 3.28341,-0.23385 4.35117,-0.19084 l 1.94138,0.0782 0.0795,0.94868 c 0.0522,0.62233 -0.0652,1.06877 -0.34106,1.29774 -0.23669,0.19645 -1.87597,0.49966 -3.74941,0.69353 -4.15959,0.43044 -5.47316,0.62595 -5.87528,0.87448 -0.38262,0.23647 -2.08696,7.65943 -2.31923,10.10102 -0.17528,1.84246 0.15441,3.38458 0.84635,3.95884 0.56488,0.46881 2.24338,0.39367 3.28943,-0.14727 0.49891,-0.258 1.66261,-1.04814 2.58598,-1.75587 1.71946,-1.31789 2.60511,-1.59187 2.8747,-0.88931 0.31079,0.80989 -0.24712,1.89088 -1.71559,3.3241 -2.85613,2.78757 -6.50841,3.86714 -8.92476,2.63804 z m 31.63789,-0.2742 c -0.29104,-0.29104 -0.52916,-0.76168 -0.52916,-1.04587 0,-0.2842 0.40859,-2.75474 0.90798,-5.49011 1.14588,-6.27647 2.06795,-12.24512 2.93464,-18.99631 0.79357,-6.18156 1.28854,-7.61865 2.67041,-7.75318 0.6526,-0.0635 0.96978,0.0924 1.52135,0.7479 1.14432,1.35994 0.92382,3.48988 -1.30042,12.56153 -1.19529,4.87502 -2.76521,12.47087 -2.76521,13.37907 0,0.67095 0.58017,0.0743 1.46322,-1.50471 1.77764,-3.17873 4.68194,-7.30062 6.31849,-8.96744 2.7637,-2.81483 5.25631,-3.57476 6.57703,-2.00518 0.7946,0.94434 1.09911,2.12146 1.64895,6.3743 0.6711,5.19068 1.02259,6.40843 2.52592,8.75117 0.92415,1.44017 0.94813,1.66501 0.2518,2.36133 -0.76353,0.76353 -2.14817,0.69113 -3.1663,-0.16557 -1.5783,-1.32805 -2.14482,-3.12236 -2.66271,-8.43339 -0.33195,-3.40418 -0.45519,-4.02701 -0.95544,-4.82864 -1.22199,-1.9582 -4.06707,1.17361 -9.63303,10.60387 -2.31481,3.92193 -3.2163,4.9404 -4.37293,4.9404 -0.55264,0 -1.1116,-0.20618 -1.43459,-0.52917 z"
|
||||
id="path2"
|
||||
sodipodi:nodetypes="ssssssscsssssssssssssssssssssssssssssssssssscsscssssscsssssssssssssssssssscsssssssssss" /></g></svg>
|
After Width: | Height: | Size: 23 KiB |
88
data/artwork/catch2-logo-full.svg
Normal file
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="132.82083mm"
|
||||
height="64.029167mm"
|
||||
viewBox="0 0 132.82083 64.029167"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4-beta (62f545ba5e, 2024-04-22)"
|
||||
sodipodi:docname="catch2-logo.svg"
|
||||
xml:space="preserve"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="false"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="2.1362654"
|
||||
inkscape:cx="252.77758"
|
||||
inkscape:cy="71.854367"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1411"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-6"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" /><defs
|
||||
id="defs1" /><g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-38.629169,-116.41666)"
|
||||
style="display:inline;opacity:1"><path
|
||||
style="display:inline;fill:#ff2500;fill-opacity:1;stroke:none;stroke-width:0.250889"
|
||||
d="m 81.146047,150.57948 c 0.691236,0.96533 2.035742,1.27689 3.166324,1.10031 0.590818,-0.0922 2.217659,-0.60588 2.217659,-1.07918 v -3.36013 c 0,-0.069 -1.165318,-1.34371 -3.547531,-1.01206 -1.952335,0.21432 -3.085228,2.60709 -1.836452,4.35106 z"
|
||||
id="path19" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.250889"
|
||||
d="m 81.325217,134.80993 c -2.562928,0.34888 -4.598977,2.14544 -6.250134,4.02102 -3.393658,3.85496 -6.461012,8.93964 -6.691599,14.2056 -0.06234,1.42355 0.01809,2.8981 0.508204,4.2484 1.613307,4.44467 6.794341,4.64804 10.641236,3.40234 2.417384,-0.78278 4.907188,-2.27103 6.704505,-4.06615 0.638393,-0.63761 1.628076,-1.70902 1.19425,-2.71876 -0.202704,-0.4718 -0.782987,-0.44442 -1.19425,-0.31091 -0.947618,0.30765 -1.76984,0.95715 -2.588867,1.50289 -2.156496,1.43698 -4.662182,2.65628 -7.301941,2.65526 -1.333335,-5e-4 -2.776062,-0.38616 -3.581718,-1.52678 -0.875345,-1.23926 -0.695536,-2.90697 -0.450943,-4.31477 0.611778,-3.52124 2.533483,-7.18254 4.654937,-10.02357 0.873192,-1.16937 2.144513,-2.99169 3.758888,-3.11367 0.670659,-0.0506 1.116987,0.43373 1.408297,0.98948 0.545003,1.03973 0.573135,2.25152 1.039561,3.31906 0.291107,0.66626 0.981242,1.49322 1.800288,1.09911 1.109752,-0.53395 1.395945,-2.19764 1.39426,-3.28969 -0.0041,-2.67006 -1.897081,-6.50736 -5.044974,-6.07886"
|
||||
id="path14" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
d="m 81.850807,149.10732 v -0.30278 h 0.787228 v -0.81953 h 0.294706 v 0.81953 h 0.771081 v 0.30278 h -0.771081 v 0.80337 h -0.294706 v -0.80337 z"
|
||||
id="path15"
|
||||
sodipodi:nodetypes="ccccccccccccc" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
d="m 83.974659,149.10732 v -0.30278 h 0.787231 v -0.81953 h 0.294707 v 0.81953 h 0.77108 v 0.30278 h -0.77108 v 0.80337 H 84.76189 v -0.80337 z"
|
||||
id="path16"
|
||||
sodipodi:nodetypes="ccccccccccccc" /><path
|
||||
d="m 165.04975,130.34614 c 0.4642,-0.42537 1.08982,-0.66203 1.62919,-1.08343 1.9002,-1.4847 5.14786,-4.48328 4.44823,-6.80658 -0.26492,-0.87983 -1.26145,-1.35951 -2.21547,-1.29658 -0.98523,0.0649 -1.98724,0.50977 -2.64007,0.84484 -0.6864,0.35231 -1.37265,0.32755 -1.59243,0.87281 -0.30817,0.76454 0.49873,1.79683 1.28659,1.69784 0.23602,-0.0295 0.4698,-0.14082 0.56812,-0.35185 0.21882,-0.46933 0.58753,-0.58023 1.34113,-0.93846 0.73235,-0.34812 1.52921,-0.50494 1.03038,0.7483 -0.71596,1.79868 -3.74234,3.95101 -5.65111,5.2911 0,0 -0.87845,0.57891 -1.09797,0.6564 -0.47551,0.16781 -0.91536,0.19794 -0.84393,0.67269 0.0807,0.5363 0.64891,1.04684 1.12086,1.12458 1.12086,0.18468 1.25286,0.0172 3.02378,0.34516 0.68608,0.12686 1.73627,0.72085 2.01516,0.71659 0.4288,-0.006 0.91785,-2e-4 1.19241,-0.36589 0.38604,-0.51416 0.0632,-1.40966 -0.46279,-1.70348 -0.7765,-0.43372 -2.62935,-0.31806 -3.15208,-0.42404"
|
||||
style="display:inline;fill:#ff2500;fill-opacity:1;stroke:none;stroke-width:0.384847"
|
||||
id="path1-4"
|
||||
inkscape:label="path2"
|
||||
sodipodi:nodetypes="csssssssssssssssssc" /><circle
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
id="path20"
|
||||
cx="88.743759"
|
||||
cy="148.09102"
|
||||
r="0.28118241" /><circle
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
id="circle21"
|
||||
cx="88.743759"
|
||||
cy="149.81236"
|
||||
r="0.28118241" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
d="m 86.846836,150.57027 v -3.2857 c 0.179844,0.0571 1.027671,0.55011 1.027671,1.63571 0,1.0856 -0.755414,1.60237 -1.027671,1.64999 z"
|
||||
id="path21"
|
||||
sodipodi:nodetypes="cczc" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
d="m 87.734629,148.36932 0.859248,-0.33398 0.05138,0.23408 -0.91634,0.3397 z"
|
||||
id="path22" /><path
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0366197;stroke-linecap:round"
|
||||
d="m 87.74034,149.53117 0.776462,0.27976 0.102767,-0.18555 -0.853537,-0.35969 z"
|
||||
id="path23" /><path
|
||||
style="display:inline;fill:#000000;stroke-width:0.251618"
|
||||
d="m 53.557529,179.99565 c -0.3637,-0.24337 -0.722092,-0.77863 -0.78984,-1.17963 -0.09983,-0.59091 0.204006,-1.10636 1.297083,-2.20043 5.140978,-5.14565 11.697013,-7.92364 23.168383,-9.81711 0.56754,-0.0937 1.238338,-0.23174 1.490665,-0.30682 1.011859,-0.30107 2.325926,-0.97015 5.000265,-2.54594 2.479307,-1.46091 3.050796,-1.70859 3.942317,-1.70859 0.518171,0 1.150566,0.67347 1.150566,1.22529 0,0.425 -0.679012,1.52428 -1.185643,1.91949 -0.57421,0.44794 -1.656275,1.15781 -2.94583,1.9326 -2.280231,1.36999 -3.014427,1.68943 -5.388463,2.34435 -1.27004,0.35037 -4.122609,1.01365 -6.424451,1.4938 -6.325272,1.31945 -6.291838,1.31134 -7.489532,1.81791 -1.769123,0.74828 -4.248215,2.15803 -7.127375,4.05307 -1.251238,0.82355 -1.316194,0.87715 -1.660467,1.37023 -0.51091,0.73176 -1.212354,1.44725 -1.616051,1.64842 -0.508953,0.25361 -0.996853,0.23763 -1.421627,-0.0466 z m -12.67358,-15.16209 c -1.117114,-0.29682 -1.582673,-0.72112 -1.636159,-1.49113 -0.01411,-0.20337 -0.08617,-0.54929 -0.160079,-0.76872 -0.07391,-0.21941 -0.134398,-0.53487 -0.134398,-0.70099 0,-0.61695 2.410337,-8.2439 3.713963,-11.75198 3.193966,-8.59503 6.760455,-15.28845 11.227138,-21.07057 3.000239,-3.88379 6.730729,-7.60101 10.390169,-10.3532 1.484468,-1.11645 2.957235,-1.93293 3.905921,-2.16542 0.712713,-0.17466 1.633772,-0.11481 2.150608,0.13975 0.218773,0.10778 0.523051,0.31574 0.67617,0.46219 0.312953,0.29934 0.3976,0.61273 0.343077,1.27018 -0.04907,0.5917 -0.25443,0.81335 -1.568046,1.69235 -0.629278,0.42108 -1.886286,1.35259 -2.793347,2.07005 -2.170567,1.71681 -3.189387,2.46922 -4.678307,3.45496 -1.150216,0.76149 -1.306538,0.89075 -2.365342,1.95583 -1.698584,1.70864 -4.618708,5.28287 -5.389113,6.59626 -1.828972,3.11804 -4.78794,9.6032 -6.91187,15.14872 -1.798512,4.69589 -3.846964,10.85701 -4.247495,12.77525 -0.344636,1.65049 -0.602466,2.23034 -1.167259,2.62515 -0.357651,0.24998 -0.721358,0.27984 -1.355631,0.11132 z m 20.716887,-20.76104 c -0.683356,-0.36433 -1.104849,-1.1204 -0.983924,-1.76497 0.05627,-0.29992 0.54589,-1.0378 1.243028,-1.87329 0.699338,-0.83811 3.395984,-3.54431 4.32199,-4.33732 5.249523,-4.4955 11.27839,-7.69801 18.274464,-9.70734 3.519236,-1.01076 5.446721,-1.15198 7.289115,-0.53399 0.676845,0.22703 0.986378,0.41335 1.240742,0.74684 0.610689,0.80066 0.346547,1.87808 -0.575798,2.34864 -0.434322,0.22155 -1.334341,0.4329 -4.661064,1.09445 -8.719062,1.73387 -11.376528,2.63789 -16.108419,5.47979 -1.234418,0.74136 -3.203445,2.2573 -4.93395,3.79859 -1.060656,0.94467 -1.416377,1.36021 -1.993509,2.32877 -0.658285,1.10475 -0.91811,1.48204 -1.286545,1.86821 -0.58619,0.6144 -1.302525,0.83079 -1.82613,0.55162 z m -4.866609,-1.8552 c -0.169358,-0.0598 -0.441793,-0.24795 -0.643122,-0.44412 -0.393278,-0.38317 -0.535787,-0.75247 -0.464232,-1.20299 0.125276,-0.7887 1.684629,-3.43102 3.301847,-5.59497 4.280257,-5.7273 10.433175,-10.52319 17.539062,-13.67083 2.257142,-0.99983 3.606682,-1.36208 5.092658,-1.367 1.551331,-0.005 2.533355,0.27242 3.053214,0.86301 0.700352,0.79565 0.711968,1.62161 0.03125,2.22082 -0.386196,0.33993 -1.209978,0.66386 -4.58236,1.80187 -8.015835,2.70495 -10.715836,4.06305 -14.717787,7.40307 -1.428546,1.19226 -3.325785,3.23175 -4.724883,5.07912 -0.630645,0.83273 -0.860401,1.26441 -1.275526,2.39667 -0.573656,1.56462 -0.972669,2.18868 -1.580271,2.47163 -0.386663,0.18004 -0.616285,0.18979 -1.02984,0.0437 z"
|
||||
id="path1"
|
||||
sodipodi:nodetypes="sssssssssssssssssscssssssssssssssssssssscssssssssssssssssssssssss" /><path
|
||||
style="fill:#000000"
|
||||
d="m 95.04775,44.190968 c -1.470062,-0.348685 -2.86219,-1.463789 -3.53601,-2.832367 -0.530096,-1.076667 -0.610204,-1.737477 -0.616532,-3.787771 -0.01096,-3.55286 1.285971,-6.980203 3.998224,-10.784456 3.434108,-4.81674 7.249158,-6.896758 9.529308,-5.195505 1.72479,1.286898 2.67857,4.714164 1.81712,6.529548 -0.91147,1.920769 -2.00698,1.488854 -2.77637,-1.094605 -0.2958,-0.993237 -0.76382,-2.010416 -1.04004,-2.260399 -1.06699,-0.965607 -3.02778,0.573029 -5.162374,4.05092 -2.47566,4.033589 -3.697664,8.156608 -3.01852,10.184435 0.540066,1.612562 1.474242,2.144447 3.739143,2.12893 2.127041,-0.01457 3.808661,-0.647627 6.679451,-2.514514 1.66456,-1.082469 2.6727,-1.314304 2.91942,-0.671359 0.40619,1.058506 -1.98505,3.435985 -4.97282,4.944207 -2.719738,1.372918 -5.35218,1.826609 -7.56,1.302936 z M 68.262499,43.850784 c -1.001018,-0.494607 -2.072065,-2.894018 -2.379571,-5.330829 -0.145306,-1.151471 -0.299007,-2.128397 -0.341557,-2.170948 -0.04255,-0.04255 -0.691704,0.634714 -1.442562,1.505034 -5.097967,5.90905 -10.482429,7.324644 -12.292871,3.231839 -1.649103,-3.72807 1.189051,-10.833924 6.372938,-15.955855 2.290109,-2.262738 4.183677,-3.387085 6.08325,-3.612061 1.875807,-0.222162 2.581271,0.03601 3.327199,1.217639 0.433165,0.686179 0.912665,1.087449 1.437088,1.202632 1.44053,0.316394 1.491808,0.590591 0.831478,4.446159 -0.774974,4.524958 -0.955828,7.828642 -0.539105,9.847894 0.265143,1.284765 0.526984,1.777882 1.373056,2.58583 1.262237,1.205362 1.25691,1.903716 -0.02107,2.762891 -1.019495,0.685396 -1.465899,0.735403 -2.408269,0.269775 z M 57.758451,39.78684 c 2.39178,-1.214093 6.010805,-5.182007 7.530034,-8.255959 0.847994,-1.715798 0.969897,-2.205874 0.979113,-3.93623 0.0094,-1.764565 -0.05643,-2.03067 -0.614098,-2.482417 -0.343543,-0.278293 -0.913833,-0.505987 -1.267311,-0.505987 -2.558681,0 -7.424924,5.645757 -9.06658,10.51894 -1.294302,3.842075 -0.172132,5.987013 2.438842,4.661653 z m 20.405739,3.879018 c -1.509951,-0.768049 -2.282068,-2.235036 -2.431367,-4.619485 -0.09119,-1.456372 0.09466,-2.899291 0.836427,-6.49387 1.318788,-6.390829 1.394584,-5.961881 -1.053485,-5.961881 -1.790069,0 -2.061979,-0.06757 -2.513567,-0.624624 -0.57501,-0.709301 -0.657928,-1.631522 -0.188865,-2.100585 0.203993,-0.203993 1.249787,-0.3175 2.925294,-0.3175 h 2.607794 l 0.495029,-1.124479 c 0.272266,-0.618463 0.808364,-2.364341 1.191329,-3.879728 0.932738,-3.690834 1.242549,-4.257301 2.325577,-4.252158 0.99699,0.0047 1.326986,0.186873 1.731464,0.955664 0.23837,0.453069 0.108725,1.240237 -0.664738,4.036104 -0.528474,1.910294 -0.905292,3.528832 -0.837374,3.596751 0.06792,0.06792 1.207892,0.0024 2.533275,-0.145559 1.325383,-0.147975 3.28341,-0.233853 4.351172,-0.190841 l 1.941386,0.07821 0.07952,0.948687 c 0.05217,0.622322 -0.06516,1.068768 -0.341058,1.29774 -0.236699,0.196443 -1.875978,0.499659 -3.749412,0.693525 -4.159592,0.430442 -5.473168,0.625955 -5.875288,0.874479 -0.382617,0.23647 -2.086955,7.659434 -2.319229,10.101025 -0.175277,1.842453 0.154409,3.384573 0.846351,3.958834 0.564887,0.468815 2.243378,0.393671 3.289429,-0.147263 0.498916,-0.258 1.662611,-1.048142 2.585987,-1.755871 1.719461,-1.317895 2.605103,-1.591876 2.874701,-0.889315 0.310783,0.809889 -0.247128,1.890887 -1.715596,3.324104 -2.856133,2.787571 -6.508412,3.867137 -8.92476,2.638041 z m 31.63789,-0.274194 c -0.29104,-0.291042 -0.52916,-0.761687 -0.52916,-1.045878 0,-0.284191 0.40859,-2.754738 0.90798,-5.490105 1.14588,-6.276471 2.06795,-12.245122 2.93464,-18.996309 0.79357,-6.181563 1.28854,-7.618653 2.67041,-7.753186 0.6526,-0.06353 0.96978,0.09239 1.52135,0.747904 1.14432,1.359943 0.92382,3.489885 -1.30042,12.561532 -1.19529,4.87502 -2.76521,12.47087 -2.76521,13.379072 0,0.670944 0.58017,0.07431 1.46322,-1.504712 1.77764,-3.17873 4.68194,-7.300625 6.31849,-8.967446 2.7637,-2.814823 5.25631,-3.574759 6.57703,-2.005173 0.7946,0.944334 1.09911,2.121456 1.64895,6.3743 0.6711,5.190681 1.02259,6.408426 2.52592,8.751165 0.92415,1.440168 0.94813,1.66501 0.2518,2.361335 -0.76353,0.763532 -2.14817,0.691125 -3.1663,-0.165573 -1.5783,-1.32805 -2.14482,-3.122356 -2.66271,-8.433385 -0.33195,-3.404186 -0.45519,-4.027014 -0.95544,-4.828646 -1.22199,-1.958203 -4.06707,1.173608 -9.63303,10.60387 -2.31481,3.921927 -3.2163,4.940401 -4.37293,4.940401 -0.55264,0 -1.1116,-0.206177 -1.43459,-0.529166 z"
|
||||
id="path2"
|
||||
sodipodi:nodetypes="ssssssscsssssssssssssssssssssssssssssssssssscsscssssscsssssssssssssssssssscsssssssssss"
|
||||
transform="translate(38.629169,116.41666)" /></g></svg>
|
After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 20 KiB |
@@ -32,6 +32,7 @@ Once you're up and running consider the following reference material.
|
||||
* [CMake integration](cmake-integration.md#top)
|
||||
* [Tooling integration (CI, test runners, other)](ci-and-misc.md#top)
|
||||
* [Known limitations](limitations.md#top)
|
||||
* [Thread safety in Catch2](thread-safety.md#top)
|
||||
|
||||
**Other:**
|
||||
* [Why Catch2?](why-catch.md#top)
|
||||
|
@@ -52,7 +52,7 @@ Include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
Catch2
|
||||
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
|
||||
GIT_TAG v3.4.0 # or a later release
|
||||
GIT_TAG v3.8.1 # or a later release
|
||||
)
|
||||
|
||||
FetchContent_MakeAvailable(Catch2)
|
||||
|
@@ -123,7 +123,7 @@ specs. You can:
|
||||
This allows test cases that are tagged with **either** "[some-tag]" **or**
|
||||
"[other-tag]". A test case with both will obviously also pass the filter.
|
||||
|
||||
Note that commas take precendence over simple concatenation. This means
|
||||
Note that commas take precedence over simple concatenation. This means
|
||||
that `[a][b],[c]` accepts tests that are tagged with either both "[a]" and
|
||||
"[b]", or tests that are tagged with just "[c]".
|
||||
|
||||
@@ -398,18 +398,24 @@ use test specs to filter this list down to what you want first.
|
||||
Test cases are ordered one of three ways:
|
||||
|
||||
### decl
|
||||
Declaration order (this is the default order if no --order argument is provided).
|
||||
Declaration order.
|
||||
|
||||
Tests in the same translation unit are sorted using their declaration orders,
|
||||
different TUs are sorted in an implementation (linking) dependent order.
|
||||
|
||||
|
||||
### lex
|
||||
Lexicographic order. Tests are sorted by their name, their tags are ignored.
|
||||
Lexicographic order.
|
||||
|
||||
Tests are sorted by their name, their tags are ignored.
|
||||
|
||||
|
||||
### rand
|
||||
Randomized order. The default order.
|
||||
|
||||
Randomly ordered. The order is dependent on Catch2's random seed (see
|
||||
> Randomized order has been made default in Catch2 3.9.0
|
||||
|
||||
The order is dependent on Catch2's random seed (see
|
||||
[`--rng-seed`](#rng-seed)), and is subset invariant. What this means
|
||||
is that as long as the random seed is fixed, running only some tests
|
||||
(e.g. via tag) does not change their relative order.
|
||||
|
@@ -10,12 +10,13 @@
|
||||
[Default reporter](#default-reporter)<br>
|
||||
[Bazel support](#bazel-support)<br>
|
||||
[C++11 toggles](#c11-toggles)<br>
|
||||
[C++17 toggles](#c17-toggles)<br>
|
||||
[Other toggles](#other-toggles)<br>
|
||||
[Enabling stringification](#enabling-stringification)<br>
|
||||
[Disabling exceptions](#disabling-exceptions)<br>
|
||||
[Disabling deprecation warnings](#disabling-deprecation-warnings)<br>
|
||||
[Overriding Catch's debug break (`-b`)](#overriding-catchs-debug-break--b)<br>
|
||||
[Static analysis support](#static-analysis-support)<br>
|
||||
[Experimental thread safety](#experimental-thread-safety)<br>
|
||||
|
||||
Catch2 is designed to "just work" as much as possible, and most of the
|
||||
configuration options below are changed automatically during compilation,
|
||||
@@ -126,23 +127,6 @@ Catch's selection, by defining either `CATCH_CONFIG_CPP11_TO_STRING` or
|
||||
`CATCH_CONFIG_NO_CPP11_TO_STRING`.
|
||||
|
||||
|
||||
## C++17 toggles
|
||||
|
||||
CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS // Override std::uncaught_exceptions (instead of std::uncaught_exception) support detection
|
||||
CATCH_CONFIG_CPP17_STRING_VIEW // Override std::string_view support detection (Catch provides a StringMaker specialization by default)
|
||||
CATCH_CONFIG_CPP17_VARIANT // Override std::variant support detection (checked by CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER)
|
||||
CATCH_CONFIG_CPP17_OPTIONAL // Override std::optional support detection (checked by CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER)
|
||||
CATCH_CONFIG_CPP17_BYTE // Override std::byte support detection (Catch provides a StringMaker specialization by default)
|
||||
|
||||
> `CATCH_CONFIG_CPP17_STRING_VIEW` was [introduced](https://github.com/catchorg/Catch2/issues/1376) in Catch2 2.4.1.
|
||||
|
||||
Catch contains basic compiler/standard detection and attempts to use
|
||||
some C++17 features whenever appropriate. This automatic detection
|
||||
can be manually overridden in both directions, that is, a feature
|
||||
can be enabled by defining the macro in the table above, and disabled
|
||||
by using `_NO_` in the macro, e.g. `CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS`.
|
||||
|
||||
|
||||
## Other toggles
|
||||
|
||||
CATCH_CONFIG_COUNTER // Use __COUNTER__ to generate unique names for test cases
|
||||
@@ -164,7 +148,7 @@ by using `_NO_` in the macro, e.g. `CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS`.
|
||||
|
||||
> `CATCH_CONFIG_GETENV` was [introduced](https://github.com/catchorg/Catch2/pull/2562) in Catch2 3.2.0
|
||||
|
||||
> `CATCH_CONFIG_USE_BUILTIN_CONSTANT_P` was introduced in Catch2 vX.Y.Z
|
||||
> `CATCH_CONFIG_USE_BUILTIN_CONSTANT_P` was introduced in Catch2 3.8.0
|
||||
|
||||
Currently Catch enables `CATCH_CONFIG_WINDOWS_SEH` only when compiled with MSVC, because some versions of MinGW do not have the necessary Win32 API support.
|
||||
|
||||
@@ -219,8 +203,8 @@ By default, Catch does not stringify some types from the standard library. This
|
||||
|
||||
CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER // Provide StringMaker specialization for std::pair
|
||||
CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER // Provide StringMaker specialization for std::tuple
|
||||
CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER // Provide StringMaker specialization for std::variant, std::monostate (on C++17)
|
||||
CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER // Provide StringMaker specialization for std::optional (on C++17)
|
||||
CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER // Provide StringMaker specialization for std::variant, std::monostate
|
||||
CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER // Provide StringMaker specialization for std::optional
|
||||
CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS // Defines all of the above
|
||||
|
||||
> `CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER` was [introduced](https://github.com/catchorg/Catch2/issues/1380) in Catch2 2.4.1.
|
||||
@@ -263,6 +247,21 @@ namespace Catch {
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Disabling deprecation warnings
|
||||
|
||||
> Introduced in Catch2 3.9.0
|
||||
|
||||
Catch2 has started using the C++ macro `[[deprecated]]` to mark things
|
||||
that are deprecated and should not be used any more. If you need to
|
||||
temporarily disable these warnings, use
|
||||
|
||||
CATCH_CONFIG_NO_DEPRECATION_ANNOTATIONS
|
||||
|
||||
Catch2 currently does not support more fine-grained deprecation warning
|
||||
control, nor do we plan to.
|
||||
|
||||
|
||||
## Overriding Catch's debug break (`-b`)
|
||||
|
||||
> [Introduced](https://github.com/catchorg/Catch2/pull/1846) in Catch2 2.11.2.
|
||||
@@ -299,6 +298,21 @@ no backwards compatibility guarantees._
|
||||
are not meant to be runnable, only "scannable".
|
||||
|
||||
|
||||
## Experimental thread safety
|
||||
|
||||
> Introduced in Catch2 3.9.0
|
||||
|
||||
Catch2 can optionally support thread-safe assertions, that means, multiple
|
||||
user-spawned threads can use the assertion macros at the same time. Due
|
||||
to the performance cost this imposes even on single-threaded usage, Catch2
|
||||
defaults to non-thread-safe assertions.
|
||||
|
||||
CATCH_CONFIG_EXPERIMENTAL_THREAD_SAFE_ASSERTIONS // enables thread safe assertions
|
||||
CATCH_CONFIG_NO_EXPERIMENTAL_THREAD_SAFE_ASSERTIONS // force-disables thread safe assertions
|
||||
|
||||
See [the documentation on thread safety in Catch2](thread-safety.md#top)
|
||||
for details on which macros are safe and other notes.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
@@ -211,16 +211,10 @@ and so on.
|
||||
|
||||
### C++ standard version
|
||||
|
||||
Catch2 currently targets C++14 as the minimum supported C++ version.
|
||||
Catch2 currently targets C++17 as the minimum supported C++ version.
|
||||
Features from higher language versions should be used only sparingly,
|
||||
when the benefits from using them outweigh the maintenance overhead.
|
||||
|
||||
Example of good use of polyfilling features is our use of `conjunction`,
|
||||
where if available we use `std::conjunction` and otherwise provide our
|
||||
own implementation. The reason it is good is that the surface area for
|
||||
maintenance is quite small, and `std::conjunction` can directly use
|
||||
compiler built-ins, thus providing significant compilation benefits.
|
||||
|
||||
Example of bad use of polyfilling features would be to keep around two
|
||||
sets of metaprogramming in the stringification implementation, once
|
||||
using C++14 compliant TMP and once using C++17's `if constexpr`. While
|
||||
|
@@ -38,7 +38,7 @@ macro](skipping-passing-failing.md#top).
|
||||
|
||||
### Non-const function for `TEST_CASE_METHOD`
|
||||
|
||||
> Deprecated in Catch2 vX.Y.Z
|
||||
> Deprecated in Catch2 3.7.0
|
||||
|
||||
Currently, the member function generated for `TEST_CASE_METHOD` is
|
||||
not `const` qualified. In the future, the generated member function will
|
||||
|
@@ -21,7 +21,10 @@ The "Generators" `TEST_CASE` will be entered 3 times, and the value of
|
||||
`i` will be 1, 3, and 5 in turn. `GENERATE`s can also be used multiple
|
||||
times at the same scope, in which case the result will be a cartesian
|
||||
product of all elements in the generators. This means that in the snippet
|
||||
below, the test case will be run 6 (2\*3) times.
|
||||
below, the test case will be run 6 (2\*3) times. The `GENERATE` macro
|
||||
is defined in the `catch_generators.hpp` header, so compiling
|
||||
the code examples below also requires
|
||||
`#include <catch2/generators/catch_generators.hpp>`.
|
||||
|
||||
```cpp
|
||||
TEST_CASE("Generators") {
|
||||
@@ -103,7 +106,7 @@ a test case,
|
||||
* 2 fundamental generators
|
||||
* `SingleValueGenerator<T>` -- contains only single element
|
||||
* `FixedValuesGenerator<T>` -- contains multiple elements
|
||||
* 5 generic generators that modify other generators
|
||||
* 5 generic generators that modify other generators (defined in `catch2/generators/catch_generators_adapters.hpp`)
|
||||
* `FilterGenerator<T, Predicate>` -- filters out elements from a generator
|
||||
for which the predicate returns "false"
|
||||
* `TakeGenerator<T>` -- takes first `n` elements from a generator
|
||||
@@ -111,9 +114,10 @@ a test case,
|
||||
* `MapGenerator<T, U, Func>` -- returns the result of applying `Func`
|
||||
on elements from a different generator
|
||||
* `ChunkGenerator<T>` -- returns chunks (inside `std::vector`) of n elements from a generator
|
||||
* 4 specific purpose generators
|
||||
* 2 random generators (defined in `catch2/generators/catch_generators_random.hpp`)
|
||||
* `RandomIntegerGenerator<Integral>` -- generates random Integrals from range
|
||||
* `RandomFloatGenerator<Float>` -- generates random Floats from range
|
||||
* 2 range generators (defined in `catch2/generators/catch_generators_range.hpp`)
|
||||
* `RangeGenerator<T>(first, last)` -- generates all values inside a `[first, last)` arithmetic range
|
||||
* `IteratorGenerator<T>` -- copies and returns values from an iterator range
|
||||
|
||||
@@ -216,8 +220,8 @@ For floating point generators, the situation is much more complex.
|
||||
Generally Catch2 only promises reproducibility (or even just correctness!)
|
||||
on platforms that obey the IEEE-754 standard. Furthermore, reproducibility
|
||||
only applies between binaries that perform floating point math in the
|
||||
same way, e.g. if you compile a binary targetting the x87 FPU and another
|
||||
one targetting SSE2 for floating point math, their results will vary.
|
||||
same way, e.g. if you compile a binary targeting the x87 FPU and another
|
||||
one targeting SSE2 for floating point math, their results will vary.
|
||||
Similarly, binaries compiled with compiler flags that relax the IEEE-754
|
||||
adherence, e.g. `-ffast-math`, might provide different results than those
|
||||
compiled for strict IEEE-754 adherence.
|
||||
|
@@ -57,40 +57,6 @@ again.
|
||||
## Features
|
||||
This section outlines some missing features, what is their status and their possible workarounds.
|
||||
|
||||
### Thread safe assertions
|
||||
Catch2's assertion macros are not thread safe. This does not mean that
|
||||
you cannot use threads inside Catch's test, but that only single thread
|
||||
can interact with Catch's assertions and other macros.
|
||||
|
||||
This means that this is ok
|
||||
```cpp
|
||||
std::vector<std::thread> threads;
|
||||
std::atomic<int> cnt{ 0 };
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
threads.emplace_back([&]() {
|
||||
++cnt; ++cnt; ++cnt; ++cnt;
|
||||
});
|
||||
}
|
||||
for (auto& t : threads) { t.join(); }
|
||||
REQUIRE(cnt == 16);
|
||||
```
|
||||
because only one thread passes the `REQUIRE` macro and this is not
|
||||
```cpp
|
||||
std::vector<std::thread> threads;
|
||||
std::atomic<int> cnt{ 0 };
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
threads.emplace_back([&]() {
|
||||
++cnt; ++cnt; ++cnt; ++cnt;
|
||||
CHECK(cnt == 16);
|
||||
});
|
||||
}
|
||||
for (auto& t : threads) { t.join(); }
|
||||
REQUIRE(cnt == 16);
|
||||
```
|
||||
|
||||
We currently do not plan to support thread-safe assertions.
|
||||
|
||||
|
||||
### Process isolation in a test
|
||||
Catch does not support running tests in isolated (forked) processes. While this might in the future, the fact that Windows does not support forking and only allows full-on process creation and the desire to keep code as similar as possible across platforms, mean that this is likely to take significant development time, that is not currently available.
|
||||
|
||||
@@ -187,5 +153,5 @@ but only when compiled with a C++20 conforming compiler. MSVC is currently
|
||||
not conformant enough, but `clang-cl` will compile the assertion above
|
||||
using MSVC STL without problem.
|
||||
|
||||
This change got in with MSVC v19.37](https://godbolt.org/z/KG9obzdvE).
|
||||
[This change got in with MSVC v19.37](https://godbolt.org/z/KG9obzdvE).
|
||||
|
||||
|
@@ -1,32 +1,30 @@
|
||||
<a id="top"></a>
|
||||
# Logging macros
|
||||
|
||||
Additional messages can be logged during a test case. Note that the messages logged with `INFO` are scoped and thus will not be reported if failure occurs in scope preceding the message declaration. An example:
|
||||
Catch2 provides various macros for logging extra information when
|
||||
running a test. These macros default to being scoped, and associate with
|
||||
all assertions in the scope, regardless of whether they pass or fail.
|
||||
|
||||
**example**
|
||||
```cpp
|
||||
TEST_CASE("Foo") {
|
||||
TEST_CASE("Simple info") {
|
||||
INFO("Test case start");
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
INFO("The number is " << i);
|
||||
CHECK(i == 0);
|
||||
SECTION("A") {
|
||||
INFO("Section A");
|
||||
CHECK(false); // 1
|
||||
}
|
||||
SECTION("B") {
|
||||
INFO("Section B");
|
||||
CHECK(false); // 2
|
||||
}
|
||||
CHECK(false); // 3
|
||||
}
|
||||
```
|
||||
The first assertion will report messages "Test case start", and "Section A"
|
||||
as extra information. The second one will report messages "Test case
|
||||
started" and "Section B", while the third one will only report "Test case
|
||||
started" as the extra info.
|
||||
|
||||
TEST_CASE("Bar") {
|
||||
INFO("Test case start");
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
INFO("The number is " << i);
|
||||
CHECK(i == i);
|
||||
}
|
||||
CHECK(false);
|
||||
}
|
||||
```
|
||||
When the `CHECK` fails in the "Foo" test case, then two messages will be printed.
|
||||
```
|
||||
Test case start
|
||||
The number is 1
|
||||
```
|
||||
When the last `CHECK` fails in the "Bar" test case, then only one message will be printed: `Test case start`.
|
||||
|
||||
## Logging without local scope
|
||||
|
||||
|
@@ -72,8 +72,8 @@ including the Catch2 header.
|
||||
Example:
|
||||
```cpp
|
||||
TEST_CASE("STATIC_REQUIRE showcase", "[traits]") {
|
||||
STATIC_REQUIRE( std::is_void<void>::value );
|
||||
STATIC_REQUIRE_FALSE( std::is_void<int>::value );
|
||||
STATIC_REQUIRE( std::is_void_v<void> );
|
||||
STATIC_REQUIRE_FALSE( std::is_void_v<int> );
|
||||
}
|
||||
```
|
||||
|
||||
@@ -86,8 +86,8 @@ becomes equivalent to `CHECK` instead of `REQUIRE`.
|
||||
Example:
|
||||
```cpp
|
||||
TEST_CASE("STATIC_CHECK showcase", "[traits]") {
|
||||
STATIC_CHECK( std::is_void<void>::value );
|
||||
STATIC_CHECK_FALSE( std::is_void<int>::value );
|
||||
STATIC_CHECK( std::is_void_v<void> );
|
||||
STATIC_CHECK_FALSE( std::is_void_v<int> );
|
||||
}
|
||||
```
|
||||
|
||||
|
@@ -57,17 +57,18 @@ int main( int argc, char* argv[] ) {
|
||||
|
||||
int returnCode = session.applyCommandLine( argc, argv );
|
||||
if( returnCode != 0 ) // Indicates a command line error
|
||||
return returnCode;
|
||||
return returnCode;
|
||||
|
||||
// writing to session.configData() or session.Config() here
|
||||
// overrides command line args
|
||||
// only do this if you know you need to
|
||||
|
||||
int numFailed = session.run();
|
||||
returnCode = session.run();
|
||||
|
||||
// returnCode encodes the type of error that occured. See the
|
||||
// integer constants in catch_session.hpp for more information
|
||||
// on what each return code means.
|
||||
|
||||
// numFailed is clamped to 255 as some unices only use the lower 8 bits.
|
||||
// This clamping has already been applied, so just return it here
|
||||
// You can also do any post run clean-up here
|
||||
return numFailed;
|
||||
}
|
||||
```
|
||||
|
@@ -2,6 +2,9 @@
|
||||
|
||||
# Release notes
|
||||
**Contents**<br>
|
||||
[3.10.0](#3100)<br>
|
||||
[3.9.1](#391)<br>
|
||||
[3.9.0](#390)<br>
|
||||
[3.8.1](#381)<br>
|
||||
[3.8.0](#380)<br>
|
||||
[3.7.1](#371)<br>
|
||||
@@ -67,6 +70,71 @@
|
||||
[Even Older versions](#even-older-versions)<br>
|
||||
|
||||
|
||||
## 3.10.0
|
||||
|
||||
### Fixes
|
||||
* pkg-config files will take `DESTDIR` env var into account when selecting install destination (#3006, #3019)
|
||||
* Changed `filter` to store the provided predicate by value (#3002, #3005)
|
||||
* This is done to avoid dangling-by-default behaviour when `filter` is used inside `GENERATE_COPY`/`GENERATE_REF`.
|
||||
|
||||
### Improvements
|
||||
* Escaping XML and JSON output is faster when the strings do not need escaping.
|
||||
* The improvement starts at about 3x throughput, up to 10x for long strings.
|
||||
* Message macros (`INFO`, `CAPTURE`, `WARN`, `SUCCEED`, etc) are now thread safe.
|
||||
|
||||
|
||||
## 3.9.1
|
||||
|
||||
### Fixes
|
||||
* Fixed bad error reporting for multiple nested assertions (#1292)
|
||||
* Fixed W4702 (unreachable code) in the polyfill for std::unreachable (#3007)
|
||||
* Fixed decomposition of assertions comparing enum-backed bitfields (#3001)
|
||||
* Fixed StringMaker specialization for `time_point<system_clock>` with non-default duration type (#2685)
|
||||
|
||||
### Improvements
|
||||
* Exceptions thrown during stringification of decomposed expression no longer fail the assertion (#2980)
|
||||
* The selection logic for `CATCH_TRAP` prefers `__builtin_debugtrap` on all platforms when Catch2 is compiled with Clang
|
||||
|
||||
|
||||
## 3.9.0
|
||||
|
||||
### Improvements
|
||||
* **Added experimental opt-in support for thread safe assertions**
|
||||
* Read the documentation for full details
|
||||
* **The default test run order has been changed to random**
|
||||
* Passing assertions are significantly faster when the reporter does not ask for `assertionEnded` events on passing assertions.
|
||||
* This is the default behaviour of e.g. Console or Compact reporter
|
||||
* Simple `REQUIRE(true)` is 60% faster in Release and 80% faster in Debug build configuration
|
||||
* Simple `REQUIRE_NOTHROW` is 230% faster in Release and 430% faster in Debug build configuration
|
||||
* Simple `REQUIRE_THROWS` is ~3% faster in Release and 20% faster in Debug build configuration (throwing introduces enough overhead that the optimizations inside Catch2 are mostly irrelevant)
|
||||
* Small (2-5%) improvement if the reporter asks for `assertionEnded` events for passing assertions.
|
||||
* The exit code constants are part of the Session API. (#2955, #2976)
|
||||
* Suppressed unsigned integer overflow checking in locations with intended overflow (#2965)
|
||||
* Reporters flush output after writing metadata, e.g. rng seed (#2964)
|
||||
* Added unreachable after `FAIL` and `SKIP` macros (#2941)
|
||||
* This allows the compiler to understand that the execution does not continue past the macro, and avoids warnings.
|
||||
* Added fast path for `assertionStarting` event when no reporter requires it
|
||||
* For backwards compatibility, this fast path is opt-in
|
||||
* A reporter can opt in by changing its `ReporterPreferences::shouldReportAllAssertionStarts`
|
||||
* Improved last seen source location tracking to be more precise
|
||||
* This is used when reporting unexpected exceptions from tests
|
||||
|
||||
### Fixes
|
||||
* Fixed formatting of tags with more than 100 tests in the default `--list-tags` output (#2963)
|
||||
* Fixed Clang-Tidy's `readability-static-accessed-through-instance` in tests
|
||||
* Fixed most of Clang-Tidy's `cppcoreguidelines-avoid-non-const-global-variables` (#2582)
|
||||
* The lifetime of scoped messages now strictly obeys their scope (#1759, #2019, #2959)
|
||||
* Previously Catch2 would try to keep them around during unexpected exception, to provide helpful context.
|
||||
* The amount of surprises the irregularities caused was not worth the occasional utility provided.
|
||||
* `TEMPLATE_TEST_CASE_SIG` can handle signatures consisting of only types (#2680, #2995)
|
||||
* Moved `catch_test_run_info.hpp` up from `internal/` subfolder into the main one (#2972)
|
||||
|
||||
### Miscellaneous
|
||||
* pkg-config files are now generated at install time (#2979)
|
||||
* This fixes missing debug suffix in library names
|
||||
* This fixes install prefix mismatch between build config and actuall installation
|
||||
|
||||
|
||||
## 3.8.1
|
||||
|
||||
### Fixes
|
||||
@@ -93,7 +161,7 @@
|
||||
* Removed redundant `CTEST_FILE` param when creating the indirection file for `PRE_TEST` discovery mode (#2936)
|
||||
* Rewrote the test discovery logic to use output from the JSON reporter
|
||||
* This means that `catch_discover_tests` now requires CMake 3.19 or newer
|
||||
* Added `ADD_TAGS_AS_LABELS` option. If specified, each CTest test will be labeled with corrensponding Catch2's test tag
|
||||
* Added `ADD_TAGS_AS_LABELS` option. If specified, each CTest test will be labeled with corresponding Catch2's test tag
|
||||
* Bumped up the minimum required CMake version to build Catch2 to 3.16
|
||||
* Meson build now provides option to avoid installing Catch2
|
||||
* Bazel build is moved to Bzlmod.
|
||||
@@ -175,7 +243,7 @@
|
||||
### Improvements
|
||||
* Reintroduced support for GCC 5 and 6 (#2836)
|
||||
* As with VS2017, if they start causing trouble again, they will be dropped again.
|
||||
* Added workaround for targetting newest MacOS (Sonoma) using GCC (#2837, #2839)
|
||||
* Added workaround for targeting newest MacOS (Sonoma) using GCC (#2837, #2839)
|
||||
* `CATCH_CONFIG_DEFAULT_REPORTER` can now be an arbitrary reporter spec
|
||||
* Previously it could only be a plain reporter name, so it was impossible to compile in custom arguments to the reporter.
|
||||
* Improved performance of generating 64bit random integers by 20+%
|
||||
|
@@ -109,10 +109,10 @@ and then `assertionEnded` event is emitted.
|
||||
> [Introduced](https://github.com/catchorg/Catch2/issues/1616) in Catch2 2.9.0.
|
||||
|
||||
```cpp
|
||||
void benchmarkPreparing( StringRef name ) override;
|
||||
void benchmarkPreparing( std::string_view name ) override;
|
||||
void benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) override;
|
||||
void benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) override;
|
||||
void benchmarkFailed( StringRef error ) override;
|
||||
void benchmarkFailed( std::string_view error ) override;
|
||||
```
|
||||
|
||||
Due to the benchmark lifecycle being bit more complicated, the benchmarking
|
||||
@@ -153,9 +153,9 @@ void listTags( std::vector<TagInfo> const& tagInfos );
|
||||
## Miscellaneous events
|
||||
|
||||
```cpp
|
||||
void reportInvalidTestSpec( StringRef unmatchedSpec );
|
||||
void fatalErrorEncountered( StringRef error );
|
||||
void noMatchingTestCases( StringRef unmatchedSpec );
|
||||
void reportInvalidTestSpec( std::string_view unmatchedSpec );
|
||||
void fatalErrorEncountered( std::string_view error );
|
||||
void noMatchingTestCases( std::string_view unmatchedSpec );
|
||||
```
|
||||
|
||||
These are one-off events that do not neatly fit into other categories.
|
||||
|
@@ -154,7 +154,7 @@ and calls itself "partial" reporter, so it can be invoked with
|
||||
|
||||
Each reporter instance contains instance of `ReporterPreferences`, a type
|
||||
that holds flags for the behaviour of Catch2 when this reporter run.
|
||||
Currently there are two customization options:
|
||||
Currently there are three customization options:
|
||||
|
||||
* `shouldRedirectStdOut` - whether the reporter wants to handle
|
||||
writes to stdout/stderr from user code, or not. This is useful for
|
||||
@@ -165,6 +165,11 @@ Currently there are two customization options:
|
||||
assertions. Usually reporters do not report successful assertions
|
||||
and don't need them for their output, but sometimes the desired output
|
||||
format includes passing assertions even without the `-s` flag.
|
||||
* `shouldReportAllAssertionStarts` - whether the reporter wants to handle
|
||||
`assertionStarting` events. Most reporters do not, and opting out
|
||||
explicitly enables a fast-path in Catch2's handling of assertions.
|
||||
|
||||
> `shouldReportAllAssertionStarts` was introduced in Catch2 3.9.0
|
||||
|
||||
|
||||
### Per-reporter configuration
|
||||
|
@@ -52,6 +52,20 @@ TEST_CASE("failing test") {
|
||||
}
|
||||
```
|
||||
|
||||
Same applies for a `SKIP` nested inside an assertion:
|
||||
|
||||
```cpp
|
||||
static bool do_skip() {
|
||||
SKIP();
|
||||
return true;
|
||||
}
|
||||
|
||||
TEST_CASE("Another failing test") {
|
||||
CHECK(do_skip());
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### Interaction with Sections and Generators
|
||||
|
||||
Sections, nested sections as well as specific outputs from [generators](generators.md#top)
|
||||
|
@@ -264,7 +264,7 @@ You can also have different arities in the _template-arg_ packs:
|
||||
```cpp
|
||||
TEMPLATE_PRODUCT_TEST_CASE("Product with differing arities", "[template][product]", std::tuple, (int, (int, double), (int, double, float))) {
|
||||
TestType x;
|
||||
REQUIRE(std::tuple_size<TestType>::value >= 1);
|
||||
REQUIRE(std::tuple_size_v<TestType> >= 1);
|
||||
}
|
||||
```
|
||||
|
||||
|
@@ -4,7 +4,7 @@
|
||||
**Contents**<br>
|
||||
[Non-Templated test fixtures](#non-templated-test-fixtures)<br>
|
||||
[Templated test fixtures](#templated-test-fixtures)<br>
|
||||
[Signature-based parameterised test fixtures](#signature-based-parametrised-test-fixtures)<br>
|
||||
[Signature-based parameterised test fixtures](#signature-based-parameterised-test-fixtures)<br>
|
||||
[Template fixtures with types specified in template type lists](#template-fixtures-with-types-specified-in-template-type-lists)<br>
|
||||
|
||||
## Non-Templated test fixtures
|
||||
@@ -130,7 +130,7 @@ TEST_CASE_PERSISTENT_FIXTURE( MyFixture, "Tests with MyFixture" ) {
|
||||
}
|
||||
```
|
||||
|
||||
This example demonstates two possible use-cases of this fixture type:
|
||||
This example demonstrates two possible use-cases of this fixture type:
|
||||
1. Improve test run times by reducing the amount of expensive and
|
||||
redundant setup and tear-down required.
|
||||
2. Reusing results from the previous partial run, in the current
|
||||
|
229
docs/thread-safety.md
Normal file
@@ -0,0 +1,229 @@
|
||||
<a id="top"></a>
|
||||
# Thread safety in Catch2
|
||||
|
||||
**Contents**<br>
|
||||
[Using assertion macros from spawned threads](#using-assertion-macros-from-spawned-threads)<br>
|
||||
[Assertion-like message macros and spawned threads](#assertion-like-message-macros-and-spawned-threads)<br>
|
||||
[Message macros and spawned threads](#message-macros-and-spawned-threads)<br>
|
||||
[examples](#examples)<br>
|
||||
[`STATIC_REQUIRE` and `STATIC_CHECK`](#static_require-and-static_check)<br>
|
||||
[Fatal errors and multiple threads](#fatal-errors-and-multiple-threads)<br>
|
||||
[Performance overhead](#performance-overhead)<br>
|
||||
|
||||
> Thread safe assertions were introduced in Catch2 3.9.0
|
||||
|
||||
Thread safety in Catch2 is currently limited to all the assertion macros,
|
||||
and to message or message-adjacent macros (e.g. `INFO` or `WARN`).
|
||||
|
||||
Interacting with benchmark macros, sections macros, generator macros, or
|
||||
test case macros is not thread-safe. The way sections define paths through
|
||||
the test is incompatible with user spawning threads arbitrarily, so this
|
||||
limitation is here to stay.
|
||||
|
||||
**Important: thread safety in Catch2 is [opt-in](configuration.md#experimental-thread-safety)**
|
||||
|
||||
|
||||
## Using assertion macros from spawned threads
|
||||
|
||||
The full set of Catch2's runtime assertion macros is thread-safe. However,
|
||||
it is important to keep in mind that their semantics might not support
|
||||
being used from user-spawned threads.
|
||||
|
||||
Specifically, the `REQUIRE` family of assertion macros have semantics
|
||||
of stopping the test execution on failure. This is done by throwing
|
||||
an exception, but since the user-spawned thread will not have the test-level
|
||||
try-catch block ready to catch the test failure exception, failing a
|
||||
`REQUIRE` assertion inside user-spawned thread will terminate the process.
|
||||
|
||||
The `CHECK` family of assertions does not have this issue, because it
|
||||
does not try to stop the test execution.
|
||||
|
||||
Note that `CHECKED_IF` and `CHECKED_ELSE` are also thread safe (internally
|
||||
they are assertion macro + an if).
|
||||
|
||||
|
||||
## Assertion-like message macros and spawned threads
|
||||
|
||||
> Assertion-like messages were made thread safe in Catch2 3.10.0
|
||||
|
||||
Similarly to assertion macros, not all assertion-like message macros can
|
||||
be used from spawned thread.
|
||||
|
||||
`SKIP` and `FAIL` macros stop the test execution. Just like with `REQUIRE`,
|
||||
this means that they cannot be used inside user-spawned threads. `SUCCEED`,
|
||||
`FAIL_CHECK` and `WARN` do not attempt to stop the test execution and
|
||||
thus can be used from any thread.
|
||||
|
||||
|
||||
## Message macros and spawned threads
|
||||
|
||||
> Message macros were made thread safe in Catch2 3.10.0
|
||||
|
||||
Macros that add extra messages to following assertion, such as `INFO`
|
||||
or `CAPTURE`, are all thread safe and can be used in any thread. Note
|
||||
that these messages are per-thread, and thus `INFO` inside a user-spawned
|
||||
thread will not be seen by the main thread, and vice versa.
|
||||
|
||||
|
||||
## examples
|
||||
|
||||
### `REQUIRE` from the main thread, `CHECK` from spawned threads
|
||||
|
||||
```cpp
|
||||
TEST_CASE( "Failed REQUIRE in the main thread is fine" ) {
|
||||
std::vector<std::jthread> threads;
|
||||
for ( size_t t = 0; t < 16; ++t) {
|
||||
threads.emplace_back( []() {
|
||||
for (size_t i = 0; i < 10'000; ++i) {
|
||||
CHECK( true );
|
||||
CHECK( false );
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
REQUIRE( false );
|
||||
}
|
||||
```
|
||||
This will work as expected, that is, the process will finish running
|
||||
normally, the test case will fail and there will be the correct count of
|
||||
passing and failing assertions (160000 and 160001 respectively). However,
|
||||
it is important to understand that when the main thread fails its assertion,
|
||||
the spawned threads will keep running.
|
||||
|
||||
|
||||
### `REQUIRE` from spawned threads
|
||||
|
||||
```cpp
|
||||
TEST_CASE( "Successful REQUIRE in spawned thread is fine" ) {
|
||||
std::vector<std::jthread> threads;
|
||||
for ( size_t t = 0; t < 16; ++t) {
|
||||
threads.emplace_back( []() {
|
||||
for (size_t i = 0; i < 10'000; ++i) {
|
||||
REQUIRE( true );
|
||||
}
|
||||
} );
|
||||
}
|
||||
}
|
||||
```
|
||||
This will also work as expected, because the `REQUIRE` is successful.
|
||||
|
||||
```cpp
|
||||
TEST_CASE( "Failed REQUIRE in spawned thread kills the process" ) {
|
||||
std::vector<std::jthread> threads;
|
||||
for ( size_t t = 0; t < 16; ++t) {
|
||||
threads.emplace_back( []() {
|
||||
for (size_t i = 0; i < 10'000; ++i) {
|
||||
REQUIRE( false );
|
||||
}
|
||||
} );
|
||||
}
|
||||
}
|
||||
```
|
||||
This will fail catastrophically and terminate the process.
|
||||
|
||||
|
||||
### INFO across threads
|
||||
|
||||
```cpp
|
||||
TEST_CASE( "messages don't cross threads" ) {
|
||||
std::jthread t1( [&]() {
|
||||
for ( size_t i = 0; i < 100; ++i ) {
|
||||
INFO( "spawned thread #1" );
|
||||
CHECK( 1 == 1 );
|
||||
}
|
||||
} );
|
||||
|
||||
std::thread t2( [&]() {
|
||||
for (size_t i = 0; i < 100; ++i) {
|
||||
UNSCOPED_INFO( "spawned thread #2" );
|
||||
}
|
||||
} );
|
||||
|
||||
for (size_t i = 0; i < 100; ++i) {
|
||||
CHECK( 1 == 2 );
|
||||
}
|
||||
}
|
||||
```
|
||||
None of the failed checks will show the "spawned thread #1" message, as
|
||||
that message is for the `t1` thread. If the reporter shows passing
|
||||
assertions (e.g. due to the tests being run with `-s`), you will see the
|
||||
"spawned thread #1" message alongside the passing `CHECK( 1 == 1 )` assertion.
|
||||
|
||||
The message "spawned thread #2" will never be shown, because there are no
|
||||
assertions in `t2`.
|
||||
|
||||
|
||||
### FAIL/SKIP from the main thread
|
||||
|
||||
```cpp
|
||||
TEST_CASE( "FAIL in the main thread is fine" ) {
|
||||
std::vector<std::jthread> threads;
|
||||
for ( size_t t = 0; t < 16; ++t) {
|
||||
threads.emplace_back( []() {
|
||||
for (size_t i = 0; i < 10; ++i) {
|
||||
CHECK( true );
|
||||
CHECK( false );
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
FAIL();
|
||||
}
|
||||
```
|
||||
|
||||
This will work as expected, that is, the process will finish running
|
||||
normally, the test case will fail and there will be 321 total assertions,
|
||||
160 passing and 161 failing (`FAIL` counts as failed assertion).
|
||||
|
||||
However, when the main thread hits `FAIL`, it will wait for the other
|
||||
threads to finish due to `std::jthread`'s destructor joining the spawned
|
||||
thread. Due to this, using `SKIP` is not recommended once more threads
|
||||
are spawned; while the main thread will bail from the test execution,
|
||||
the spawned threads will keep running and may fail the test case.
|
||||
|
||||
|
||||
### FAIL/SKIP from spawned threads
|
||||
|
||||
```cpp
|
||||
TEST_CASE( "FAIL/SKIP in spawned thread kills the process" ) {
|
||||
std::vector<std::jthread> threads;
|
||||
for ( size_t t = 0; t < 16; ++t) {
|
||||
threads.emplace_back( []() {
|
||||
for (size_t i = 0; i < 10'000; ++i) {
|
||||
FAIL();
|
||||
}
|
||||
} );
|
||||
}
|
||||
}
|
||||
```
|
||||
As with failing `REQUIRE`, both `FAIL` and `SKIP` in spawned threads
|
||||
terminate the process.
|
||||
|
||||
|
||||
## `STATIC_REQUIRE` and `STATIC_CHECK`
|
||||
|
||||
All of `STATIC_REQUIRE`, `STATIC_REQUIRE_FALSE`, `STATIC_CHECK`, and
|
||||
`STATIC_CHECK_FALSE` are thread safe in the delayed evaluation configuration.
|
||||
|
||||
|
||||
## Fatal errors and multiple threads
|
||||
|
||||
By default, Catch2 tries to catch fatal errors (POSIX signals/Windows
|
||||
Structured Exceptions) and report something useful to the user. This
|
||||
always happened on a best-effort basis, but in presence of multiple
|
||||
threads and locks the chance of it working decreases. If this starts
|
||||
being an issue for you, [you can disable it](configuration.md#other-toggles).
|
||||
|
||||
|
||||
## Performance overhead
|
||||
|
||||
In the worst case, which is optimized build and assertions using the
|
||||
fast path for successful assertions, the performance overhead of using
|
||||
the thread-safe assertion implementation can reach 40%. In other cases,
|
||||
the overhead will be smaller, between 4% and 20%.
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
[Home](Readme.md#top)
|
@@ -15,7 +15,7 @@ So what does Catch2 bring to the party that differentiates it from these? Apart
|
||||
## Key Features
|
||||
|
||||
* Quick and easy to get started. Just download two files, add them into your project and you're away.
|
||||
* No external dependencies. As long as you can compile C++14 and have the C++ standard library available.
|
||||
* No external dependencies. As long as you can compile C++17 and have the C++ standard library available.
|
||||
* Write test cases as, self-registering, functions (or methods, if you prefer).
|
||||
* Divide test cases into sections, each of which is run in isolation (eliminates the need for fixtures).
|
||||
* Use BDD-style Given-When-Then sections as well as traditional unit test cases.
|
||||
|
@@ -27,7 +27,7 @@ TEST_CASE( "Factorials of 1 and higher are computed (pass)", "[single-file]" ) {
|
||||
}
|
||||
|
||||
// Compile & run:
|
||||
// - g++ -std=c++14 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 010-TestCase 010-TestCase.cpp && 010-TestCase --success
|
||||
// - g++ -std=c++17 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 010-TestCase 010-TestCase.cpp && 010-TestCase --success
|
||||
// - cl -EHsc -I%CATCH_SINGLE_INCLUDE% 010-TestCase.cpp && 010-TestCase --success
|
||||
|
||||
// Expected compact output (all assertions):
|
||||
|
@@ -18,8 +18,8 @@ TEST_CASE( "1: All test cases reside in other .cpp files (empty)", "[multi-file:
|
||||
// Here just to show there are two source files via option --list-tests.
|
||||
|
||||
// Compile & run:
|
||||
// - g++ -std=c++14 -Wall -I$(CATCH_SINGLE_INCLUDE) -c 020-TestCase-1.cpp
|
||||
// - g++ -std=c++14 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 020-TestCase TestCase-1.o 020-TestCase-2.cpp && 020-TestCase --success
|
||||
// - g++ -std=c++17 -Wall -I$(CATCH_SINGLE_INCLUDE) -c 020-TestCase-1.cpp
|
||||
// - g++ -std=c++17 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 020-TestCase TestCase-1.o 020-TestCase-2.cpp && 020-TestCase --success
|
||||
//
|
||||
// - cl -EHsc -I%CATCH_SINGLE_INCLUDE% -c 020-TestCase-1.cpp
|
||||
// - cl -EHsc -I%CATCH_SINGLE_INCLUDE% -Fe020-TestCase.exe 020-TestCase-1.obj 020-TestCase-2.cpp && 020-TestCase --success
|
||||
|
@@ -61,7 +61,7 @@ TEST_CASE( "Assert that something is false (continue after failure)", "[check-fa
|
||||
}
|
||||
|
||||
// Compile & run:
|
||||
// - g++ -std=c++14 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 030-Asn-Require-Check 030-Asn-Require-Check.cpp && 030-Asn-Require-Check --success
|
||||
// - g++ -std=c++17 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 030-Asn-Require-Check 030-Asn-Require-Check.cpp && 030-Asn-Require-Check --success
|
||||
// - cl -EHsc -I%CATCH_SINGLE_INCLUDE% 030-Asn-Require-Check.cpp && 030-Asn-Require-Check --success
|
||||
|
||||
// Expected compact output (all assertions):
|
||||
|
@@ -53,7 +53,7 @@ TEST_CASE( "vectors can be sized and resized", "[vector]" ) {
|
||||
}
|
||||
|
||||
// Compile & run:
|
||||
// - g++ -std=c++14 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 100-Fix-Section 100-Fix-Section.cpp && 100-Fix-Section --success
|
||||
// - g++ -std=c++17 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 100-Fix-Section 100-Fix-Section.cpp && 100-Fix-Section --success
|
||||
// - cl -EHsc -I%CATCH_SINGLE_INCLUDE% 100-Fix-Section.cpp && 100-Fix-Section --success
|
||||
|
||||
// Expected compact output (all assertions):
|
||||
|
@@ -60,11 +60,11 @@ TEST_CASE_METHOD( UniqueTestsFixture, "Create Employee/Normal", "[create]" ) {
|
||||
}
|
||||
|
||||
// Compile & run:
|
||||
// - g++ -std=c++14 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 110-Fix-ClassFixture 110-Fix-ClassFixture.cpp && 110-Fix-ClassFixture --success
|
||||
// - g++ -std=c++17 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 110-Fix-ClassFixture 110-Fix-ClassFixture.cpp && 110-Fix-ClassFixture --success
|
||||
// - cl -EHsc -I%CATCH_SINGLE_INCLUDE% 110-Fix-ClassFixture.cpp && 110-Fix-ClassFixture --success
|
||||
//
|
||||
// Compile with pkg-config:
|
||||
// - g++ -std=c++14 -Wall $(pkg-config catch2-with-main --cflags) -o 110-Fix-ClassFixture 110-Fix-ClassFixture.cpp $(pkg-config catch2-with-main --libs)
|
||||
// - g++ -std=c++17 -Wall $(pkg-config catch2-with-main --cflags) -o 110-Fix-ClassFixture 110-Fix-ClassFixture.cpp $(pkg-config catch2-with-main --libs)
|
||||
|
||||
// Expected compact output (all assertions):
|
||||
//
|
||||
|
@@ -56,7 +56,7 @@ SCENARIO( "vectors can be sized and resized", "[vector]" ) {
|
||||
}
|
||||
|
||||
// Compile & run:
|
||||
// - g++ -std=c++14 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 120-Bdd-ScenarioGivenWhenThen 120-Bdd-ScenarioGivenWhenThen.cpp && 120-Bdd-ScenarioGivenWhenThen --success
|
||||
// - g++ -std=c++17 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 120-Bdd-ScenarioGivenWhenThen 120-Bdd-ScenarioGivenWhenThen.cpp && 120-Bdd-ScenarioGivenWhenThen --success
|
||||
// - cl -EHsc -I%CATCH_SINGLE_INCLUDE% 120-Bdd-ScenarioGivenWhenThen.cpp && 120-Bdd-ScenarioGivenWhenThen --success
|
||||
|
||||
// Expected compact output (all assertions):
|
||||
|
@@ -131,7 +131,7 @@ void print( std::ostream& os, int const level, std::string const& title, Catch::
|
||||
}
|
||||
|
||||
// struct Tag {
|
||||
// StringRef original, lowerCased;
|
||||
// std::string_view original, lowerCased;
|
||||
// };
|
||||
//
|
||||
//
|
||||
@@ -221,9 +221,9 @@ void print( std::ostream& os, int const level, std::string const& title, Catch::
|
||||
|
||||
// struct AssertionInfo
|
||||
// {
|
||||
// StringRef macroName;
|
||||
// std::string_view macroName;
|
||||
// SourceLineInfo lineInfo;
|
||||
// StringRef capturedExpression;
|
||||
// std::string_view capturedExpression;
|
||||
// ResultDisposition::Flags resultDisposition;
|
||||
// };
|
||||
|
||||
@@ -307,7 +307,7 @@ void print( std::ostream& os, int const level, std::string const& title, Catch::
|
||||
// 2. My listener and registration:
|
||||
//
|
||||
|
||||
char const * dashed_line =
|
||||
char const * const dashed_line =
|
||||
"--------------------------------------------------------------------------";
|
||||
|
||||
|
||||
@@ -427,7 +427,7 @@ TEST_CASE_METHOD( Fixture, "3: Testcase with class-based fixture", "[tag-C][tag-
|
||||
}
|
||||
|
||||
// Compile & run:
|
||||
// - g++ -std=c++14 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 210-Evt-EventListeners 210-Evt-EventListeners.cpp && 210-Evt-EventListeners --success
|
||||
// - g++ -std=c++17 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 210-Evt-EventListeners 210-Evt-EventListeners.cpp && 210-Evt-EventListeners --success
|
||||
// - cl -EHsc -I%CATCH_SINGLE_INCLUDE% 210-Evt-EventListeners.cpp && 210-Evt-EventListeners --success
|
||||
|
||||
// Expected compact output (all assertions):
|
||||
|
@@ -22,24 +22,21 @@ struct TestSubject {
|
||||
|
||||
|
||||
TEST_CASE("Table allows pre-computed test inputs and outputs", "[example][generator]") {
|
||||
using std::make_tuple;
|
||||
// do setup here as normal
|
||||
TestSubject subj;
|
||||
|
||||
SECTION("This section is run for each row in the table") {
|
||||
std::string test_input;
|
||||
size_t expected_output;
|
||||
std::tie( test_input, expected_output ) =
|
||||
const auto [test_input, expected_output] =
|
||||
GENERATE( table<std::string, size_t>(
|
||||
{ /* In this case one of the parameters to our test case is the
|
||||
* expected output, but this is not required. There could be
|
||||
* multiple expected values in the table, which can have any
|
||||
* (fixed) number of columns.
|
||||
*/
|
||||
make_tuple( "one", 3 ),
|
||||
make_tuple( "two", 3 ),
|
||||
make_tuple( "three", 5 ),
|
||||
make_tuple( "four", 4 ) } ) );
|
||||
{ "one", 3 },
|
||||
{ "two", 3 },
|
||||
{ "three", 5 },
|
||||
{ "four", 4 } } ) );
|
||||
|
||||
// run the test
|
||||
auto result = subj.GetLength(test_input);
|
||||
@@ -50,14 +47,4 @@ TEST_CASE("Table allows pre-computed test inputs and outputs", "[example][genera
|
||||
} // end section
|
||||
}
|
||||
|
||||
/* Possible simplifications where less legacy toolchain support is needed:
|
||||
*
|
||||
* - With libstdc++6 or newer, the make_tuple() calls can be omitted
|
||||
* (technically C++17 but does not require -std in GCC/Clang). See
|
||||
* https://stackoverflow.com/questions/12436586/tuple-vector-and-initializer-list
|
||||
*
|
||||
* - In C++17 mode std::tie() and the preceding variable declarations can be
|
||||
* replaced by structured bindings: auto [test_input, expected] = GENERATE(
|
||||
* table<std::string, size_t>({ ...
|
||||
*/
|
||||
// Compiling and running this file will result in 4 successful assertions
|
||||
|
@@ -1,50 +1,47 @@
|
||||
cmake_minimum_required( VERSION 3.16 )
|
||||
|
||||
project( Catch2Examples LANGUAGES CXX )
|
||||
|
||||
message( STATUS "Examples included" )
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(Catch2Examples LANGUAGES CXX)
|
||||
|
||||
message(STATUS "Examples included")
|
||||
|
||||
# Some one-offs first:
|
||||
# 1) Tests and main in one file
|
||||
add_executable( 010-TestCase
|
||||
add_executable(010-TestCase
|
||||
010-TestCase.cpp
|
||||
)
|
||||
|
||||
# 2) Tests and main across two files
|
||||
add_executable( 020-MultiFile
|
||||
add_executable(020-MultiFile
|
||||
020-TestCase-1.cpp
|
||||
020-TestCase-2.cpp
|
||||
)
|
||||
|
||||
add_executable(231-Cfg_OutputStreams
|
||||
231-Cfg-OutputStreams.cpp
|
||||
231-Cfg-OutputStreams.cpp
|
||||
)
|
||||
target_link_libraries(231-Cfg_OutputStreams Catch2_buildall_interface)
|
||||
target_compile_definitions(231-Cfg_OutputStreams PUBLIC CATCH_CONFIG_NOSTDOUT)
|
||||
|
||||
# These examples use the standard separate compilation
|
||||
set( SOURCES_IDIOMATIC_EXAMPLES
|
||||
030-Asn-Require-Check.cpp
|
||||
100-Fix-Section.cpp
|
||||
110-Fix-ClassFixture.cpp
|
||||
111-Fix-PersistentFixture.cpp
|
||||
120-Bdd-ScenarioGivenWhenThen.cpp
|
||||
210-Evt-EventListeners.cpp
|
||||
232-Cfg-CustomMain.cpp
|
||||
300-Gen-OwnGenerator.cpp
|
||||
301-Gen-MapTypeConversion.cpp
|
||||
302-Gen-Table.cpp
|
||||
310-Gen-VariablesInGenerators.cpp
|
||||
311-Gen-CustomCapture.cpp
|
||||
set(SOURCES_IDIOMATIC_EXAMPLES
|
||||
030-Asn-Require-Check.cpp
|
||||
100-Fix-Section.cpp
|
||||
110-Fix-ClassFixture.cpp
|
||||
111-Fix-PersistentFixture.cpp
|
||||
120-Bdd-ScenarioGivenWhenThen.cpp
|
||||
210-Evt-EventListeners.cpp
|
||||
232-Cfg-CustomMain.cpp
|
||||
300-Gen-OwnGenerator.cpp
|
||||
301-Gen-MapTypeConversion.cpp
|
||||
302-Gen-Table.cpp
|
||||
310-Gen-VariablesInGenerators.cpp
|
||||
311-Gen-CustomCapture.cpp
|
||||
)
|
||||
|
||||
string( REPLACE ".cpp" "" BASENAMES_IDIOMATIC_EXAMPLES "${SOURCES_IDIOMATIC_EXAMPLES}" )
|
||||
set( TARGETS_IDIOMATIC_EXAMPLES ${BASENAMES_IDIOMATIC_EXAMPLES} )
|
||||
string(REPLACE ".cpp" "" BASENAMES_IDIOMATIC_EXAMPLES "${SOURCES_IDIOMATIC_EXAMPLES}")
|
||||
set(TARGETS_IDIOMATIC_EXAMPLES ${BASENAMES_IDIOMATIC_EXAMPLES})
|
||||
|
||||
|
||||
foreach( name ${TARGETS_IDIOMATIC_EXAMPLES} )
|
||||
add_executable( ${name} ${name}.cpp )
|
||||
foreach(name ${TARGETS_IDIOMATIC_EXAMPLES})
|
||||
add_executable(${name} ${name}.cpp)
|
||||
endforeach()
|
||||
|
||||
set(ALL_EXAMPLE_TARGETS
|
||||
@@ -53,10 +50,9 @@ set(ALL_EXAMPLE_TARGETS
|
||||
020-MultiFile
|
||||
)
|
||||
|
||||
foreach( name ${ALL_EXAMPLE_TARGETS} )
|
||||
target_link_libraries( ${name} Catch2WithMain )
|
||||
foreach(name ${ALL_EXAMPLE_TARGETS})
|
||||
target_link_libraries(${name} Catch2WithMain)
|
||||
endforeach()
|
||||
|
||||
|
||||
list(APPEND CATCH_WARNING_TARGETS ${ALL_EXAMPLE_TARGETS})
|
||||
set(CATCH_WARNING_TARGETS ${CATCH_WARNING_TARGETS} PARENT_SCOPE)
|
||||
list(APPEND CATCH_TEST_TARGETS ${ALL_EXAMPLE_TARGETS})
|
||||
set(CATCH_TEST_TARGETS ${CATCH_TEST_TARGETS} PARENT_SCOPE)
|
||||
|
@@ -165,7 +165,7 @@ function(catch_discover_tests TARGET)
|
||||
${ARGN}
|
||||
)
|
||||
|
||||
if (${CMAKE_VERSION} VERSION_LESS "3.19")
|
||||
if(${CMAKE_VERSION} VERSION_LESS "3.19")
|
||||
message(FATAL_ERROR "This script requires JSON support from CMake version 3.19 or greater.")
|
||||
endif()
|
||||
|
||||
@@ -187,7 +187,7 @@ function(catch_discover_tests TARGET)
|
||||
endif()
|
||||
set(_DISCOVERY_MODE ${CMAKE_CATCH_DISCOVER_TESTS_DISCOVERY_MODE})
|
||||
endif()
|
||||
if (NOT _DISCOVERY_MODE MATCHES "^(POST_BUILD|PRE_TEST)$")
|
||||
if(NOT _DISCOVERY_MODE MATCHES "^(POST_BUILD|PRE_TEST)$")
|
||||
message(FATAL_ERROR "Unknown DISCOVERY_MODE: ${_DISCOVERY_MODE}")
|
||||
endif()
|
||||
|
||||
@@ -204,7 +204,7 @@ function(catch_discover_tests TARGET)
|
||||
TARGET ${TARGET}
|
||||
PROPERTY CROSSCOMPILING_EMULATOR
|
||||
)
|
||||
if (NOT _SKIP_IS_FAILURE)
|
||||
if(NOT _SKIP_IS_FAILURE)
|
||||
set(_PROPERTIES ${_PROPERTIES} SKIP_RETURN_CODE 4)
|
||||
endif()
|
||||
|
||||
|
@@ -136,7 +136,7 @@ function(catch_discover_tests_impl)
|
||||
|
||||
# Parse JSON output for list of tests/class names/tags
|
||||
string(JSON version GET "${listing_output}" "version")
|
||||
if (NOT version STREQUAL "1")
|
||||
if(NOT version STREQUAL "1")
|
||||
message(FATAL_ERROR "Unsupported catch output version: '${version}'")
|
||||
endif()
|
||||
|
||||
@@ -186,11 +186,11 @@ function(catch_discover_tests_impl)
|
||||
${properties}
|
||||
)
|
||||
|
||||
if (add_tags)
|
||||
if(add_tags)
|
||||
string(JSON num_tags LENGTH "${test_tags}")
|
||||
math(EXPR num_tags "${num_tags} - 1")
|
||||
set(tag_list "")
|
||||
if (num_tags GREATER_EQUAL "0")
|
||||
if(num_tags GREATER_EQUAL "0")
|
||||
foreach(tag_idx RANGE ${num_tags})
|
||||
string(JSON a_tag GET "${test_tags}" "${tag_idx}")
|
||||
# Catch2's tags can contain semicolons, which are list element separators
|
||||
|
@@ -11,7 +11,7 @@
|
||||
# * REPORTER - reporter spec to use for tests
|
||||
# * TEST_SPEC - test spec used for filtering tests
|
||||
function(catch_add_sharded_tests TARGET)
|
||||
if (${CMAKE_VERSION} VERSION_LESS "3.10.0")
|
||||
if(${CMAKE_VERSION} VERSION_LESS "3.10.0")
|
||||
message(FATAL_ERROR "add_sharded_catch_tests only supports CMake versions 3.10.0 and up")
|
||||
endif()
|
||||
|
||||
@@ -23,7 +23,7 @@ function(catch_add_sharded_tests TARGET)
|
||||
${ARGN}
|
||||
)
|
||||
|
||||
if (NOT DEFINED _SHARD_COUNT)
|
||||
if(NOT DEFINED _SHARD_COUNT)
|
||||
set(_SHARD_COUNT 2)
|
||||
endif()
|
||||
|
||||
@@ -61,8 +61,6 @@ function(catch_add_sharded_tests TARGET)
|
||||
-P "${shard_impl_script_file}"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
|
||||
endfunction()
|
||||
|
||||
|
||||
|
@@ -25,10 +25,10 @@ if(NOT EXISTS "${TEST_BINARY}")
|
||||
endif()
|
||||
|
||||
set(other_args "")
|
||||
if (TEST_SPEC)
|
||||
if(TEST_SPEC)
|
||||
set(other_args "${other_args} ${TEST_SPEC}")
|
||||
endif()
|
||||
if (REPORTER_SPEC)
|
||||
if(REPORTER_SPEC)
|
||||
set(other_args "${other_args} --reporter ${REPORTER_SPEC}")
|
||||
endif()
|
||||
|
||||
|
@@ -56,7 +56,7 @@
|
||||
# #
|
||||
#==================================================================================================#
|
||||
|
||||
if (CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.8)
|
||||
if(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.8)
|
||||
message(FATAL_ERROR "ParseAndAddCatchTests requires CMake 2.8.8 or newer")
|
||||
endif()
|
||||
|
||||
@@ -67,9 +67,9 @@ option(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME "Add target name to the test na
|
||||
option(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS "Add test file to CMAKE_CONFIGURE_DEPENDS property" OFF)
|
||||
|
||||
function(ParseAndAddCatchTests_PrintDebugMessage)
|
||||
if(PARSE_CATCH_TESTS_VERBOSE)
|
||||
message(STATUS "ParseAndAddCatchTests: ${ARGV}")
|
||||
endif()
|
||||
if(PARSE_CATCH_TESTS_VERBOSE)
|
||||
message(STATUS "ParseAndAddCatchTests: ${ARGV}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# This removes the contents between
|
||||
@@ -90,163 +90,161 @@ endfunction()
|
||||
|
||||
# Worker function
|
||||
function(ParseAndAddCatchTests_ParseFile SourceFile TestTarget)
|
||||
# If SourceFile is an object library, do not scan it (as it is not a file). Exit without giving a warning about a missing file.
|
||||
if(SourceFile MATCHES "\\\$<TARGET_OBJECTS:.+>")
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Detected OBJECT library: ${SourceFile} this will not be scanned for tests.")
|
||||
return()
|
||||
endif()
|
||||
# According to CMake docs EXISTS behavior is well-defined only for full paths.
|
||||
get_filename_component(SourceFile ${SourceFile} ABSOLUTE)
|
||||
if(NOT EXISTS ${SourceFile})
|
||||
message(WARNING "Cannot find source file: ${SourceFile}")
|
||||
return()
|
||||
endif()
|
||||
ParseAndAddCatchTests_PrintDebugMessage("parsing ${SourceFile}")
|
||||
file(STRINGS ${SourceFile} Contents NEWLINE_CONSUME)
|
||||
# If SourceFile is an object library, do not scan it (as it is not a file). Exit without giving a warning about a missing file.
|
||||
if(SourceFile MATCHES "\\\$<TARGET_OBJECTS:.+>")
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Detected OBJECT library: ${SourceFile} this will not be scanned for tests.")
|
||||
return()
|
||||
endif()
|
||||
# According to CMake docs EXISTS behavior is well-defined only for full paths.
|
||||
get_filename_component(SourceFile ${SourceFile} ABSOLUTE)
|
||||
if(NOT EXISTS ${SourceFile})
|
||||
message(WARNING "Cannot find source file: ${SourceFile}")
|
||||
return()
|
||||
endif()
|
||||
ParseAndAddCatchTests_PrintDebugMessage("parsing ${SourceFile}")
|
||||
file(STRINGS ${SourceFile} Contents NEWLINE_CONSUME)
|
||||
|
||||
# Remove block and fullline comments
|
||||
ParseAndAddCatchTests_RemoveComments(Contents)
|
||||
# Remove block and fullline comments
|
||||
ParseAndAddCatchTests_RemoveComments(Contents)
|
||||
|
||||
# Find definition of test names
|
||||
# https://regex101.com/r/JygOND/1
|
||||
string(REGEX MATCHALL "[ \t]*(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([ \t\n]*\"[^\"]*\"[ \t\n]*(,[ \t\n]*\"[^\"]*\")?(,[ \t\n]*[^\,\)]*)*\\)[ \t\n]*\{+[ \t]*(//[^\n]*[Tt][Ii][Mm][Ee][Oo][Uu][Tt][ \t]*[0-9]+)*" Tests "${Contents}")
|
||||
# Find definition of test names
|
||||
# https://regex101.com/r/JygOND/1
|
||||
string(REGEX MATCHALL "[ \t]*(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([ \t\n]*\"[^\"]*\"[ \t\n]*(,[ \t\n]*\"[^\"]*\")?(,[ \t\n]*[^\,\)]*)*\\)[ \t\n]*\{+[ \t]*(//[^\n]*[Tt][Ii][Mm][Ee][Oo][Uu][Tt][ \t]*[0-9]+)*" Tests "${Contents}")
|
||||
|
||||
if(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS AND Tests)
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property")
|
||||
set_property(
|
||||
DIRECTORY
|
||||
APPEND
|
||||
PROPERTY CMAKE_CONFIGURE_DEPENDS ${SourceFile}
|
||||
)
|
||||
if(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS AND Tests)
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property")
|
||||
set_property(
|
||||
DIRECTORY
|
||||
APPEND
|
||||
PROPERTY CMAKE_CONFIGURE_DEPENDS ${SourceFile}
|
||||
)
|
||||
endif()
|
||||
|
||||
# check CMP0110 policy for new add_test() behavior
|
||||
if(POLICY CMP0110)
|
||||
cmake_policy(GET CMP0110 _cmp0110_value) # new add_test() behavior
|
||||
else()
|
||||
# just to be thorough explicitly set the variable
|
||||
set(_cmp0110_value)
|
||||
endif()
|
||||
|
||||
foreach(TestName ${Tests})
|
||||
# Strip newlines
|
||||
string(REGEX REPLACE "\\\\\n|\n" "" TestName "${TestName}")
|
||||
|
||||
# Get test type and fixture if applicable
|
||||
string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^,^\"]*" TestTypeAndFixture "${TestName}")
|
||||
string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)" TestType "${TestTypeAndFixture}")
|
||||
string(REGEX REPLACE "${TestType}\\([ \t]*" "" TestFixture "${TestTypeAndFixture}")
|
||||
|
||||
# Get string parts of test definition
|
||||
string(REGEX MATCHALL "\"+([^\\^\"]|\\\\\")+\"+" TestStrings "${TestName}")
|
||||
|
||||
# Strip wrapping quotation marks
|
||||
string(REGEX REPLACE "^\"(.*)\"$" "\\1" TestStrings "${TestStrings}")
|
||||
string(REPLACE "\";\"" ";" TestStrings "${TestStrings}")
|
||||
|
||||
# Validate that a test name and tags have been provided
|
||||
list(LENGTH TestStrings TestStringsLength)
|
||||
if(TestStringsLength GREATER 2 OR TestStringsLength LESS 1)
|
||||
message(FATAL_ERROR "You must provide a valid test name and tags for all tests in ${SourceFile}")
|
||||
endif()
|
||||
|
||||
# check CMP0110 policy for new add_test() behavior
|
||||
if(POLICY CMP0110)
|
||||
cmake_policy(GET CMP0110 _cmp0110_value) # new add_test() behavior
|
||||
# Assign name and tags
|
||||
list(GET TestStrings 0 Name)
|
||||
if("${TestType}" STREQUAL "SCENARIO")
|
||||
set(Name "Scenario: ${Name}")
|
||||
endif()
|
||||
if(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME AND "${TestType}" MATCHES "(CATCH_)?TEST_CASE_METHOD" AND TestFixture)
|
||||
set(CTestName "${TestFixture}:${Name}")
|
||||
else()
|
||||
# just to be thorough explicitly set the variable
|
||||
set(_cmp0110_value)
|
||||
set(CTestName "${Name}")
|
||||
endif()
|
||||
if(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME)
|
||||
set(CTestName "${TestTarget}:${CTestName}")
|
||||
endif()
|
||||
# add target to labels to enable running all tests added from this target
|
||||
set(Labels ${TestTarget})
|
||||
if(TestStringsLength EQUAL 2)
|
||||
list(GET TestStrings 1 Tags)
|
||||
string(TOLOWER "${Tags}" Tags)
|
||||
# remove target from labels if the test is hidden
|
||||
if("${Tags}" MATCHES ".*\\[!?(hide|\\.)\\].*")
|
||||
list(REMOVE_ITEM Labels ${TestTarget})
|
||||
endif()
|
||||
string(REPLACE "]" ";" Tags "${Tags}")
|
||||
string(REPLACE "[" "" Tags "${Tags}")
|
||||
else()
|
||||
# unset tags variable from previous loop
|
||||
unset(Tags)
|
||||
endif()
|
||||
|
||||
foreach(TestName ${Tests})
|
||||
# Strip newlines
|
||||
string(REGEX REPLACE "\\\\\n|\n" "" TestName "${TestName}")
|
||||
list(APPEND Labels ${Tags})
|
||||
|
||||
# Get test type and fixture if applicable
|
||||
string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^,^\"]*" TestTypeAndFixture "${TestName}")
|
||||
string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)" TestType "${TestTypeAndFixture}")
|
||||
string(REGEX REPLACE "${TestType}\\([ \t]*" "" TestFixture "${TestTypeAndFixture}")
|
||||
set(HiddenTagFound OFF)
|
||||
foreach(label ${Labels})
|
||||
string(REGEX MATCH "^!hide|^\\." result ${label})
|
||||
if(result)
|
||||
set(HiddenTagFound ON)
|
||||
break()
|
||||
endif()
|
||||
endforeach(label)
|
||||
if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_LESS "3.9")
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Skipping test \"${CTestName}\" as it has [!hide], [.] or [.foo] label")
|
||||
else()
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Adding test \"${CTestName}\"")
|
||||
if(Labels)
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Setting labels to ${Labels}")
|
||||
endif()
|
||||
|
||||
# Get string parts of test definition
|
||||
string(REGEX MATCHALL "\"+([^\\^\"]|\\\\\")+\"+" TestStrings "${TestName}")
|
||||
# Escape commas in the test spec
|
||||
string(REPLACE "," "\\," Name ${Name})
|
||||
|
||||
# Strip wrapping quotation marks
|
||||
string(REGEX REPLACE "^\"(.*)\"$" "\\1" TestStrings "${TestStrings}")
|
||||
string(REPLACE "\";\"" ";" TestStrings "${TestStrings}")
|
||||
# Work around CMake 3.18.0 change in `add_test()`, before the escaped quotes were necessary,
|
||||
# only with CMake 3.18.0 the escaped double quotes confuse the call. This change is reverted in 3.18.1
|
||||
# And properly introduced in 3.19 with the CMP0110 policy
|
||||
if(_cmp0110_value STREQUAL "NEW" OR ${CMAKE_VERSION} VERSION_EQUAL "3.18")
|
||||
ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to NEW, no need for add_test(\"\") workaround")
|
||||
else()
|
||||
ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to OLD adding \"\" for add_test() workaround")
|
||||
set(CTestName "\"${CTestName}\"")
|
||||
endif()
|
||||
|
||||
# Validate that a test name and tags have been provided
|
||||
list(LENGTH TestStrings TestStringsLength)
|
||||
if(TestStringsLength GREATER 2 OR TestStringsLength LESS 1)
|
||||
message(FATAL_ERROR "You must provide a valid test name and tags for all tests in ${SourceFile}")
|
||||
endif()
|
||||
# Handle template test cases
|
||||
if("${TestTypeAndFixture}" MATCHES ".*TEMPLATE_.*")
|
||||
set(Name "${Name} - *")
|
||||
endif()
|
||||
|
||||
# Assign name and tags
|
||||
list(GET TestStrings 0 Name)
|
||||
if("${TestType}" STREQUAL "SCENARIO")
|
||||
set(Name "Scenario: ${Name}")
|
||||
endif()
|
||||
if(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME AND "${TestType}" MATCHES "(CATCH_)?TEST_CASE_METHOD" AND TestFixture )
|
||||
set(CTestName "${TestFixture}:${Name}")
|
||||
else()
|
||||
set(CTestName "${Name}")
|
||||
endif()
|
||||
if(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME)
|
||||
set(CTestName "${TestTarget}:${CTestName}")
|
||||
endif()
|
||||
# add target to labels to enable running all tests added from this target
|
||||
set(Labels ${TestTarget})
|
||||
if(TestStringsLength EQUAL 2)
|
||||
list(GET TestStrings 1 Tags)
|
||||
string(TOLOWER "${Tags}" Tags)
|
||||
# remove target from labels if the test is hidden
|
||||
if("${Tags}" MATCHES ".*\\[!?(hide|\\.)\\].*")
|
||||
list(REMOVE_ITEM Labels ${TestTarget})
|
||||
endif()
|
||||
string(REPLACE "]" ";" Tags "${Tags}")
|
||||
string(REPLACE "[" "" Tags "${Tags}")
|
||||
else()
|
||||
# unset tags variable from previous loop
|
||||
unset(Tags)
|
||||
endif()
|
||||
|
||||
list(APPEND Labels ${Tags})
|
||||
|
||||
set(HiddenTagFound OFF)
|
||||
foreach(label ${Labels})
|
||||
string(REGEX MATCH "^!hide|^\\." result ${label})
|
||||
if(result)
|
||||
set(HiddenTagFound ON)
|
||||
break()
|
||||
endif()
|
||||
endforeach(label)
|
||||
if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_LESS "3.9")
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Skipping test \"${CTestName}\" as it has [!hide], [.] or [.foo] label")
|
||||
else()
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Adding test \"${CTestName}\"")
|
||||
if(Labels)
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Setting labels to ${Labels}")
|
||||
endif()
|
||||
|
||||
# Escape commas in the test spec
|
||||
string(REPLACE "," "\\," Name ${Name})
|
||||
|
||||
# Work around CMake 3.18.0 change in `add_test()`, before the escaped quotes were necessary,
|
||||
# only with CMake 3.18.0 the escaped double quotes confuse the call. This change is reverted in 3.18.1
|
||||
# And properly introduced in 3.19 with the CMP0110 policy
|
||||
if(_cmp0110_value STREQUAL "NEW" OR ${CMAKE_VERSION} VERSION_EQUAL "3.18")
|
||||
ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to NEW, no need for add_test(\"\") workaround")
|
||||
else()
|
||||
ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to OLD adding \"\" for add_test() workaround")
|
||||
set(CTestName "\"${CTestName}\"")
|
||||
endif()
|
||||
|
||||
# Handle template test cases
|
||||
if("${TestTypeAndFixture}" MATCHES ".*TEMPLATE_.*")
|
||||
set(Name "${Name} - *")
|
||||
endif()
|
||||
|
||||
# Add the test and set its properties
|
||||
add_test(NAME "${CTestName}" COMMAND ${OptionalCatchTestLauncher} $<TARGET_FILE:${TestTarget}> ${Name} ${AdditionalCatchParameters})
|
||||
# Old CMake versions do not document VERSION_GREATER_EQUAL, so we use VERSION_GREATER with 3.8 instead
|
||||
if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_GREATER "3.8")
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Setting DISABLED test property")
|
||||
set_tests_properties("${CTestName}" PROPERTIES DISABLED ON)
|
||||
else()
|
||||
set_tests_properties("${CTestName}" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran"
|
||||
LABELS "${Labels}")
|
||||
endif()
|
||||
set_property(
|
||||
TARGET ${TestTarget}
|
||||
APPEND
|
||||
PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}")
|
||||
set_property(
|
||||
SOURCE ${SourceFile}
|
||||
APPEND
|
||||
PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}")
|
||||
endif()
|
||||
|
||||
|
||||
endforeach()
|
||||
# Add the test and set its properties
|
||||
add_test(NAME "${CTestName}" COMMAND ${OptionalCatchTestLauncher} $<TARGET_FILE:${TestTarget}> ${Name} ${AdditionalCatchParameters})
|
||||
# Old CMake versions do not document VERSION_GREATER_EQUAL, so we use VERSION_GREATER with 3.8 instead
|
||||
if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_GREATER "3.8")
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Setting DISABLED test property")
|
||||
set_tests_properties("${CTestName}" PROPERTIES DISABLED ON)
|
||||
else()
|
||||
set_tests_properties("${CTestName}" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran"
|
||||
LABELS "${Labels}")
|
||||
endif()
|
||||
set_property(
|
||||
TARGET ${TestTarget}
|
||||
APPEND
|
||||
PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}")
|
||||
set_property(
|
||||
SOURCE ${SourceFile}
|
||||
APPEND
|
||||
PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}")
|
||||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
# entry point
|
||||
function(ParseAndAddCatchTests TestTarget)
|
||||
message(DEPRECATION "ParseAndAddCatchTest: function deprecated because of possibility of missed test cases. Consider using 'catch_discover_tests' from 'Catch.cmake'")
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Started parsing ${TestTarget}")
|
||||
get_target_property(SourceFiles ${TestTarget} SOURCES)
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Found the following sources: ${SourceFiles}")
|
||||
foreach(SourceFile ${SourceFiles})
|
||||
ParseAndAddCatchTests_ParseFile(${SourceFile} ${TestTarget})
|
||||
endforeach()
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Finished parsing ${TestTarget}")
|
||||
message(DEPRECATION "ParseAndAddCatchTest: function deprecated because of possibility of missed test cases. Consider using 'catch_discover_tests' from 'Catch.cmake'")
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Started parsing ${TestTarget}")
|
||||
get_target_property(SourceFiles ${TestTarget} SOURCES)
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Found the following sources: ${SourceFiles}")
|
||||
foreach(SourceFile ${SourceFiles})
|
||||
ParseAndAddCatchTests_ParseFile(${SourceFile} ${TestTarget})
|
||||
endforeach()
|
||||
ParseAndAddCatchTests_PrintDebugMessage("Finished parsing ${TestTarget}")
|
||||
endfunction()
|
||||
|
@@ -15,6 +15,6 @@ target_compile_features(fuzzhelper PUBLIC cxx_std_17)
|
||||
target_link_options(fuzzhelper PUBLIC "-fsanitize=fuzzer")
|
||||
|
||||
foreach(fuzzer TestSpecParser XmlWriter textflow)
|
||||
add_executable(fuzz_${fuzzer} fuzz_${fuzzer}.cpp)
|
||||
target_link_libraries(fuzz_${fuzzer} PRIVATE fuzzhelper)
|
||||
add_executable(fuzz_${fuzzer} fuzz_${fuzzer}.cpp)
|
||||
target_link_libraries(fuzz_${fuzzer} PRIVATE fuzzhelper)
|
||||
endforeach()
|
||||
|
@@ -16,7 +16,7 @@ class NullStreambuf : public std::streambuf {
|
||||
char dummyBuffer[64];
|
||||
|
||||
protected:
|
||||
virtual int overflow(int c) override final;
|
||||
virtual int overflow(int c) final;
|
||||
};
|
||||
|
||||
class NullOStream final : private NullStreambuf, public std::ostream {
|
||||
|
@@ -8,7 +8,7 @@
|
||||
project(
|
||||
'catch2',
|
||||
'cpp',
|
||||
version: '3.8.1', # CML version placeholder, don't delete
|
||||
version: '3.10.0', # CML version placeholder, don't delete
|
||||
license: 'BSL-1.0',
|
||||
meson_version: '>=0.54.1',
|
||||
)
|
||||
|
@@ -40,7 +40,6 @@ set(BENCHMARK_SOURCES
|
||||
)
|
||||
set(BENCHMARK_FILES ${BENCHMARK_HEADERS} ${BENCHMARK_SOURCES})
|
||||
|
||||
|
||||
set(IMPL_HEADERS
|
||||
"${PROJECT_BINARY_DIR}/generated-includes/catch2/catch_user_config.hpp"
|
||||
${SOURCES_DIR}/catch_user_config.hpp.in
|
||||
@@ -59,6 +58,7 @@ set(IMPL_HEADERS
|
||||
${SOURCES_DIR}/catch_template_test_macros.hpp
|
||||
${SOURCES_DIR}/catch_test_case_info.hpp
|
||||
${SOURCES_DIR}/catch_test_macros.hpp
|
||||
${SOURCES_DIR}/catch_test_run_info.hpp
|
||||
${SOURCES_DIR}/catch_test_spec.hpp
|
||||
${SOURCES_DIR}/catch_timer.hpp
|
||||
${SOURCES_DIR}/catch_tostring.hpp
|
||||
@@ -76,15 +76,14 @@ set(IMPL_HEADERS
|
||||
${SOURCES_DIR}/internal/catch_config_counter.hpp
|
||||
${SOURCES_DIR}/internal/catch_config_prefix_messages.hpp
|
||||
${SOURCES_DIR}/internal/catch_config_static_analysis_support.hpp
|
||||
${SOURCES_DIR}/internal/catch_config_uncaught_exceptions.hpp
|
||||
${SOURCES_DIR}/internal/catch_config_wchar.hpp
|
||||
${SOURCES_DIR}/internal/catch_console_colour.hpp
|
||||
${SOURCES_DIR}/internal/catch_console_width.hpp
|
||||
${SOURCES_DIR}/internal/catch_container_nonmembers.hpp
|
||||
${SOURCES_DIR}/internal/catch_context.hpp
|
||||
${SOURCES_DIR}/internal/catch_debug_console.hpp
|
||||
${SOURCES_DIR}/internal/catch_debugger.hpp
|
||||
${SOURCES_DIR}/internal/catch_decomposer.hpp
|
||||
${SOURCES_DIR}/internal/catch_deprecation_macro.hpp
|
||||
${SOURCES_DIR}/internal/catch_enforce.hpp
|
||||
${SOURCES_DIR}/internal/catch_enum_values_registry.hpp
|
||||
${SOURCES_DIR}/internal/catch_errno_guard.hpp
|
||||
@@ -98,12 +97,10 @@ set(IMPL_HEADERS
|
||||
${SOURCES_DIR}/internal/catch_lazy_expr.hpp
|
||||
${SOURCES_DIR}/internal/catch_leak_detector.hpp
|
||||
${SOURCES_DIR}/internal/catch_list.hpp
|
||||
${SOURCES_DIR}/internal/catch_logical_traits.hpp
|
||||
${SOURCES_DIR}/internal/catch_message_info.hpp
|
||||
${SOURCES_DIR}/internal/catch_meta.hpp
|
||||
${SOURCES_DIR}/internal/catch_move_and_forward.hpp
|
||||
${SOURCES_DIR}/internal/catch_noncopyable.hpp
|
||||
${SOURCES_DIR}/internal/catch_optional.hpp
|
||||
${SOURCES_DIR}/internal/catch_output_redirect.hpp
|
||||
${SOURCES_DIR}/internal/catch_parse_numbers.hpp
|
||||
${SOURCES_DIR}/internal/catch_platform.hpp
|
||||
@@ -127,7 +124,6 @@ set(IMPL_HEADERS
|
||||
${SOURCES_DIR}/internal/catch_stdstreams.hpp
|
||||
${SOURCES_DIR}/internal/catch_stream_end_stop.hpp
|
||||
${SOURCES_DIR}/internal/catch_string_manip.hpp
|
||||
${SOURCES_DIR}/internal/catch_stringref.hpp
|
||||
${SOURCES_DIR}/internal/catch_tag_alias_registry.hpp
|
||||
${SOURCES_DIR}/internal/catch_template_test_registry.hpp
|
||||
${SOURCES_DIR}/internal/catch_test_case_info_hasher.hpp
|
||||
@@ -136,15 +132,16 @@ set(IMPL_HEADERS
|
||||
${SOURCES_DIR}/internal/catch_test_failure_exception.hpp
|
||||
${SOURCES_DIR}/internal/catch_test_macro_impl.hpp
|
||||
${SOURCES_DIR}/internal/catch_test_registry.hpp
|
||||
${SOURCES_DIR}/internal/catch_test_run_info.hpp
|
||||
${SOURCES_DIR}/internal/catch_test_spec_parser.hpp
|
||||
${SOURCES_DIR}/internal/catch_textflow.hpp
|
||||
${SOURCES_DIR}/internal/catch_thread_support.hpp
|
||||
${SOURCES_DIR}/internal/catch_to_string.hpp
|
||||
${SOURCES_DIR}/internal/catch_uncaught_exceptions.hpp
|
||||
${SOURCES_DIR}/internal/catch_uniform_floating_point_distribution.hpp
|
||||
${SOURCES_DIR}/internal/catch_uniform_integer_distribution.hpp
|
||||
${SOURCES_DIR}/internal/catch_unique_name.hpp
|
||||
${SOURCES_DIR}/internal/catch_unique_ptr.hpp
|
||||
${SOURCES_DIR}/internal/catch_unreachable.hpp
|
||||
${SOURCES_DIR}/internal/catch_void_type.hpp
|
||||
${SOURCES_DIR}/internal/catch_wildcard_pattern.hpp
|
||||
${SOURCES_DIR}/internal/catch_windows_h_proxy.hpp
|
||||
@@ -203,7 +200,6 @@ set(IMPL_SOURCES
|
||||
${SOURCES_DIR}/internal/catch_startup_exception_registry.cpp
|
||||
${SOURCES_DIR}/internal/catch_stdstreams.cpp
|
||||
${SOURCES_DIR}/internal/catch_string_manip.cpp
|
||||
${SOURCES_DIR}/internal/catch_stringref.cpp
|
||||
${SOURCES_DIR}/internal/catch_tag_alias_registry.cpp
|
||||
${SOURCES_DIR}/internal/catch_test_case_info_hasher.cpp
|
||||
${SOURCES_DIR}/internal/catch_test_case_registry_impl.cpp
|
||||
@@ -348,26 +344,24 @@ source_group("generated headers"
|
||||
)
|
||||
|
||||
add_library(Catch2 ${ALL_FILES})
|
||||
if (CATCH_ENABLE_REPRODUCIBLE_BUILD)
|
||||
add_build_reproducibility_settings(Catch2)
|
||||
if(CATCH_ENABLE_REPRODUCIBLE_BUILD)
|
||||
add_build_reproducibility_settings(Catch2)
|
||||
endif()
|
||||
add_library(Catch2::Catch2 ALIAS Catch2)
|
||||
|
||||
if (ANDROID)
|
||||
target_link_libraries(Catch2 PRIVATE log)
|
||||
if(ANDROID)
|
||||
target_link_libraries(Catch2 PRIVATE log)
|
||||
endif()
|
||||
|
||||
set_target_properties(Catch2 PROPERTIES
|
||||
DEBUG_POSTFIX "d"
|
||||
VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${PROJECT_VERSION})
|
||||
|
||||
# require C++14
|
||||
target_compile_features(Catch2
|
||||
PUBLIC
|
||||
cxx_std_14
|
||||
DEBUG_POSTFIX "d"
|
||||
VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${PROJECT_VERSION}
|
||||
)
|
||||
|
||||
# require C++17
|
||||
target_compile_features(Catch2 PUBLIC cxx_std_17)
|
||||
|
||||
configure_file(
|
||||
"${SOURCES_DIR}/catch_user_config.hpp.in"
|
||||
"${PROJECT_BINARY_DIR}/generated-includes/catch2/catch_user_config.hpp"
|
||||
@@ -382,105 +376,97 @@ target_include_directories(Catch2
|
||||
|
||||
|
||||
add_library(Catch2WithMain
|
||||
${SOURCES_DIR}/internal/catch_main.cpp
|
||||
${SOURCES_DIR}/internal/catch_main.cpp
|
||||
)
|
||||
if (CATCH_ENABLE_REPRODUCIBLE_BUILD)
|
||||
add_build_reproducibility_settings(Catch2WithMain)
|
||||
if(CATCH_ENABLE_REPRODUCIBLE_BUILD)
|
||||
add_build_reproducibility_settings(Catch2WithMain)
|
||||
endif()
|
||||
add_library(Catch2::Catch2WithMain ALIAS Catch2WithMain)
|
||||
target_link_libraries(Catch2WithMain PUBLIC Catch2)
|
||||
set_target_properties(Catch2WithMain
|
||||
PROPERTIES
|
||||
OUTPUT_NAME "Catch2Main"
|
||||
VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${PROJECT_VERSION}
|
||||
VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${PROJECT_VERSION}
|
||||
)
|
||||
set_target_properties(Catch2WithMain PROPERTIES DEBUG_POSTFIX "d")
|
||||
|
||||
if (NOT_SUBPROJECT)
|
||||
# create and install an export set for catch target as Catch2::Catch
|
||||
install(
|
||||
TARGETS
|
||||
Catch2
|
||||
Catch2WithMain
|
||||
EXPORT
|
||||
Catch2Targets
|
||||
LIBRARY DESTINATION
|
||||
${CMAKE_INSTALL_LIBDIR}
|
||||
ARCHIVE DESTINATION
|
||||
${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION
|
||||
${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
if(NOT_SUBPROJECT)
|
||||
# create and install an export set for catch target as Catch2::Catch
|
||||
install(
|
||||
TARGETS
|
||||
Catch2
|
||||
Catch2WithMain
|
||||
EXPORT
|
||||
Catch2Targets
|
||||
LIBRARY DESTINATION
|
||||
${CMAKE_INSTALL_LIBDIR}
|
||||
ARCHIVE DESTINATION
|
||||
${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION
|
||||
${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
|
||||
|
||||
install(
|
||||
EXPORT
|
||||
Catch2Targets
|
||||
NAMESPACE
|
||||
Catch2::
|
||||
DESTINATION
|
||||
${CATCH_CMAKE_CONFIG_DESTINATION}
|
||||
)
|
||||
# Install the headers
|
||||
install(
|
||||
DIRECTORY
|
||||
"${SOURCES_DIR}"
|
||||
"${PROJECT_BINARY_DIR}/generated-includes/catch2" # Also install the generated header
|
||||
DESTINATION
|
||||
"${CMAKE_INSTALL_INCLUDEDIR}"
|
||||
FILES_MATCHING
|
||||
PATTERN "*.hpp"
|
||||
)
|
||||
install(
|
||||
EXPORT
|
||||
Catch2Targets
|
||||
NAMESPACE
|
||||
Catch2::
|
||||
DESTINATION
|
||||
${CATCH_CMAKE_CONFIG_DESTINATION}
|
||||
)
|
||||
# Install the headers
|
||||
install(
|
||||
DIRECTORY
|
||||
"${SOURCES_DIR}"
|
||||
"${PROJECT_BINARY_DIR}/generated-includes/catch2" # Also install the generated header
|
||||
DESTINATION
|
||||
"${CMAKE_INSTALL_INCLUDEDIR}"
|
||||
FILES_MATCHING
|
||||
PATTERN "*.hpp"
|
||||
)
|
||||
endif()
|
||||
|
||||
# Some tests require a full recompilation of Catch2 lib with different
|
||||
# compilation flags. They can link against this target to recompile all
|
||||
# the sources into the binary.
|
||||
if (CATCH_BUILD_EXAMPLES OR CATCH_BUILD_EXTRA_TESTS)
|
||||
add_library(Catch2_buildall_interface INTERFACE)
|
||||
target_sources(Catch2_buildall_interface INTERFACE
|
||||
${ALL_FILES}
|
||||
# Also include main entry point
|
||||
${SOURCES_DIR}/internal/catch_main.cpp
|
||||
)
|
||||
target_include_directories(Catch2_buildall_interface
|
||||
INTERFACE
|
||||
$<BUILD_INTERFACE:${SOURCES_DIR}/..>
|
||||
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/generated-includes>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
target_compile_definitions(Catch2_buildall_interface
|
||||
INTERFACE
|
||||
CATCH_CONFIG_STATIC
|
||||
)
|
||||
target_compile_features(Catch2_buildall_interface
|
||||
INTERFACE
|
||||
cxx_std_14
|
||||
)
|
||||
if(CATCH_BUILD_EXAMPLES OR CATCH_BUILD_EXTRA_TESTS)
|
||||
add_library(Catch2_buildall_interface INTERFACE)
|
||||
target_sources(Catch2_buildall_interface INTERFACE
|
||||
${ALL_FILES}
|
||||
# Also include main entry point
|
||||
${SOURCES_DIR}/internal/catch_main.cpp
|
||||
)
|
||||
target_include_directories(Catch2_buildall_interface
|
||||
INTERFACE
|
||||
$<BUILD_INTERFACE:${SOURCES_DIR}/..>
|
||||
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/generated-includes>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
target_compile_definitions(Catch2_buildall_interface INTERFACE CATCH_CONFIG_STATIC)
|
||||
target_compile_features(Catch2_buildall_interface INTERFACE cxx_std_17)
|
||||
endif()
|
||||
|
||||
list(APPEND CATCH_WARNING_TARGETS Catch2 Catch2WithMain)
|
||||
set(CATCH_WARNING_TARGETS ${CATCH_WARNING_TARGETS} PARENT_SCOPE)
|
||||
|
||||
list(APPEND CATCH_IMPL_TARGETS Catch2 Catch2WithMain)
|
||||
set(CATCH_IMPL_TARGETS ${CATCH_IMPL_TARGETS} PARENT_SCOPE)
|
||||
|
||||
# We still do not support building dynamic library with hidden visibility
|
||||
# so we want to check & warn users if they do this. However, we won't abort
|
||||
# the configuration step so that we don't have to also provide an override.
|
||||
if (BUILD_SHARED_LIBS)
|
||||
if(BUILD_SHARED_LIBS)
|
||||
set_target_properties(Catch2 Catch2WithMain
|
||||
PROPERTIES
|
||||
WINDOWS_EXPORT_ALL_SYMBOLS ON
|
||||
)
|
||||
|
||||
get_target_property(_VisPreset Catch2 CXX_VISIBILITY_PRESET)
|
||||
if(NOT MSVC AND _VisPreset STREQUAL "hidden")
|
||||
set_target_properties(Catch2 Catch2WithMain
|
||||
PROPERTIES
|
||||
WINDOWS_EXPORT_ALL_SYMBOLS ON
|
||||
CXX_VISIBILITY_PRESET "default"
|
||||
VISIBILITY_INLINES_HIDDEN OFF
|
||||
)
|
||||
|
||||
get_target_property(_VisPreset Catch2 CXX_VISIBILITY_PRESET)
|
||||
if (NOT MSVC AND _VisPreset STREQUAL "hidden")
|
||||
set_target_properties(Catch2 Catch2WithMain
|
||||
PROPERTIES
|
||||
CXX_VISIBILITY_PRESET "default"
|
||||
VISIBILITY_INLINES_HIDDEN OFF
|
||||
)
|
||||
message(WARNING "Setting Catch2's visibility to default."
|
||||
" Hidden visibility is not supported.")
|
||||
endif()
|
||||
message(WARNING "Setting Catch2's visibility to default."
|
||||
" Hidden visibility is not supported.")
|
||||
endif()
|
||||
endif()
|
||||
|
@@ -86,9 +86,7 @@ namespace Catch {
|
||||
auto analysis = Detail::analyse(*cfg, samples.data(), samples.data() + samples.size());
|
||||
BenchmarkStats<> stats{ CATCH_MOVE(info), CATCH_MOVE(analysis.samples), analysis.mean, analysis.standard_deviation, analysis.outliers, analysis.outlier_variance };
|
||||
getResultCapture().benchmarkEnded(stats);
|
||||
} CATCH_CATCH_ANON (TestFailureException const&) {
|
||||
getResultCapture().benchmarkFailed("Benchmark failed due to failed assertion"_sr);
|
||||
} CATCH_CATCH_ALL{
|
||||
} CATCH_CATCH_ALL {
|
||||
getResultCapture().benchmarkFailed(translateActiveException());
|
||||
// We let the exception go further up so that the
|
||||
// test case is marked as failed.
|
||||
@@ -97,7 +95,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
// sets lambda to be used in fun *and* executes benchmark!
|
||||
template <typename Fun, std::enable_if_t<!Detail::is_related<Fun, Benchmark>::value, int> = 0>
|
||||
template <typename Fun, std::enable_if_t<!Detail::is_related_v<Fun, Benchmark>, int> = 0>
|
||||
Benchmark & operator=(Fun func) {
|
||||
auto const* cfg = getCurrentContext().getConfig();
|
||||
if (!cfg->skipBenchmarks()) {
|
||||
|
@@ -64,12 +64,12 @@ namespace Catch {
|
||||
}
|
||||
|
||||
template <typename Fn, typename... Args>
|
||||
inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> std::enable_if_t<!std::is_same<void, decltype(fn(args...))>::value> {
|
||||
inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> std::enable_if_t<!std::is_same_v<void, decltype(fn(args...))>> {
|
||||
deoptimize_value(CATCH_FORWARD(fn) (CATCH_FORWARD(args)...));
|
||||
}
|
||||
|
||||
template <typename Fn, typename... Args>
|
||||
inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> std::enable_if_t<std::is_same<void, decltype(fn(args...))>::value> {
|
||||
inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> std::enable_if_t<std::is_same_v<void, decltype(fn(args...))>> {
|
||||
CATCH_FORWARD((fn)) (CATCH_FORWARD(args)...);
|
||||
}
|
||||
} // namespace Benchmark
|
||||
|
@@ -46,7 +46,7 @@ namespace Catch {
|
||||
std::vector<FDuration> samples2;
|
||||
samples2.reserve(samples.size());
|
||||
for (auto s : samples) {
|
||||
samples2.push_back( FDuration( s ) );
|
||||
samples2.emplace_back( s );
|
||||
}
|
||||
|
||||
return {
|
||||
|
@@ -21,8 +21,7 @@ namespace Catch {
|
||||
namespace Benchmark {
|
||||
namespace Detail {
|
||||
template <typename T, typename U>
|
||||
struct is_related
|
||||
: std::is_same<std::decay_t<T>, std::decay_t<U>> {};
|
||||
static constexpr bool is_related_v = std::is_same_v<std::decay_t<T>, std::decay_t<U>>;
|
||||
|
||||
/// We need to reinvent std::function because every piece of code that might add overhead
|
||||
/// in a measurement context needs to have consistent performance characteristics so that we
|
||||
@@ -63,7 +62,7 @@ namespace Catch {
|
||||
BenchmarkFunction();
|
||||
|
||||
template <typename Fun,
|
||||
std::enable_if_t<!is_related<Fun, BenchmarkFunction>::value, int> = 0>
|
||||
std::enable_if_t<!is_related_v<Fun, BenchmarkFunction>, int> = 0>
|
||||
BenchmarkFunction(Fun&& fun)
|
||||
: f(new model<std::decay_t<Fun>>(CATCH_FORWARD(fun))) {}
|
||||
|
||||
|
@@ -15,7 +15,6 @@
|
||||
#include <catch2/benchmark/detail/catch_stats.hpp>
|
||||
#include <catch2/benchmark/detail/catch_measure.hpp>
|
||||
#include <catch2/benchmark/detail/catch_run_for_at_least.hpp>
|
||||
#include <catch2/benchmark/catch_clock.hpp>
|
||||
#include <catch2/internal/catch_unique_ptr.hpp>
|
||||
|
||||
#include <algorithm>
|
||||
|
@@ -13,8 +13,6 @@
|
||||
#include <catch2/benchmark/catch_clock.hpp>
|
||||
#include <catch2/benchmark/detail/catch_complete_invoke.hpp>
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
namespace Catch {
|
||||
namespace Benchmark {
|
||||
template <typename Result>
|
||||
|
@@ -37,6 +37,7 @@
|
||||
#include <catch2/catch_template_test_macros.hpp>
|
||||
#include <catch2/catch_test_case_info.hpp>
|
||||
#include <catch2/catch_test_macros.hpp>
|
||||
#include <catch2/catch_test_run_info.hpp>
|
||||
#include <catch2/catch_test_spec.hpp>
|
||||
#include <catch2/catch_timer.hpp>
|
||||
#include <catch2/catch_tostring.hpp>
|
||||
@@ -56,15 +57,14 @@
|
||||
#include <catch2/internal/catch_config_counter.hpp>
|
||||
#include <catch2/internal/catch_config_prefix_messages.hpp>
|
||||
#include <catch2/internal/catch_config_static_analysis_support.hpp>
|
||||
#include <catch2/internal/catch_config_uncaught_exceptions.hpp>
|
||||
#include <catch2/internal/catch_config_wchar.hpp>
|
||||
#include <catch2/internal/catch_console_colour.hpp>
|
||||
#include <catch2/internal/catch_console_width.hpp>
|
||||
#include <catch2/internal/catch_container_nonmembers.hpp>
|
||||
#include <catch2/internal/catch_context.hpp>
|
||||
#include <catch2/internal/catch_debug_console.hpp>
|
||||
#include <catch2/internal/catch_debugger.hpp>
|
||||
#include <catch2/internal/catch_decomposer.hpp>
|
||||
#include <catch2/internal/catch_deprecation_macro.hpp>
|
||||
#include <catch2/internal/catch_enforce.hpp>
|
||||
#include <catch2/internal/catch_enum_values_registry.hpp>
|
||||
#include <catch2/internal/catch_errno_guard.hpp>
|
||||
@@ -78,12 +78,10 @@
|
||||
#include <catch2/internal/catch_lazy_expr.hpp>
|
||||
#include <catch2/internal/catch_leak_detector.hpp>
|
||||
#include <catch2/internal/catch_list.hpp>
|
||||
#include <catch2/internal/catch_logical_traits.hpp>
|
||||
#include <catch2/internal/catch_message_info.hpp>
|
||||
#include <catch2/internal/catch_meta.hpp>
|
||||
#include <catch2/internal/catch_move_and_forward.hpp>
|
||||
#include <catch2/internal/catch_noncopyable.hpp>
|
||||
#include <catch2/internal/catch_optional.hpp>
|
||||
#include <catch2/internal/catch_output_redirect.hpp>
|
||||
#include <catch2/internal/catch_parse_numbers.hpp>
|
||||
#include <catch2/internal/catch_platform.hpp>
|
||||
@@ -108,7 +106,6 @@
|
||||
#include <catch2/internal/catch_stdstreams.hpp>
|
||||
#include <catch2/internal/catch_stream_end_stop.hpp>
|
||||
#include <catch2/internal/catch_string_manip.hpp>
|
||||
#include <catch2/internal/catch_stringref.hpp>
|
||||
#include <catch2/internal/catch_tag_alias_registry.hpp>
|
||||
#include <catch2/internal/catch_template_test_registry.hpp>
|
||||
#include <catch2/internal/catch_test_case_info_hasher.hpp>
|
||||
@@ -117,15 +114,16 @@
|
||||
#include <catch2/internal/catch_test_failure_exception.hpp>
|
||||
#include <catch2/internal/catch_test_macro_impl.hpp>
|
||||
#include <catch2/internal/catch_test_registry.hpp>
|
||||
#include <catch2/internal/catch_test_run_info.hpp>
|
||||
#include <catch2/internal/catch_test_spec_parser.hpp>
|
||||
#include <catch2/internal/catch_textflow.hpp>
|
||||
#include <catch2/internal/catch_thread_support.hpp>
|
||||
#include <catch2/internal/catch_to_string.hpp>
|
||||
#include <catch2/internal/catch_uncaught_exceptions.hpp>
|
||||
#include <catch2/internal/catch_uniform_floating_point_distribution.hpp>
|
||||
#include <catch2/internal/catch_uniform_integer_distribution.hpp>
|
||||
#include <catch2/internal/catch_unique_name.hpp>
|
||||
#include <catch2/internal/catch_unique_ptr.hpp>
|
||||
#include <catch2/internal/catch_unreachable.hpp>
|
||||
#include <catch2/internal/catch_void_type.hpp>
|
||||
#include <catch2/internal/catch_wildcard_pattern.hpp>
|
||||
#include <catch2/internal/catch_xmlwriter.hpp>
|
||||
|
@@ -29,7 +29,7 @@ namespace Catch {
|
||||
|
||||
Approx operator-() const;
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
Approx operator()( T const& value ) const {
|
||||
Approx approx( static_cast<double>(value) );
|
||||
approx.m_epsilon = m_epsilon;
|
||||
@@ -38,67 +38,67 @@ namespace Catch {
|
||||
return approx;
|
||||
}
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
explicit Approx( T const& value ): Approx(static_cast<double>(value))
|
||||
{}
|
||||
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
friend bool operator == ( const T& lhs, Approx const& rhs ) {
|
||||
auto lhs_v = static_cast<double>(lhs);
|
||||
return rhs.equalityComparisonImpl(lhs_v);
|
||||
}
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
friend bool operator == ( Approx const& lhs, const T& rhs ) {
|
||||
return operator==( rhs, lhs );
|
||||
}
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
friend bool operator != ( T const& lhs, Approx const& rhs ) {
|
||||
return !operator==( lhs, rhs );
|
||||
}
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
friend bool operator != ( Approx const& lhs, T const& rhs ) {
|
||||
return !operator==( rhs, lhs );
|
||||
}
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
friend bool operator <= ( T const& lhs, Approx const& rhs ) {
|
||||
return static_cast<double>(lhs) < rhs.m_value || lhs == rhs;
|
||||
}
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
friend bool operator <= ( Approx const& lhs, T const& rhs ) {
|
||||
return lhs.m_value < static_cast<double>(rhs) || lhs == rhs;
|
||||
}
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
friend bool operator >= ( T const& lhs, Approx const& rhs ) {
|
||||
return static_cast<double>(lhs) > rhs.m_value || lhs == rhs;
|
||||
}
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
friend bool operator >= ( Approx const& lhs, T const& rhs ) {
|
||||
return lhs.m_value > static_cast<double>(rhs) || lhs == rhs;
|
||||
}
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
Approx& epsilon( T const& newEpsilon ) {
|
||||
const auto epsilonAsDouble = static_cast<double>(newEpsilon);
|
||||
setEpsilon(epsilonAsDouble);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
Approx& margin( T const& newMargin ) {
|
||||
const auto marginAsDouble = static_cast<double>(newMargin);
|
||||
setMargin(marginAsDouble);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible<double, T>::value>>
|
||||
template <typename T, typename = std::enable_if_t<std::is_constructible_v<double, T>>>
|
||||
Approx& scale( T const& newScale ) {
|
||||
m_scale = static_cast<double>(newScale);
|
||||
return *this;
|
||||
|
@@ -10,16 +10,17 @@
|
||||
|
||||
#include <catch2/internal/catch_result_type.hpp>
|
||||
#include <catch2/internal/catch_source_line_info.hpp>
|
||||
#include <catch2/internal/catch_stringref.hpp>
|
||||
|
||||
#include <string_view>
|
||||
|
||||
namespace Catch {
|
||||
|
||||
struct AssertionInfo {
|
||||
// AssertionInfo() = delete;
|
||||
|
||||
StringRef macroName;
|
||||
std::string_view macroName;
|
||||
SourceLineInfo lineInfo;
|
||||
StringRef capturedExpression;
|
||||
std::string_view capturedExpression;
|
||||
ResultDisposition::Flags resultDisposition;
|
||||
};
|
||||
|
||||
|
@@ -91,14 +91,14 @@ namespace Catch {
|
||||
: expr;
|
||||
}
|
||||
|
||||
StringRef AssertionResult::getMessage() const {
|
||||
std::string_view AssertionResult::getMessage() const {
|
||||
return m_resultData.message;
|
||||
}
|
||||
SourceLineInfo AssertionResult::getSourceInfo() const {
|
||||
return m_info.lineInfo;
|
||||
}
|
||||
|
||||
StringRef AssertionResult::getTestMacroName() const {
|
||||
std::string_view AssertionResult::getTestMacroName() const {
|
||||
return m_info.macroName;
|
||||
}
|
||||
|
||||
|
@@ -11,7 +11,6 @@
|
||||
#include <catch2/catch_assertion_info.hpp>
|
||||
#include <catch2/internal/catch_result_type.hpp>
|
||||
#include <catch2/internal/catch_source_line_info.hpp>
|
||||
#include <catch2/internal/catch_stringref.hpp>
|
||||
#include <catch2/internal/catch_lazy_expr.hpp>
|
||||
|
||||
#include <string>
|
||||
@@ -46,9 +45,9 @@ namespace Catch {
|
||||
std::string getExpressionInMacro() const;
|
||||
bool hasExpandedExpression() const;
|
||||
std::string getExpandedExpression() const;
|
||||
StringRef getMessage() const;
|
||||
std::string_view getMessage() const;
|
||||
SourceLineInfo getSourceInfo() const;
|
||||
StringRef getTestMacroName() const;
|
||||
std::string_view getTestMacroName() const;
|
||||
|
||||
//protected:
|
||||
AssertionInfo m_info;
|
||||
|
@@ -10,13 +10,13 @@
|
||||
#include <catch2/internal/catch_enforce.hpp>
|
||||
#include <catch2/internal/catch_parse_numbers.hpp>
|
||||
#include <catch2/internal/catch_stdstreams.hpp>
|
||||
#include <catch2/internal/catch_stringref.hpp>
|
||||
#include <catch2/internal/catch_string_manip.hpp>
|
||||
#include <catch2/internal/catch_test_spec_parser.hpp>
|
||||
#include <catch2/interfaces/catch_interfaces_tag_alias_registry.hpp>
|
||||
#include <catch2/internal/catch_getenv.hpp>
|
||||
|
||||
#include <fstream>
|
||||
#include <optional>
|
||||
|
||||
namespace Catch {
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace Catch {
|
||||
std::string shardFilePath;
|
||||
};
|
||||
|
||||
static Optional<bazelShardingOptions> readBazelShardingOptions() {
|
||||
static std::optional<bazelShardingOptions> readBazelShardingOptions() {
|
||||
const auto bazelShardIndex = Detail::getEnv( "TEST_SHARD_INDEX" );
|
||||
const auto bazelShardTotal = Detail::getEnv( "TEST_TOTAL_SHARDS" );
|
||||
const auto bazelShardInfoFile = Detail::getEnv( "TEST_SHARD_STATUS_FILE" );
|
||||
@@ -142,7 +142,7 @@ namespace Catch {
|
||||
// We do the default-output check separately, while always
|
||||
// using the default output below to make the code simpler
|
||||
// and avoid superfluous copies.
|
||||
if ( reporterSpec.outputFile().none() ) {
|
||||
if ( !reporterSpec.outputFile() ) {
|
||||
CATCH_ENFORCE( !defaultOutputUsed,
|
||||
"Internal error: cannot use default output for "
|
||||
"multiple reporters" );
|
||||
@@ -153,7 +153,7 @@ namespace Catch {
|
||||
reporterSpec.name(),
|
||||
reporterSpec.outputFile() ? *reporterSpec.outputFile()
|
||||
: data.defaultOutputFilename,
|
||||
reporterSpec.colourMode().valueOr( data.defaultColourMode ),
|
||||
reporterSpec.colourMode().value_or( data.defaultColourMode ),
|
||||
reporterSpec.customOptions() } );
|
||||
}
|
||||
}
|
||||
@@ -185,7 +185,7 @@ namespace Catch {
|
||||
|
||||
// IConfig interface
|
||||
bool Config::allowThrows() const { return !m_data.noThrow; }
|
||||
StringRef Config::name() const { return m_data.name.empty() ? m_data.processName : m_data.name; }
|
||||
std::string_view Config::name() const { return m_data.name.empty() ? m_data.processName : m_data.name; }
|
||||
bool Config::includeSuccessfulResults() const { return m_data.showSuccessfulTests; }
|
||||
bool Config::warnAboutMissingAssertions() const {
|
||||
return !!( m_data.warnings & WarnAbout::NoAssertions );
|
||||
|
@@ -11,8 +11,6 @@
|
||||
#include <catch2/catch_test_spec.hpp>
|
||||
#include <catch2/interfaces/catch_interfaces_config.hpp>
|
||||
#include <catch2/internal/catch_unique_ptr.hpp>
|
||||
#include <catch2/internal/catch_optional.hpp>
|
||||
#include <catch2/internal/catch_stringref.hpp>
|
||||
#include <catch2/internal/catch_random_seed_generation.hpp>
|
||||
#include <catch2/internal/catch_reporter_spec_parser.hpp>
|
||||
|
||||
@@ -76,7 +74,7 @@ namespace Catch {
|
||||
WarnAbout::What warnings = WarnAbout::Nothing;
|
||||
ShowDurations showDurations = ShowDurations::DefaultForReporter;
|
||||
double minDuration = -1;
|
||||
TestRunOrder runOrder = TestRunOrder::Declared;
|
||||
TestRunOrder runOrder = TestRunOrder::Randomized;
|
||||
ColourMode defaultColourMode = ColourMode::PlatformDefault;
|
||||
WaitForKeypress::When waitForKeypress = WaitForKeypress::Never;
|
||||
|
||||
@@ -116,7 +114,7 @@ namespace Catch {
|
||||
|
||||
// IConfig interface
|
||||
bool allowThrows() const override;
|
||||
StringRef name() const override;
|
||||
std::string_view name() const override;
|
||||
bool includeSuccessfulResults() const override;
|
||||
bool warnAboutMissingAssertions() const override;
|
||||
bool warnAboutUnmatchedTestSpecs() const override;
|
||||
|
@@ -7,7 +7,6 @@
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
#include <catch2/catch_message.hpp>
|
||||
#include <catch2/interfaces/catch_interfaces_capture.hpp>
|
||||
#include <catch2/internal/catch_uncaught_exceptions.hpp>
|
||||
#include <catch2/internal/catch_enforce.hpp>
|
||||
#include <catch2/internal/catch_move_and_forward.hpp>
|
||||
|
||||
@@ -20,27 +19,26 @@ namespace Catch {
|
||||
|
||||
|
||||
ScopedMessage::ScopedMessage( MessageBuilder&& builder ):
|
||||
m_info( CATCH_MOVE(builder.m_info) ) {
|
||||
m_info.message = builder.m_stream.str();
|
||||
getResultCapture().pushScopedMessage( m_info );
|
||||
m_messageId( builder.m_info.sequence ) {
|
||||
MessageInfo info( CATCH_MOVE( builder.m_info ) );
|
||||
info.message = builder.m_stream.str();
|
||||
getResultCapture().pushScopedMessage( CATCH_MOVE(info) );
|
||||
}
|
||||
|
||||
ScopedMessage::ScopedMessage( ScopedMessage&& old ) noexcept:
|
||||
m_info( CATCH_MOVE( old.m_info ) ) {
|
||||
m_messageId( old.m_messageId ) {
|
||||
old.m_moved = true;
|
||||
}
|
||||
|
||||
ScopedMessage::~ScopedMessage() {
|
||||
if ( !uncaught_exceptions() && !m_moved ){
|
||||
getResultCapture().popScopedMessage(m_info);
|
||||
}
|
||||
if ( !m_moved ) { getResultCapture().popScopedMessage( m_messageId ); }
|
||||
}
|
||||
|
||||
|
||||
Capturer::Capturer( StringRef macroName,
|
||||
Capturer::Capturer( std::string_view macroName,
|
||||
SourceLineInfo const& lineInfo,
|
||||
ResultWas::OfType resultType,
|
||||
StringRef names ):
|
||||
std::string_view names ):
|
||||
m_resultCapture( getResultCapture() ) {
|
||||
auto trimmed = [&] (size_t start, size_t end) {
|
||||
while (names[start] == ',' || isspace(static_cast<unsigned char>(names[start]))) {
|
||||
@@ -87,7 +85,7 @@ namespace Catch {
|
||||
case ',':
|
||||
if (start != pos && openings.empty()) {
|
||||
m_messages.emplace_back(macroName, lineInfo, resultType);
|
||||
m_messages.back().message = static_cast<std::string>(trimmed(start, pos));
|
||||
m_messages.back().message += trimmed(start, pos);
|
||||
m_messages.back().message += " := ";
|
||||
start = pos;
|
||||
}
|
||||
@@ -97,21 +95,20 @@ namespace Catch {
|
||||
}
|
||||
assert(openings.empty() && "Mismatched openings");
|
||||
m_messages.emplace_back(macroName, lineInfo, resultType);
|
||||
m_messages.back().message = static_cast<std::string>(trimmed(start, names.size() - 1));
|
||||
m_messages.back().message += trimmed(start, names.size() - 1);
|
||||
m_messages.back().message += " := ";
|
||||
}
|
||||
Capturer::~Capturer() {
|
||||
if ( !uncaught_exceptions() ){
|
||||
assert( m_captured == m_messages.size() );
|
||||
for( size_t i = 0; i < m_captured; ++i )
|
||||
m_resultCapture.popScopedMessage( m_messages[i] );
|
||||
assert( m_captured == m_messages.size() );
|
||||
for (auto const& message : m_messages) {
|
||||
m_resultCapture.popScopedMessage( message.sequence );
|
||||
}
|
||||
}
|
||||
|
||||
void Capturer::captureValue( size_t index, std::string const& value ) {
|
||||
assert( index < m_messages.size() );
|
||||
m_messages[index].message += value;
|
||||
m_resultCapture.pushScopedMessage( m_messages[index] );
|
||||
m_resultCapture.pushScopedMessage( CATCH_MOVE(m_messages[index]) );
|
||||
m_captured++;
|
||||
}
|
||||
|
||||
|
@@ -36,7 +36,7 @@ namespace Catch {
|
||||
};
|
||||
|
||||
struct MessageBuilder : MessageStream {
|
||||
MessageBuilder( StringRef macroName,
|
||||
MessageBuilder( std::string_view macroName,
|
||||
SourceLineInfo const& lineInfo,
|
||||
ResultWas::OfType type ):
|
||||
m_info(macroName, lineInfo, type) {}
|
||||
@@ -57,7 +57,7 @@ namespace Catch {
|
||||
ScopedMessage( ScopedMessage&& old ) noexcept;
|
||||
~ScopedMessage();
|
||||
|
||||
MessageInfo m_info;
|
||||
unsigned int m_messageId;
|
||||
bool m_moved = false;
|
||||
};
|
||||
|
||||
@@ -66,7 +66,7 @@ namespace Catch {
|
||||
IResultCapture& m_resultCapture;
|
||||
size_t m_captured = 0;
|
||||
public:
|
||||
Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names );
|
||||
Capturer( std::string_view macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, std::string_view names );
|
||||
|
||||
Capturer(Capturer const&) = delete;
|
||||
Capturer& operator=(Capturer const&) = delete;
|
||||
@@ -92,26 +92,26 @@ namespace Catch {
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
#define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \
|
||||
do { \
|
||||
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \
|
||||
Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, std::string_view(), resultDisposition ); \
|
||||
catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \
|
||||
catchAssertionHandler.complete(); \
|
||||
} while( false )
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
#define INTERNAL_CATCH_CAPTURE( varName, macroName, ... ) \
|
||||
Catch::Capturer varName( macroName##_catch_sr, \
|
||||
Catch::Capturer varName( macroName, \
|
||||
CATCH_INTERNAL_LINEINFO, \
|
||||
Catch::ResultWas::Info, \
|
||||
#__VA_ARGS__##_catch_sr ); \
|
||||
#__VA_ARGS__ ); \
|
||||
varName.captureValues( 0, __VA_ARGS__ )
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
#define INTERNAL_CATCH_INFO( macroName, log ) \
|
||||
const Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log )
|
||||
const Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log )
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
#define INTERNAL_CATCH_UNSCOPED_INFO( macroName, log ) \
|
||||
Catch::getResultCapture().emplaceUnscopedMessage( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log )
|
||||
Catch::getResultCapture().emplaceUnscopedMessage( Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log )
|
||||
|
||||
|
||||
#if defined(CATCH_CONFIG_PREFIX_MESSAGES) && !defined(CATCH_CONFIG_DISABLE)
|
||||
|
@@ -10,7 +10,6 @@
|
||||
|
||||
#include <catch2/internal/catch_move_and_forward.hpp>
|
||||
#include <catch2/internal/catch_source_line_info.hpp>
|
||||
#include <catch2/internal/catch_stringref.hpp>
|
||||
#include <catch2/catch_totals.hpp>
|
||||
|
||||
#include <string>
|
||||
|
@@ -25,7 +25,6 @@
|
||||
#include <catch2/internal/catch_stdstreams.hpp>
|
||||
#include <catch2/internal/catch_istream.hpp>
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <exception>
|
||||
#include <iomanip>
|
||||
@@ -34,14 +33,6 @@
|
||||
namespace Catch {
|
||||
|
||||
namespace {
|
||||
static constexpr int TestFailureExitCode = 42;
|
||||
static constexpr int UnspecifiedErrorExitCode = 1;
|
||||
static constexpr int AllTestsSkippedExitCode = 4;
|
||||
static constexpr int NoTestsRunExitCode = 2;
|
||||
static constexpr int UnmatchedTestSpecExitCode = 3;
|
||||
static constexpr int InvalidTestSpecExitCode = 5;
|
||||
|
||||
|
||||
IEventListenerPtr createReporter(std::string const& reporterName, ReporterConfig&& config) {
|
||||
auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, CATCH_MOVE(config));
|
||||
CATCH_ENFORCE(reporter, "No reporter registered with name: '" << reporterName << '\'');
|
||||
|
@@ -16,6 +16,13 @@
|
||||
|
||||
namespace Catch {
|
||||
|
||||
constexpr int UnspecifiedErrorExitCode = 1;
|
||||
constexpr int NoTestsRunExitCode = 2;
|
||||
constexpr int UnmatchedTestSpecExitCode = 3;
|
||||
constexpr int AllTestsSkippedExitCode = 4;
|
||||
constexpr int InvalidTestSpecExitCode = 5;
|
||||
constexpr int TestFailureExitCode = 42;
|
||||
|
||||
class Session : Detail::NonCopyable {
|
||||
public:
|
||||
|
||||
|
@@ -23,7 +23,7 @@ namespace Catch {
|
||||
#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \
|
||||
CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
|
||||
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
||||
namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \
|
||||
namespace{ const Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \
|
||||
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
|
||||
|
||||
#endif // CATCH_TAG_ALIAS_AUTOREGISTRAR_HPP_INCLUDED
|
||||
|
@@ -14,6 +14,7 @@
|
||||
#include <cassert>
|
||||
#include <cctype>
|
||||
#include <algorithm>
|
||||
#include <string_view>
|
||||
|
||||
namespace Catch {
|
||||
|
||||
@@ -47,28 +48,28 @@ namespace Catch {
|
||||
return tcp != TestCaseProperties::None;
|
||||
}
|
||||
|
||||
TestCaseProperties parseSpecialTag( StringRef tag ) {
|
||||
TestCaseProperties parseSpecialTag( std::string_view tag ) {
|
||||
if( !tag.empty() && tag[0] == '.' )
|
||||
return TestCaseProperties::IsHidden;
|
||||
else if( tag == "!throws"_sr )
|
||||
else if( tag == "!throws" )
|
||||
return TestCaseProperties::Throws;
|
||||
else if( tag == "!shouldfail"_sr )
|
||||
else if( tag == "!shouldfail" )
|
||||
return TestCaseProperties::ShouldFail;
|
||||
else if( tag == "!mayfail"_sr )
|
||||
else if( tag == "!mayfail" )
|
||||
return TestCaseProperties::MayFail;
|
||||
else if( tag == "!nonportable"_sr )
|
||||
else if( tag == "!nonportable" )
|
||||
return TestCaseProperties::NonPortable;
|
||||
else if( tag == "!benchmark"_sr )
|
||||
else if( tag == "!benchmark" )
|
||||
return TestCaseProperties::Benchmark | TestCaseProperties::IsHidden;
|
||||
else
|
||||
return TestCaseProperties::None;
|
||||
}
|
||||
bool isReservedTag( StringRef tag ) {
|
||||
bool isReservedTag( std::string_view tag ) {
|
||||
return parseSpecialTag( tag ) == TestCaseProperties::None
|
||||
&& tag.size() > 0
|
||||
&& !std::isalnum( static_cast<unsigned char>(tag[0]) );
|
||||
}
|
||||
void enforceNotReservedTag( StringRef tag, SourceLineInfo const& _lineInfo ) {
|
||||
void enforceNotReservedTag( std::string_view tag, SourceLineInfo const& _lineInfo ) {
|
||||
CATCH_ENFORCE( !isReservedTag(tag),
|
||||
"Tag name: [" << tag << "] is not allowed.\n"
|
||||
<< "Tag names starting with non alphanumeric characters are reserved\n"
|
||||
@@ -80,13 +81,13 @@ namespace Catch {
|
||||
return "Anonymous test case " + std::to_string(++counter);
|
||||
}
|
||||
|
||||
constexpr StringRef extractFilenamePart(StringRef filename) {
|
||||
constexpr std::string_view extractFilenamePart(std::string_view filename) {
|
||||
size_t lastDot = filename.size();
|
||||
while (lastDot > 0 && filename[lastDot - 1] != '.') {
|
||||
--lastDot;
|
||||
}
|
||||
// In theory we could have filename without any extension in it
|
||||
if ( lastDot == 0 ) { return StringRef(); }
|
||||
if ( lastDot == 0 ) { return std::string_view(); }
|
||||
|
||||
--lastDot;
|
||||
size_t nameStart = lastDot;
|
||||
@@ -98,7 +99,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
// Returns the upper bound on size of extra tags ([#file]+[.])
|
||||
constexpr size_t sizeOfExtraTags(StringRef filepath) {
|
||||
constexpr size_t sizeOfExtraTags(std::string_view filepath) {
|
||||
// [.] is 3, [#] is another 3
|
||||
const size_t extras = 3 + 3;
|
||||
return extractFilenamePart(filepath).size() + extras;
|
||||
@@ -115,20 +116,20 @@ namespace Catch {
|
||||
}
|
||||
|
||||
Detail::unique_ptr<TestCaseInfo>
|
||||
makeTestCaseInfo(StringRef _className,
|
||||
makeTestCaseInfo(std::string_view _className,
|
||||
NameAndTags const& nameAndTags,
|
||||
SourceLineInfo const& _lineInfo ) {
|
||||
return Detail::make_unique<TestCaseInfo>(_className, nameAndTags, _lineInfo);
|
||||
}
|
||||
|
||||
TestCaseInfo::TestCaseInfo(StringRef _className,
|
||||
TestCaseInfo::TestCaseInfo(std::string_view _className,
|
||||
NameAndTags const& _nameAndTags,
|
||||
SourceLineInfo const& _lineInfo):
|
||||
name( _nameAndTags.name.empty() ? makeDefaultName() : _nameAndTags.name ),
|
||||
className( _className ),
|
||||
lineInfo( _lineInfo )
|
||||
{
|
||||
StringRef originalTags = _nameAndTags.tags;
|
||||
std::string_view originalTags = _nameAndTags.tags;
|
||||
// We need to reserve enough space to store all of the tags
|
||||
// (including optional hidden tag and filename tag)
|
||||
auto requiredSize = originalTags.size() + sizeOfExtraTags(_lineInfo.file);
|
||||
@@ -163,7 +164,7 @@ namespace Catch {
|
||||
// We need to check the tag for special meanings, copy
|
||||
// it over to backing storage and actually reference the
|
||||
// backing storage in the saved tags
|
||||
StringRef tagStr = originalTags.substr(tagStart+1, tagEnd - tagStart - 1);
|
||||
std::string_view tagStr = originalTags.substr(tagStart+1, tagEnd - tagStart - 1);
|
||||
CATCH_ENFORCE( !tagStr.empty(),
|
||||
"Found an empty tag while registering test case '"
|
||||
<< _nameAndTags.name << "' at "
|
||||
@@ -190,7 +191,7 @@ namespace Catch {
|
||||
|
||||
// Add [.] if relevant
|
||||
if (isHidden()) {
|
||||
internalAppendTag("."_sr);
|
||||
internalAppendTag(".");
|
||||
}
|
||||
|
||||
// Sort and prepare tags
|
||||
@@ -235,13 +236,13 @@ namespace Catch {
|
||||
return ret;
|
||||
}
|
||||
|
||||
void TestCaseInfo::internalAppendTag(StringRef tagStr) {
|
||||
void TestCaseInfo::internalAppendTag(std::string_view tagStr) {
|
||||
backingTags += '[';
|
||||
const auto backingStart = backingTags.size();
|
||||
backingTags += tagStr;
|
||||
const auto backingEnd = backingTags.size();
|
||||
backingTags += ']';
|
||||
tags.emplace_back(StringRef(backingTags.c_str() + backingStart, backingEnd - backingStart));
|
||||
tags.emplace_back(std::string_view(backingTags.c_str() + backingStart, backingEnd - backingStart));
|
||||
}
|
||||
|
||||
bool operator<( TestCaseInfo const& lhs, TestCaseInfo const& rhs ) {
|
||||
|
@@ -11,12 +11,12 @@
|
||||
#include <catch2/interfaces/catch_interfaces_test_invoker.hpp>
|
||||
#include <catch2/internal/catch_source_line_info.hpp>
|
||||
#include <catch2/internal/catch_noncopyable.hpp>
|
||||
#include <catch2/internal/catch_stringref.hpp>
|
||||
#include <catch2/internal/catch_unique_ptr.hpp>
|
||||
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
#ifdef __clang__
|
||||
@@ -34,10 +34,10 @@ namespace Catch {
|
||||
* as "cool-tag" internally.
|
||||
*/
|
||||
struct Tag {
|
||||
constexpr Tag(StringRef original_):
|
||||
constexpr Tag(std::string_view original_):
|
||||
original(original_)
|
||||
{}
|
||||
StringRef original;
|
||||
std::string_view original;
|
||||
|
||||
friend bool operator< ( Tag const& lhs, Tag const& rhs );
|
||||
friend bool operator==( Tag const& lhs, Tag const& rhs );
|
||||
@@ -67,7 +67,7 @@ namespace Catch {
|
||||
*/
|
||||
struct TestCaseInfo : Detail::NonCopyable {
|
||||
|
||||
TestCaseInfo(StringRef _className,
|
||||
TestCaseInfo(std::string_view _className,
|
||||
NameAndTags const& _nameAndTags,
|
||||
SourceLineInfo const& _lineInfo);
|
||||
|
||||
@@ -87,12 +87,12 @@ namespace Catch {
|
||||
std::string tagsAsString() const;
|
||||
|
||||
std::string name;
|
||||
StringRef className;
|
||||
std::string_view className;
|
||||
private:
|
||||
std::string backingTags;
|
||||
// Internally we copy tags to the backing storage and then add
|
||||
// refs to this storage to the tags vector.
|
||||
void internalAppendTag(StringRef tagString);
|
||||
void internalAppendTag(std::string_view tagString);
|
||||
public:
|
||||
std::vector<Tag> tags;
|
||||
SourceLineInfo lineInfo;
|
||||
@@ -130,7 +130,7 @@ namespace Catch {
|
||||
};
|
||||
|
||||
Detail::unique_ptr<TestCaseInfo>
|
||||
makeTestCaseInfo( StringRef className,
|
||||
makeTestCaseInfo( std::string_view className,
|
||||
NameAndTags const& nameAndTags,
|
||||
SourceLineInfo const& lineInfo );
|
||||
}
|
||||
|
@@ -14,6 +14,7 @@
|
||||
#include <catch2/internal/catch_section.hpp>
|
||||
#include <catch2/internal/catch_test_registry.hpp>
|
||||
#include <catch2/internal/catch_unique_name.hpp>
|
||||
#include <catch2/internal/catch_unreachable.hpp>
|
||||
|
||||
|
||||
// All of our user-facing macros support configuration toggle, that
|
||||
@@ -47,10 +48,16 @@
|
||||
#define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )
|
||||
#define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
|
||||
#define CATCH_DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ )
|
||||
#define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )
|
||||
#define CATCH_FAIL( ... ) do { \
|
||||
INTERNAL_CATCH_MSG("CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ); \
|
||||
Catch::Detail::Unreachable(); \
|
||||
} while ( false )
|
||||
#define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
|
||||
#define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
|
||||
#define CATCH_SKIP( ... ) INTERNAL_CATCH_MSG( "SKIP", Catch::ResultWas::ExplicitSkip, Catch::ResultDisposition::Normal, __VA_ARGS__ )
|
||||
#define CATCH_SKIP( ... ) do { \
|
||||
INTERNAL_CATCH_MSG( "CATCH_SKIP", Catch::ResultWas::ExplicitSkip, Catch::ResultDisposition::Normal, __VA_ARGS__ ); \
|
||||
Catch::Detail::Unreachable(); \
|
||||
} while (false)
|
||||
|
||||
|
||||
#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)
|
||||
@@ -148,10 +155,16 @@
|
||||
#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )
|
||||
#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
|
||||
#define DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ )
|
||||
#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )
|
||||
#define FAIL( ... ) do { \
|
||||
INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ); \
|
||||
Catch::Detail::Unreachable(); \
|
||||
} while (false)
|
||||
#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
|
||||
#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
|
||||
#define SKIP( ... ) INTERNAL_CATCH_MSG( "SKIP", Catch::ResultWas::ExplicitSkip, Catch::ResultDisposition::Normal, __VA_ARGS__ )
|
||||
#define SKIP( ... ) do { \
|
||||
INTERNAL_CATCH_MSG( "SKIP", Catch::ResultWas::ExplicitSkip, Catch::ResultDisposition::Normal, __VA_ARGS__ ); \
|
||||
Catch::Detail::Unreachable(); \
|
||||
} while (false)
|
||||
|
||||
|
||||
#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)
|
||||
|
@@ -8,13 +8,13 @@
|
||||
#ifndef CATCH_TEST_RUN_INFO_HPP_INCLUDED
|
||||
#define CATCH_TEST_RUN_INFO_HPP_INCLUDED
|
||||
|
||||
#include <catch2/internal/catch_stringref.hpp>
|
||||
#include <string_view>
|
||||
|
||||
namespace Catch {
|
||||
|
||||
struct TestRunInfo {
|
||||
constexpr TestRunInfo(StringRef _name) : name(_name) {}
|
||||
StringRef name;
|
||||
constexpr TestRunInfo(std::string_view _name) : name(_name) {}
|
||||
std::string_view name;
|
||||
};
|
||||
|
||||
} // end namespace Catch
|
@@ -8,11 +8,12 @@
|
||||
|
||||
#include <catch2/catch_tostring.hpp>
|
||||
#include <catch2/interfaces/catch_interfaces_config.hpp>
|
||||
#include <catch2/interfaces/catch_interfaces_registry_hub.hpp>
|
||||
#include <catch2/internal/catch_context.hpp>
|
||||
#include <catch2/internal/catch_polyfills.hpp>
|
||||
|
||||
#include <cmath>
|
||||
#include <iomanip>
|
||||
#include <cstddef>
|
||||
|
||||
namespace Catch {
|
||||
|
||||
@@ -57,7 +58,7 @@ namespace Detail {
|
||||
}
|
||||
} // end unnamed namespace
|
||||
|
||||
std::string convertIntoString(StringRef string, bool escapeInvisibles) {
|
||||
std::string convertIntoString(std::string_view string, bool escapeInvisibles) {
|
||||
std::string ret;
|
||||
// This is enough for the "don't escape invisibles" case, and a good
|
||||
// lower bound on the "escape invisibles" case.
|
||||
@@ -95,7 +96,7 @@ namespace Detail {
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::string convertIntoString(StringRef string) {
|
||||
std::string convertIntoString(std::string_view string) {
|
||||
return convertIntoString(string, getCurrentContext().getConfig()->showInvisibles());
|
||||
}
|
||||
|
||||
@@ -114,6 +115,13 @@ namespace Detail {
|
||||
rss << std::setw(2) << static_cast<unsigned>(bytes[i]);
|
||||
return rss.str();
|
||||
}
|
||||
|
||||
std::string makeExceptionHappenedString() {
|
||||
return "{ stringification failed with an exception: \"" +
|
||||
translateActiveException() + "\" }";
|
||||
|
||||
}
|
||||
|
||||
} // end Detail namespace
|
||||
|
||||
|
||||
@@ -128,11 +136,9 @@ std::string StringMaker<std::string>::convert(const std::string& str) {
|
||||
return Detail::convertIntoString( str );
|
||||
}
|
||||
|
||||
#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
|
||||
std::string StringMaker<std::string_view>::convert(std::string_view str) {
|
||||
return Detail::convertIntoString( StringRef( str.data(), str.size() ) );
|
||||
return Detail::convertIntoString( std::string_view( str.data(), str.size() ) );
|
||||
}
|
||||
#endif
|
||||
|
||||
std::string StringMaker<char const*>::convert(char const* str) {
|
||||
if (str) {
|
||||
@@ -159,11 +165,9 @@ std::string StringMaker<std::wstring>::convert(const std::wstring& wstr) {
|
||||
return ::Catch::Detail::stringify(s);
|
||||
}
|
||||
|
||||
# ifdef CATCH_CONFIG_CPP17_STRING_VIEW
|
||||
std::string StringMaker<std::wstring_view>::convert(std::wstring_view str) {
|
||||
return StringMaker<std::wstring>::convert(std::wstring(str));
|
||||
}
|
||||
# endif
|
||||
|
||||
std::string StringMaker<wchar_t const*>::convert(wchar_t const * str) {
|
||||
if (str) {
|
||||
@@ -181,12 +185,9 @@ std::string StringMaker<wchar_t *>::convert(wchar_t * str) {
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CATCH_CONFIG_CPP17_BYTE)
|
||||
#include <cstddef>
|
||||
std::string StringMaker<std::byte>::convert(std::byte value) {
|
||||
return ::Catch::Detail::stringify(std::to_integer<unsigned long long>(value));
|
||||
}
|
||||
#endif // defined(CATCH_CONFIG_CPP17_BYTE)
|
||||
|
||||
std::string StringMaker<int>::convert(int value) {
|
||||
return ::Catch::Detail::stringify(static_cast<long long>(value));
|
||||
|
@@ -20,9 +20,7 @@
|
||||
#include <catch2/internal/catch_void_type.hpp>
|
||||
#include <catch2/interfaces/catch_interfaces_enum_values_registry.hpp>
|
||||
|
||||
#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
|
||||
#include <string_view>
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
@@ -48,14 +46,14 @@ namespace Catch {
|
||||
return n;
|
||||
}
|
||||
|
||||
constexpr StringRef unprintableString = "{?}"_sr;
|
||||
constexpr std::string_view unprintableString = "{?}";
|
||||
|
||||
//! Encases `string in quotes, and optionally escapes invisibles
|
||||
std::string convertIntoString( StringRef string, bool escapeInvisibles );
|
||||
std::string convertIntoString( std::string_view string, bool escapeInvisibles );
|
||||
|
||||
//! Encases `string` in quotes, and escapes invisibles if user requested
|
||||
//! it via CLI
|
||||
std::string convertIntoString( StringRef string );
|
||||
std::string convertIntoString( std::string_view string );
|
||||
|
||||
std::string rawMemoryToString( const void *object, std::size_t size );
|
||||
|
||||
@@ -64,31 +62,27 @@ namespace Catch {
|
||||
return rawMemoryToString( &object, sizeof(object) );
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
class IsStreamInsertable {
|
||||
template<typename Stream, typename U>
|
||||
static auto test(int)
|
||||
-> decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type());
|
||||
template<typename T,typename = void>
|
||||
static constexpr bool IsStreamInsertable_v = false;
|
||||
|
||||
template<typename, typename>
|
||||
static auto test(...)->std::false_type;
|
||||
|
||||
public:
|
||||
static const bool value = decltype(test<std::ostream, const T&>(0))::value;
|
||||
};
|
||||
template <typename T>
|
||||
static constexpr bool IsStreamInsertable_v<
|
||||
T,
|
||||
decltype( void( std::declval<std::ostream&>() << std::declval<T>() ) )> =
|
||||
true;
|
||||
|
||||
template<typename E>
|
||||
std::string convertUnknownEnumToString( E e );
|
||||
|
||||
template<typename T>
|
||||
std::enable_if_t<
|
||||
!std::is_enum<T>::value && !std::is_base_of<std::exception, T>::value,
|
||||
!std::is_enum_v<T> && !std::is_base_of_v<std::exception, T>,
|
||||
std::string> convertUnstreamable( T const& ) {
|
||||
return std::string(Detail::unprintableString);
|
||||
}
|
||||
template<typename T>
|
||||
std::enable_if_t<
|
||||
!std::is_enum<T>::value && std::is_base_of<std::exception, T>::value,
|
||||
!std::is_enum_v<T> && std::is_base_of_v<std::exception, T>,
|
||||
std::string> convertUnstreamable(T const& ex) {
|
||||
return ex.what();
|
||||
}
|
||||
@@ -96,7 +90,7 @@ namespace Catch {
|
||||
|
||||
template<typename T>
|
||||
std::enable_if_t<
|
||||
std::is_enum<T>::value,
|
||||
std::is_enum_v<T>,
|
||||
std::string> convertUnstreamable( T const& value ) {
|
||||
return convertUnknownEnumToString( value );
|
||||
}
|
||||
@@ -120,7 +114,7 @@ namespace Catch {
|
||||
struct StringMaker {
|
||||
template <typename Fake = T>
|
||||
static
|
||||
std::enable_if_t<::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>
|
||||
std::enable_if_t<::Catch::Detail::IsStreamInsertable_v<Fake>, std::string>
|
||||
convert(const Fake& value) {
|
||||
ReusableStringStream rss;
|
||||
// NB: call using the function-like syntax to avoid ambiguity with
|
||||
@@ -131,7 +125,7 @@ namespace Catch {
|
||||
|
||||
template <typename Fake = T>
|
||||
static
|
||||
std::enable_if_t<!::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>
|
||||
std::enable_if_t<!::Catch::Detail::IsStreamInsertable_v<Fake>, std::string>
|
||||
convert( const Fake& value ) {
|
||||
#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER)
|
||||
return Detail::convertUnstreamable(value);
|
||||
@@ -143,11 +137,17 @@ namespace Catch {
|
||||
|
||||
namespace Detail {
|
||||
|
||||
std::string makeExceptionHappenedString();
|
||||
|
||||
// This function dispatches all stringification requests inside of Catch.
|
||||
// Should be preferably called fully qualified, like ::Catch::Detail::stringify
|
||||
template <typename T>
|
||||
std::string stringify(const T& e) {
|
||||
return ::Catch::StringMaker<std::remove_cv_t<std::remove_reference_t<T>>>::convert(e);
|
||||
std::string stringify( const T& e ) {
|
||||
CATCH_TRY {
|
||||
return ::Catch::StringMaker<
|
||||
std::remove_cv_t<std::remove_reference_t<T>>>::convert( e );
|
||||
}
|
||||
CATCH_CATCH_ALL { return makeExceptionHappenedString(); }
|
||||
}
|
||||
|
||||
template<typename E>
|
||||
@@ -171,12 +171,10 @@ namespace Catch {
|
||||
static std::string convert(const std::string& str);
|
||||
};
|
||||
|
||||
#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
|
||||
template<>
|
||||
struct StringMaker<std::string_view> {
|
||||
static std::string convert(std::string_view str);
|
||||
};
|
||||
#endif
|
||||
|
||||
template<>
|
||||
struct StringMaker<char const *> {
|
||||
@@ -193,12 +191,10 @@ namespace Catch {
|
||||
static std::string convert(const std::wstring& wstr);
|
||||
};
|
||||
|
||||
# ifdef CATCH_CONFIG_CPP17_STRING_VIEW
|
||||
template<>
|
||||
struct StringMaker<std::wstring_view> {
|
||||
static std::string convert(std::wstring_view str);
|
||||
};
|
||||
# endif
|
||||
|
||||
template<>
|
||||
struct StringMaker<wchar_t const *> {
|
||||
@@ -214,7 +210,7 @@ namespace Catch {
|
||||
struct StringMaker<char[SZ]> {
|
||||
static std::string convert(char const* str) {
|
||||
return Detail::convertIntoString(
|
||||
StringRef( str, Detail::catch_strnlen( str, SZ ) ) );
|
||||
std::string_view( str, Detail::catch_strnlen( str, SZ ) ) );
|
||||
}
|
||||
};
|
||||
template<size_t SZ>
|
||||
@@ -222,7 +218,7 @@ namespace Catch {
|
||||
static std::string convert(signed char const* str) {
|
||||
auto reinterpreted = reinterpret_cast<char const*>(str);
|
||||
return Detail::convertIntoString(
|
||||
StringRef(reinterpreted, Detail::catch_strnlen(reinterpreted, SZ)));
|
||||
std::string_view(reinterpreted, Detail::catch_strnlen(reinterpreted, SZ)));
|
||||
}
|
||||
};
|
||||
template<size_t SZ>
|
||||
@@ -230,16 +226,14 @@ namespace Catch {
|
||||
static std::string convert(unsigned char const* str) {
|
||||
auto reinterpreted = reinterpret_cast<char const*>(str);
|
||||
return Detail::convertIntoString(
|
||||
StringRef(reinterpreted, Detail::catch_strnlen(reinterpreted, SZ)));
|
||||
std::string_view(reinterpreted, Detail::catch_strnlen(reinterpreted, SZ)));
|
||||
}
|
||||
};
|
||||
|
||||
#if defined(CATCH_CONFIG_CPP17_BYTE)
|
||||
template<>
|
||||
struct StringMaker<std::byte> {
|
||||
static std::string convert(std::byte value);
|
||||
};
|
||||
#endif // defined(CATCH_CONFIG_CPP17_BYTE)
|
||||
template<>
|
||||
struct StringMaker<int> {
|
||||
static std::string convert(int value);
|
||||
@@ -385,7 +379,7 @@ namespace Catch {
|
||||
}
|
||||
#endif // CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER
|
||||
|
||||
#if defined(CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_OPTIONAL)
|
||||
#if defined(CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER)
|
||||
#include <optional>
|
||||
namespace Catch {
|
||||
template<typename T>
|
||||
@@ -415,7 +409,7 @@ namespace Catch {
|
||||
template<
|
||||
typename Tuple,
|
||||
std::size_t N = 0,
|
||||
bool = (N < std::tuple_size<Tuple>::value)
|
||||
bool = (N < std::tuple_size_v<Tuple>)
|
||||
>
|
||||
struct TupleElementPrinter {
|
||||
static void print(const Tuple& tuple, std::ostream& os) {
|
||||
@@ -449,7 +443,7 @@ namespace Catch {
|
||||
}
|
||||
#endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER
|
||||
|
||||
#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT)
|
||||
#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER)
|
||||
#include <variant>
|
||||
namespace Catch {
|
||||
template<>
|
||||
@@ -523,7 +517,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
template<typename R>
|
||||
struct StringMaker<R, std::enable_if_t<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>> {
|
||||
struct StringMaker<R, std::enable_if_t<is_range<R>::value && !::Catch::Detail::IsStreamInsertable_v<R>>> {
|
||||
static std::string convert( R const& range ) {
|
||||
return rangeToString( range );
|
||||
}
|
||||
@@ -630,17 +624,19 @@ struct ratio_string<std::milli> {
|
||||
template<typename Duration>
|
||||
struct StringMaker<std::chrono::time_point<std::chrono::system_clock, Duration>> {
|
||||
static std::string convert(std::chrono::time_point<std::chrono::system_clock, Duration> const& time_point) {
|
||||
auto converted = std::chrono::system_clock::to_time_t(time_point);
|
||||
const auto systemish = std::chrono::time_point_cast<
|
||||
std::chrono::system_clock::duration>( time_point );
|
||||
const auto as_time_t = std::chrono::system_clock::to_time_t( systemish );
|
||||
|
||||
#ifdef _MSC_VER
|
||||
std::tm timeInfo = {};
|
||||
const auto err = gmtime_s(&timeInfo, &converted);
|
||||
const auto err = gmtime_s( &timeInfo, &as_time_t );
|
||||
if ( err ) {
|
||||
return "gmtime from provided timepoint has failed. This "
|
||||
"happens e.g. with pre-1970 dates using Microsoft libc";
|
||||
}
|
||||
#else
|
||||
std::tm* timeInfo = std::gmtime(&converted);
|
||||
std::tm* timeInfo = std::gmtime( &as_time_t );
|
||||
#endif
|
||||
|
||||
auto const timeStampSize = sizeof("2017-01-16T17:06:45Z");
|
||||
|
@@ -65,7 +65,7 @@ namespace Catch {
|
||||
static std::string translatorName( signature ); \
|
||||
CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
|
||||
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
||||
namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \
|
||||
namespace{ const Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \
|
||||
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
|
||||
static std::string translatorName( signature )
|
||||
|
||||
|
@@ -60,56 +60,6 @@
|
||||
|
||||
|
||||
|
||||
#cmakedefine CATCH_CONFIG_CPP17_BYTE
|
||||
#cmakedefine CATCH_CONFIG_NO_CPP17_BYTE
|
||||
|
||||
#if defined( CATCH_CONFIG_CPP17_BYTE ) && \
|
||||
defined( CATCH_CONFIG_NO_CPP17_BYTE )
|
||||
# error Cannot force CPP17_BYTE to both ON and OFF
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#cmakedefine CATCH_CONFIG_CPP17_OPTIONAL
|
||||
#cmakedefine CATCH_CONFIG_NO_CPP17_OPTIONAL
|
||||
|
||||
#if defined( CATCH_CONFIG_CPP17_OPTIONAL ) && \
|
||||
defined( CATCH_CONFIG_NO_CPP17_OPTIONAL )
|
||||
# error Cannot force CPP17_OPTIONAL to both ON and OFF
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#cmakedefine CATCH_CONFIG_CPP17_STRING_VIEW
|
||||
#cmakedefine CATCH_CONFIG_NO_CPP17_STRING_VIEW
|
||||
|
||||
#if defined( CATCH_CONFIG_CPP17_STRING_VIEW ) && \
|
||||
defined( CATCH_CONFIG_NO_CPP17_STRING_VIEW )
|
||||
# error Cannot force CPP17_STRING_VIEW to both ON and OFF
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#cmakedefine CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
|
||||
#cmakedefine CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS
|
||||
|
||||
#if defined( CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS ) && \
|
||||
defined( CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS )
|
||||
# error Cannot force CPP17_UNCAUGHT_EXCEPTIONS to both ON and OFF
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#cmakedefine CATCH_CONFIG_CPP17_VARIANT
|
||||
#cmakedefine CATCH_CONFIG_NO_CPP17_VARIANT
|
||||
|
||||
#if defined( CATCH_CONFIG_CPP17_VARIANT ) && \
|
||||
defined( CATCH_CONFIG_NO_CPP17_VARIANT )
|
||||
# error Cannot force CPP17_VARIANT to both ON and OFF
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#cmakedefine CATCH_CONFIG_GLOBAL_NEXTAFTER
|
||||
#cmakedefine CATCH_CONFIG_NO_GLOBAL_NEXTAFTER
|
||||
|
||||
@@ -187,6 +137,24 @@
|
||||
#endif
|
||||
|
||||
|
||||
#cmakedefine CATCH_CONFIG_DEPRECATION_ANNOTATIONS
|
||||
#cmakedefine CATCH_CONFIG_NO_DEPRECATION_ANNOTATIONS
|
||||
|
||||
#if defined( CATCH_CONFIG_DEPRECATION_ANNOTATIONS ) && \
|
||||
defined( CATCH_CONFIG_NO_DEPRECATION_ANNOTATIONS )
|
||||
# error Cannot force DEPRECATION_ANNOTATIONS to both ON and OFF
|
||||
#endif
|
||||
|
||||
|
||||
#cmakedefine CATCH_CONFIG_EXPERIMENTAL_THREAD_SAFE_ASSERTIONS
|
||||
#cmakedefine CATCH_CONFIG_NO_EXPERIMENTAL_THREAD_SAFE_ASSERTIONS
|
||||
|
||||
#if defined( CATCH_CONFIG_EXPERIMENTAL_THREAD_SAFE_ASSERTIONS ) && \
|
||||
defined( CATCH_CONFIG_NO_EXPERIMENTAL_THREAD_SAFE_ASSERTIONS )
|
||||
# error Cannot force EXPERIMENTAL_THREAD_SAFE_ASSERTIONS to both ON and OFF
|
||||
#endif
|
||||
|
||||
|
||||
// ------
|
||||
// Simple toggle defines
|
||||
// their value is never used and they cannot be overridden
|
||||
|
@@ -36,7 +36,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
Version const& libraryVersion() {
|
||||
static Version version( 3, 8, 1, "", 0 );
|
||||
static Version version( 3, 10, 0, "", 0 );
|
||||
return version;
|
||||
}
|
||||
|
||||
|
@@ -9,7 +9,7 @@
|
||||
#define CATCH_VERSION_MACROS_HPP_INCLUDED
|
||||
|
||||
#define CATCH_VERSION_MAJOR 3
|
||||
#define CATCH_VERSION_MINOR 8
|
||||
#define CATCH_VERSION_PATCH 1
|
||||
#define CATCH_VERSION_MINOR 10
|
||||
#define CATCH_VERSION_PATCH 0
|
||||
|
||||
#endif // CATCH_VERSION_MACROS_HPP_INCLUDED
|
||||
|