forked from catchorg/Catch2
Compare commits
60 Commits
v3.7.0
...
devel-defa
Author | SHA1 | Date | |
---|---|---|---|
|
71a3db4815 | ||
|
dba0b3fa82 | ||
|
1e7b879fae | ||
|
4ff57aba42 | ||
|
dde8220613 | ||
|
cecb02e68f | ||
|
66085dac55 | ||
|
5a6d70eebb | ||
|
10d1a2750c | ||
|
c17d69f813 | ||
|
4c93a595a1 | ||
|
e8f4b60e62 | ||
|
371b11b5a8 | ||
|
8039e3ea1e | ||
|
1d3bfb324d | ||
|
5c97a8583d | ||
|
8cfca70ae8 | ||
|
6aac11e17d | ||
|
ec571515c8 | ||
|
edb6f80867 | ||
|
25b86ef3fd | ||
|
4c8671cfbb | ||
|
5b3b228603 | ||
|
2b60af89e2 | ||
|
f51dc98dfc | ||
|
76f70b1403 | ||
|
914aeecfe2 | ||
|
232e893785 | ||
|
6e9c34aa20 | ||
|
7d7b2f89f2 | ||
|
b0d0aa43e6 | ||
|
a3b67a3abe | ||
|
0321d2fce3 | ||
|
506276c592 | ||
|
f5cee49c71 | ||
|
7bbd4b9075 | ||
|
119a7bbe53 | ||
|
9c5a4cf44e | ||
|
e260288807 | ||
|
7c2e1fb1b2 | ||
|
a6ee7e20cd | ||
|
0b2af56271 | ||
|
69d62abc9a | ||
|
1e0ccb1b21 | ||
|
5ad66ada7b | ||
|
fa43b77429 | ||
|
79f2d66ea3 | ||
|
e200443b84 | ||
|
ce22c0fe8a | ||
|
18df97df00 | ||
|
e97ebe62e7 | ||
|
b2b7cbdc31 | ||
|
412cad546a | ||
|
bd70515c08 | ||
|
7a89b75737 | ||
|
02d3304782 | ||
|
77eca4e819 | ||
|
bc63412e2a | ||
|
fa306fc85e | ||
|
35c3403fbb |
3
.bazelrc
3
.bazelrc
@@ -1,3 +1,6 @@
|
|||||||
|
# Enable Bzlmod for every Bazel command
|
||||||
|
common --enable_bzlmod
|
||||||
|
|
||||||
build --enable_platform_specific_config
|
build --enable_platform_specific_config
|
||||||
|
|
||||||
build:gcc9 --cxxopt=-std=c++2a
|
build:gcc9 --cxxopt=-std=c++2a
|
||||||
|
@@ -34,7 +34,7 @@ Checks: >-
|
|||||||
-modernize-pass-by-value,
|
-modernize-pass-by-value,
|
||||||
|
|
||||||
performance-*,
|
performance-*,
|
||||||
-performance-enum-size,
|
performance-enum-size,
|
||||||
|
|
||||||
portability-*,
|
portability-*,
|
||||||
|
|
||||||
@@ -49,6 +49,7 @@ Checks: >-
|
|||||||
-readability-implicit-bool-conversion,
|
-readability-implicit-bool-conversion,
|
||||||
-readability-isolate-declaration,
|
-readability-isolate-declaration,
|
||||||
-readability-magic-numbers,
|
-readability-magic-numbers,
|
||||||
|
-readability-math-missing-parentheses, #no, 'a + B * C' obeying math rules is not confusing,
|
||||||
-readability-named-parameter,
|
-readability-named-parameter,
|
||||||
-readability-qualified-auto,
|
-readability-qualified-auto,
|
||||||
-readability-redundant-access-specifiers,
|
-readability-redundant-access-specifiers,
|
||||||
|
@@ -1,8 +1,7 @@
|
|||||||
cmake_minimum_required(VERSION 3.15)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
project(PackageTest CXX)
|
project(PackageTest LANGUAGES CXX)
|
||||||
|
|
||||||
find_package(Catch2 CONFIG REQUIRED)
|
find_package(Catch2 CONFIG REQUIRED)
|
||||||
|
|
||||||
add_executable(test_package test_package.cpp)
|
add_executable(test_package test_package.cpp)
|
||||||
target_link_libraries(test_package Catch2::Catch2WithMain)
|
target_link_libraries(test_package Catch2::Catch2WithMain)
|
||||||
target_compile_features(test_package PRIVATE cxx_std_14)
|
|
||||||
|
10
.github/workflows/linux-bazel-builds.yml
vendored
10
.github/workflows/linux-bazel-builds.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Bazel build
|
name: Linux Builds (Bazel)
|
||||||
|
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
@@ -7,18 +7,18 @@ jobs:
|
|||||||
name: Linux Ubuntu 22.04 Bazel build <GCC 11.2.0>
|
name: Linux Ubuntu 22.04 Bazel build <GCC 11.2.0>
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
compilation_mode: [fastbuild, dbg, opt]
|
compilation_mode: [fastbuild, dbg, opt]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Mount bazel cache
|
- name: Mount Bazel cache
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: "/home/runner/.cache/bazel"
|
path: "/home/runner/.cache/bazel"
|
||||||
key: bazel-ubuntu22-gcc11
|
key: bazel-ubuntu22-gcc11
|
||||||
|
|
||||||
- name: Build Catch2
|
- name: Build
|
||||||
run: |
|
run: bazelisk build --compilation_mode=${{matrix.compilation_mode}} //...
|
||||||
bazelisk build --compilation_mode=${{matrix.compilation_mode}} //...
|
|
||||||
|
12
.github/workflows/linux-meson-builds.yml
vendored
12
.github/workflows/linux-meson-builds.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Linux builds (meson)
|
name: Linux Builds (Meson)
|
||||||
|
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
@@ -7,6 +7,7 @@ jobs:
|
|||||||
name: meson ${{matrix.cxx}}, C++${{matrix.std}}, ${{matrix.build_type}}
|
name: meson ${{matrix.cxx}}, C++${{matrix.std}}, ${{matrix.build_type}}
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
cxx:
|
cxx:
|
||||||
- g++-11
|
- g++-11
|
||||||
@@ -25,7 +26,7 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y meson ninja-build ${{matrix.other_pkgs}}
|
sudo apt-get install -y meson ninja-build ${{matrix.other_pkgs}}
|
||||||
|
|
||||||
- name: Configure build
|
- name: Configure
|
||||||
env:
|
env:
|
||||||
CXX: ${{matrix.cxx}}
|
CXX: ${{matrix.cxx}}
|
||||||
CXXFLAGS: -std=c++${{matrix.std}} ${{matrix.cxxflags}}
|
CXXFLAGS: -std=c++${{matrix.std}} ${{matrix.cxxflags}}
|
||||||
@@ -34,11 +35,10 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
meson -Dbuildtype=${{matrix.build_type}} ${{runner.workspace}}/meson-build
|
meson -Dbuildtype=${{matrix.build_type}} ${{runner.workspace}}/meson-build
|
||||||
|
|
||||||
- name: Build tests + lib
|
- name: Build
|
||||||
working-directory: ${{runner.workspace}}/meson-build
|
working-directory: ${{runner.workspace}}/meson-build
|
||||||
run: ninja
|
run: ninja
|
||||||
|
|
||||||
- name: Run tests
|
- name: Test
|
||||||
working-directory: ${{runner.workspace}}/meson-build
|
working-directory: ${{runner.workspace}}/meson-build
|
||||||
run: |
|
run: meson test --verbose
|
||||||
meson test --verbose
|
|
||||||
|
121
.github/workflows/linux-other-builds.yml
vendored
121
.github/workflows/linux-other-builds.yml
vendored
@@ -1,72 +1,73 @@
|
|||||||
# The builds in this file are more complex (e.g. they need custom CMake
|
# The builds in this file are more complex (e.g. they need custom CMake
|
||||||
# configuration) and thus are unsuitable to the simple build matrix
|
# configuration) and thus are unsuitable to the simple build matrix
|
||||||
# approach used in simple-builds
|
# approach used in simple-builds
|
||||||
name: Linux builds (complex)
|
name: Linux Builds (Complex)
|
||||||
|
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: ${{matrix.build_description}}, ${{matrix.cxx}}, C++${{matrix.std}} ${{matrix.build_type}}
|
name: ${{matrix.build_description}}, ${{matrix.cxx}}, C++${{matrix.std}} ${{matrix.build_type}}
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
# We add builds one by one in this case, because there are no
|
# We add builds one by one in this case, because there are no
|
||||||
# dimensions that are shared across the builds
|
# dimensions that are shared across the builds
|
||||||
include:
|
include:
|
||||||
|
|
||||||
# Single surrogate header build
|
# Single surrogate header build
|
||||||
- cxx: clang++-10
|
- cxx: clang++-14
|
||||||
build_description: Surrogates build
|
build_description: Surrogates build
|
||||||
build_type: Debug
|
build_type: Debug
|
||||||
std: 14
|
std: 14
|
||||||
other_pkgs: clang-10
|
other_pkgs: clang-14
|
||||||
cmake_configurations: -DCATCH_BUILD_SURROGATES=ON
|
cmake_configurations: -DCATCH_BUILD_SURROGATES=ON
|
||||||
|
|
||||||
# Extras and examples with gcc-7
|
# Extras and examples with gcc-11
|
||||||
- cxx: g++-7
|
- cxx: g++-11
|
||||||
build_description: Extras + Examples
|
build_description: Extras + Examples
|
||||||
build_type: Debug
|
build_type: Debug
|
||||||
std: 14
|
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
|
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_description: Extras + Examples
|
||||||
build_type: Release
|
build_type: Release
|
||||||
std: 14
|
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
|
cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
|
||||||
|
|
||||||
# Extras and examples with Clang-10
|
# Extras and examples with Clang-14
|
||||||
- cxx: clang++-10
|
- cxx: clang++-14
|
||||||
build_description: Extras + Examples
|
build_description: Extras + Examples
|
||||||
build_type: Debug
|
build_type: Debug
|
||||||
std: 17
|
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
|
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_description: Extras + Examples
|
||||||
build_type: Release
|
build_type: Release
|
||||||
std: 17
|
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
|
cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
|
||||||
|
|
||||||
# Configure tests with Clang-10
|
# Configure tests with Clang-14
|
||||||
- cxx: clang++-10
|
- cxx: clang++-14
|
||||||
build_description: CMake configuration tests
|
build_description: CMake configuration tests
|
||||||
build_type: Debug
|
build_type: Debug
|
||||||
std: 14
|
std: 14
|
||||||
other_pkgs: clang-10
|
other_pkgs: clang-14
|
||||||
cmake_configurations: -DCATCH_ENABLE_CONFIGURE_TESTS=ON
|
cmake_configurations: -DCATCH_ENABLE_CONFIGURE_TESTS=ON
|
||||||
|
|
||||||
# Valgrind test Clang-10
|
# Valgrind test Clang-14
|
||||||
- cxx: clang++-10
|
# - cxx: clang++-14
|
||||||
build_description: Valgrind tests
|
# build_description: Valgrind tests
|
||||||
build_type: Debug
|
# build_type: Debug
|
||||||
std: 14
|
# std: 14
|
||||||
other_pkgs: clang-10 valgrind
|
# 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"
|
# 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
|
# other_ctest_args: -T memcheck -LE uses-python
|
||||||
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -78,77 +79,51 @@ jobs:
|
|||||||
sudo apt-get install -y ninja-build ${{matrix.other_pkgs}}
|
sudo apt-get install -y ninja-build ${{matrix.other_pkgs}}
|
||||||
|
|
||||||
- name: Configure build
|
- name: Configure build
|
||||||
working-directory: ${{runner.workspace}}
|
|
||||||
env:
|
|
||||||
CXX: ${{matrix.cxx}}
|
|
||||||
CXXFLAGS: ${{matrix.cxxflags}}
|
|
||||||
# Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}.
|
# Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}.
|
||||||
# This is important
|
# This is important
|
||||||
run: |
|
run: |
|
||||||
cmake -Bbuild -H$GITHUB_WORKSPACE \
|
cmake --preset basic-tests -GNinja \
|
||||||
-DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
|
-DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
|
||||||
|
-DCMAKE_CXX_COMPILER=${{matrix.cxx}} \
|
||||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
||||||
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
|
${{matrix.cmake_configurations}}
|
||||||
-DCMAKE_CXX_EXTENSIONS=OFF \
|
|
||||||
-DCATCH_DEVELOPMENT_BUILD=ON \
|
|
||||||
${{matrix.cmake_configurations}} \
|
|
||||||
-G Ninja
|
|
||||||
|
|
||||||
- name: Build tests + lib
|
- name: Build
|
||||||
working-directory: ${{runner.workspace}}/build
|
run: cmake --build build
|
||||||
run: ninja
|
|
||||||
|
- 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:
|
clang-tidy:
|
||||||
name: clang-tidy ${{matrix.version}}, ${{matrix.build_description}}, C++${{matrix.std}} ${{matrix.build_type}}
|
name: clang-tidy
|
||||||
runs-on: ubuntu-22.04
|
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:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Prepare environment
|
- name: Prepare environment
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
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
|
- name: Configure
|
||||||
working-directory: ${{runner.workspace}}
|
|
||||||
env:
|
|
||||||
CXX: clang++-${{matrix.version}}
|
|
||||||
CXXFLAGS: ${{matrix.cxxflags}}
|
|
||||||
# Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}.
|
# Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}.
|
||||||
# This is important
|
# This is important
|
||||||
run: |
|
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
|
# Use a dummy compiler/linker/ar/ranlib to effectively disable the
|
||||||
# compilation and only run clang-tidy.
|
# compilation and only run clang-tidy.
|
||||||
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 \
|
|
||||||
-DCMAKE_CXX_CLANG_TIDY="$clangtidy" \
|
|
||||||
-DCMAKE_CXX_COMPILER_LAUNCHER=/usr/bin/true \
|
|
||||||
-DCMAKE_AR=/usr/bin/true \
|
-DCMAKE_AR=/usr/bin/true \
|
||||||
|
-DCMAKE_BUILD_TYPE=Debug \
|
||||||
|
-DCMAKE_CXX_CLANG_TIDY="$clangtidy" \
|
||||||
-DCMAKE_CXX_COMPILER_AR=/usr/bin/true \
|
-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 \
|
-DCMAKE_CXX_LINK_EXECUTABLE=/usr/bin/true \
|
||||||
${{matrix.cmake_configurations}} \
|
-DCMAKE_CXX_STANDARD=17 \
|
||||||
-G Ninja
|
-DCMAKE_RANLIB=/usr/bin/true \
|
||||||
|
-DCATCH_BUILD_EXAMPLES=ON \
|
||||||
|
-DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
|
||||||
|
|
||||||
- name: Run clang-tidy
|
- name: Run clang-tidy
|
||||||
working-directory: ${{runner.workspace}}/build
|
run: cmake --build build
|
||||||
run: ninja
|
|
||||||
|
100
.github/workflows/linux-simple-builds.yml
vendored
100
.github/workflows/linux-simple-builds.yml
vendored
@@ -1,32 +1,33 @@
|
|||||||
name: Linux builds (basic)
|
name: Linux Builds (Basic)
|
||||||
|
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: ${{matrix.cxx}}, C++${{matrix.std}}, ${{matrix.build_type}}
|
name: ${{matrix.cxx}}, C++${{matrix.std}}, ${{matrix.build_type}}
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
cxx:
|
cxx:
|
||||||
- g++-5
|
|
||||||
- g++-6
|
|
||||||
- g++-7
|
- g++-7
|
||||||
- g++-8
|
- g++-8
|
||||||
- g++-9
|
- g++-9
|
||||||
- g++-10
|
- g++-10
|
||||||
|
- g++-11
|
||||||
|
- g++-12
|
||||||
- clang++-6.0
|
- clang++-6.0
|
||||||
- clang++-7
|
- clang++-7
|
||||||
- clang++-8
|
- clang++-8
|
||||||
- clang++-9
|
- clang++-9
|
||||||
- clang++-10
|
- clang++-10
|
||||||
|
- clang++-11
|
||||||
|
- clang++-12
|
||||||
|
- clang++-13
|
||||||
|
- clang++-14
|
||||||
build_type: [Debug, Release]
|
build_type: [Debug, Release]
|
||||||
std: [14]
|
std: [14]
|
||||||
include:
|
include:
|
||||||
- cxx: g++-5
|
|
||||||
other_pkgs: g++-5
|
|
||||||
- cxx: g++-6
|
|
||||||
other_pkgs: g++-6
|
|
||||||
- cxx: g++-7
|
- cxx: g++-7
|
||||||
other_pkgs: g++-7
|
other_pkgs: g++-7
|
||||||
- cxx: g++-8
|
- cxx: g++-8
|
||||||
@@ -35,6 +36,10 @@ jobs:
|
|||||||
other_pkgs: g++-9
|
other_pkgs: g++-9
|
||||||
- cxx: g++-10
|
- cxx: g++-10
|
||||||
other_pkgs: g++-10
|
other_pkgs: g++-10
|
||||||
|
- cxx: g++-11
|
||||||
|
other_pkgs: g++-11
|
||||||
|
- cxx: g++-12
|
||||||
|
other_pkgs: g++-12
|
||||||
- cxx: clang++-6.0
|
- cxx: clang++-6.0
|
||||||
other_pkgs: clang-6.0
|
other_pkgs: clang-6.0
|
||||||
- cxx: clang++-7
|
- cxx: clang++-7
|
||||||
@@ -45,79 +50,64 @@ jobs:
|
|||||||
other_pkgs: clang-9
|
other_pkgs: clang-9
|
||||||
- cxx: clang++-10
|
- cxx: clang++-10
|
||||||
other_pkgs: clang-10
|
other_pkgs: clang-10
|
||||||
# Clang 6 + C++17
|
- cxx: clang++-11
|
||||||
# does not work with the default libstdc++ version thanks
|
other_pkgs: clang-11
|
||||||
# to a disagreement on variant implementation.
|
- cxx: clang++-12
|
||||||
# - cxx: clang++-6.0
|
other_pkgs: clang-12
|
||||||
# build_type: Debug
|
- cxx: clang++-13
|
||||||
# std: 17
|
other_pkgs: clang-13
|
||||||
# other_pkgs: clang-6.0
|
- cxx: clang++-14
|
||||||
# - cxx: clang++-6.0
|
other_pkgs: clang-14
|
||||||
# build_type: Release
|
# Clang 14 + C++17
|
||||||
# std: 17
|
- cxx: clang++-14
|
||||||
# other_pkgs: clang-6.0
|
|
||||||
# Clang 10 + C++17
|
|
||||||
- cxx: clang++-10
|
|
||||||
build_type: Debug
|
build_type: Debug
|
||||||
std: 17
|
std: 17
|
||||||
other_pkgs: clang-10
|
other_pkgs: clang-14
|
||||||
- cxx: clang++-10
|
- cxx: clang++-14
|
||||||
build_type: Release
|
build_type: Release
|
||||||
std: 17
|
std: 17
|
||||||
other_pkgs: clang-10
|
other_pkgs: clang-14
|
||||||
- cxx: clang++-10
|
- cxx: clang++-14
|
||||||
build_type: Debug
|
build_type: Debug
|
||||||
std: 20
|
std: 20
|
||||||
other_pkgs: clang-10
|
other_pkgs: clang-14
|
||||||
- cxx: clang++-10
|
- cxx: clang++-14
|
||||||
build_type: Release
|
build_type: Release
|
||||||
std: 20
|
std: 20
|
||||||
other_pkgs: clang-10
|
other_pkgs: clang-14
|
||||||
- cxx: g++-10
|
- cxx: g++-11
|
||||||
build_type: Debug
|
build_type: Debug
|
||||||
std: 20
|
std: 20
|
||||||
other_pkgs: g++-10
|
other_pkgs: g++-11
|
||||||
- cxx: g++-10
|
- cxx: g++-11
|
||||||
build_type: Release
|
build_type: Release
|
||||||
std: 20
|
std: 20
|
||||||
other_pkgs: g++-10
|
other_pkgs: g++-11
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Add repositories for older GCC
|
- name: Add repositories for older compilers
|
||||||
run: |
|
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/ focal main'
|
||||||
sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ bionic universe'
|
sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ focal universe'
|
||||||
if: ${{ matrix.cxx == 'g++-5' || matrix.cxx == 'g++-6' }}
|
|
||||||
|
|
||||||
- name: Prepare environment
|
- name: Prepare environment
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y ninja-build ${{matrix.other_pkgs}}
|
sudo apt-get install -y ninja-build ${{matrix.other_pkgs}}
|
||||||
|
|
||||||
- name: Configure build
|
- name: Configure
|
||||||
working-directory: ${{runner.workspace}}
|
|
||||||
env:
|
|
||||||
CXX: ${{matrix.cxx}}
|
|
||||||
CXXFLAGS: ${{matrix.cxxflags}}
|
|
||||||
# Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}.
|
# Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}.
|
||||||
# This is important
|
# This is important
|
||||||
run: |
|
run: |
|
||||||
cmake -Bbuild -H$GITHUB_WORKSPACE \
|
cmake --preset basic-tests -GNinja \
|
||||||
-DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
|
-DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
|
||||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
-DCMAKE_CXX_COMPILER=${{matrix.cxx}} \
|
||||||
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
|
-DCMAKE_CXX_STANDARD=${{matrix.std}}
|
||||||
-DCMAKE_CXX_EXTENSIONS=OFF \
|
|
||||||
-DCATCH_DEVELOPMENT_BUILD=ON \
|
|
||||||
-G Ninja
|
|
||||||
|
|
||||||
- name: Build tests + lib
|
- name: Build
|
||||||
working-directory: ${{runner.workspace}}/build
|
run: cmake --build build
|
||||||
run: ninja
|
|
||||||
|
|
||||||
- name: Run tests
|
- name: Test
|
||||||
env:
|
run: ctest --test-dir build -j --output-on-failure
|
||||||
CTEST_OUTPUT_ON_FAILURE: 1
|
|
||||||
working-directory: ${{runner.workspace}}/build
|
|
||||||
run: ctest -C ${{matrix.build_type}} -j `nproc`
|
|
||||||
|
44
.github/workflows/mac-builds-m1.yml
vendored
44
.github/workflows/mac-builds-m1.yml
vendored
@@ -1,44 +0,0 @@
|
|||||||
name: M1 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`
|
|
40
.github/workflows/mac-builds.yml
vendored
40
.github/workflows/mac-builds.yml
vendored
@@ -1,44 +1,32 @@
|
|||||||
name: Mac builds
|
name: Mac Builds
|
||||||
|
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: macos-12
|
# From macos-14 forward, the baseline "macos-X" image is Arm based,
|
||||||
|
# and not Intel based.
|
||||||
|
runs-on: ${{matrix.image}}
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
cxx:
|
image: [macos-13, macos-14, macos-15]
|
||||||
- clang++
|
|
||||||
build_type: [Debug, Release]
|
build_type: [Debug, Release]
|
||||||
std: [14, 17]
|
std: [14, 17]
|
||||||
include:
|
|
||||||
- build_type: Debug
|
|
||||||
examples: ON
|
|
||||||
extra_tests: ON
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Configure build
|
- name: Configure
|
||||||
working-directory: ${{runner.workspace}}
|
|
||||||
env:
|
|
||||||
CXX: ${{matrix.cxx}}
|
|
||||||
CXXFLAGS: ${{matrix.cxxflags}}
|
|
||||||
run: |
|
run: |
|
||||||
cmake -Bbuild -H$GITHUB_WORKSPACE \
|
cmake --preset basic-tests -GNinja \
|
||||||
-DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
|
-DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
|
||||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
||||||
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
|
-DCATCH_BUILD_EXAMPLES=ON \
|
||||||
-DCATCH_DEVELOPMENT_BUILD=ON \
|
-DCATCH_BUILD_EXTRA_TESTS=ON
|
||||||
-DCATCH_BUILD_EXAMPLES=${{matrix.examples}} \
|
|
||||||
-DCATCH_BUILD_EXTRA_TESTS=${{matrix.examples}}
|
|
||||||
|
|
||||||
- name: Build tests + lib
|
- name: Build
|
||||||
working-directory: ${{runner.workspace}}/build
|
run: cmake --build build
|
||||||
run: make -j `sysctl -n hw.ncpu`
|
|
||||||
|
|
||||||
- name: Run tests
|
- name: Test
|
||||||
env:
|
run: ctest --test-dir build -j --output-on-failure
|
||||||
CTEST_OUTPUT_ON_FAILURE: 1
|
|
||||||
working-directory: ${{runner.workspace}}/build
|
|
||||||
run: ctest -C ${{matrix.build_type}} -j `sysctl -n hw.ncpu`
|
|
||||||
|
@@ -5,7 +5,7 @@ on: [push, pull_request]
|
|||||||
jobs:
|
jobs:
|
||||||
conan_builds:
|
conan_builds:
|
||||||
name: Conan ${{matrix.conan_version}}
|
name: Conan ${{matrix.conan_version}}
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
conan_version:
|
conan_version:
|
||||||
|
2
.github/workflows/validate-header-guards.yml
vendored
2
.github/workflows/validate-header-guards.yml
vendored
@@ -5,7 +5,7 @@ on: [push, pull_request]
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
# Set the type of machine to run on
|
# Set the type of machine to run on
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Checkout source code
|
- name: Checkout source code
|
||||||
|
20
.github/workflows/windows-simple-builds.yml
vendored
20
.github/workflows/windows-simple-builds.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Windows builds (basic)
|
name: Windows Builds (Basic)
|
||||||
|
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
@@ -7,8 +7,9 @@ jobs:
|
|||||||
name: ${{matrix.os}}, ${{matrix.std}}, ${{matrix.build_type}}, ${{matrix.platform}}
|
name: ${{matrix.os}}, ${{matrix.std}}, ${{matrix.build_type}}, ${{matrix.platform}}
|
||||||
runs-on: ${{matrix.os}}
|
runs-on: ${{matrix.os}}
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [windows-2019, windows-2022]
|
os: [windows-2019, windows-2022, windows-2025]
|
||||||
platform: [Win32, x64]
|
platform: [Win32, x64]
|
||||||
build_type: [Debug, Release]
|
build_type: [Debug, Release]
|
||||||
std: [14, 17]
|
std: [14, 17]
|
||||||
@@ -16,22 +17,15 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Configure build
|
- name: Configure build
|
||||||
working-directory: ${{runner.workspace}}
|
|
||||||
run: |
|
run: |
|
||||||
cmake -S $Env:GITHUB_WORKSPACE `
|
cmake --preset all-tests `
|
||||||
-B ${{runner.workspace}}/build `
|
-A ${{matrix.platform}} `
|
||||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} `
|
-DCMAKE_CXX_STANDARD=${{matrix.std}} `
|
||||||
-A ${{matrix.platform}} `
|
|
||||||
--preset all-tests
|
|
||||||
|
|
||||||
- name: Build tests
|
- name: Build tests
|
||||||
working-directory: ${{runner.workspace}}
|
|
||||||
run: cmake --build build --config ${{matrix.build_type}} --parallel %NUMBER_OF_PROCESSORS%
|
run: cmake --build build --config ${{matrix.build_type}} --parallel %NUMBER_OF_PROCESSORS%
|
||||||
shell: cmd
|
shell: cmd
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
working-directory: ${{runner.workspace}}/build
|
run: ctest --test-dir build -C ${{matrix.build_type}} -j %NUMBER_OF_PROCESSORS% --output-on-failure
|
||||||
env:
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: 1
|
|
||||||
run: ctest -C ${{matrix.build_type}} -j %NUMBER_OF_PROCESSORS%
|
|
||||||
shell: cmd
|
shell: cmd
|
||||||
|
@@ -56,6 +56,8 @@ expand_template(
|
|||||||
"#cmakedefine CATCH_CONFIG_WCHAR": "",
|
"#cmakedefine CATCH_CONFIG_WCHAR": "",
|
||||||
"#cmakedefine CATCH_CONFIG_WINDOWS_CRTDBG": "",
|
"#cmakedefine CATCH_CONFIG_WINDOWS_CRTDBG": "",
|
||||||
"#cmakedefine CATCH_CONFIG_WINDOWS_SEH": "",
|
"#cmakedefine CATCH_CONFIG_WINDOWS_SEH": "",
|
||||||
|
"#cmakedefine CATCH_CONFIG_USE_BUILTIN_CONSTANT_P": "",
|
||||||
|
"#cmakedefine CATCH_CONFIG_NO_USE_BUILTIN_CONSTANT_P": "",
|
||||||
},
|
},
|
||||||
template = "src/catch2/catch_user_config.hpp.in",
|
template = "src/catch2/catch_user_config.hpp.in",
|
||||||
)
|
)
|
||||||
@@ -66,7 +68,7 @@ expand_template(
|
|||||||
cc_library(
|
cc_library(
|
||||||
name = "catch2_generated",
|
name = "catch2_generated",
|
||||||
hdrs = ["catch2/catch_user_config.hpp"],
|
hdrs = ["catch2/catch_user_config.hpp"],
|
||||||
include_prefix = ".", # to manipulate -I of dependenices
|
include_prefix = ".", # to manipulate -I of dependencies
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -1,10 +1,9 @@
|
|||||||
@PACKAGE_INIT@
|
@PACKAGE_INIT@
|
||||||
|
|
||||||
|
|
||||||
# Avoid repeatedly including the targets
|
# Avoid repeatedly including the targets
|
||||||
if(NOT TARGET Catch2::Catch2)
|
if(NOT TARGET Catch2::Catch2)
|
||||||
# Provide path for scripts
|
# Provide path for scripts
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
|
||||||
|
|
||||||
include(${CMAKE_CURRENT_LIST_DIR}/Catch2Targets.cmake)
|
include(${CMAKE_CURRENT_LIST_DIR}/Catch2Targets.cmake)
|
||||||
endif()
|
endif()
|
||||||
|
@@ -14,7 +14,6 @@
|
|||||||
#
|
#
|
||||||
# For detailed docs look into docs/configuration.md
|
# For detailed docs look into docs/configuration.md
|
||||||
|
|
||||||
|
|
||||||
macro(AddOverridableConfigOption OptionBaseName)
|
macro(AddOverridableConfigOption OptionBaseName)
|
||||||
option(CATCH_CONFIG_${OptionBaseName} "Read docs/configuration.md for details" OFF)
|
option(CATCH_CONFIG_${OptionBaseName} "Read docs/configuration.md for details" OFF)
|
||||||
option(CATCH_CONFIG_NO_${OptionBaseName} "Read docs/configuration.md for details" OFF)
|
option(CATCH_CONFIG_NO_${OptionBaseName} "Read docs/configuration.md for details" OFF)
|
||||||
@@ -44,6 +43,7 @@ set(_OverridableOptions
|
|||||||
"WINDOWS_SEH"
|
"WINDOWS_SEH"
|
||||||
"GETENV"
|
"GETENV"
|
||||||
"EXPERIMENTAL_STATIC_ANALYSIS_SUPPORT"
|
"EXPERIMENTAL_STATIC_ANALYSIS_SUPPORT"
|
||||||
|
"USE_BUILTIN_CONSTANT_P"
|
||||||
)
|
)
|
||||||
|
|
||||||
foreach(OptionName ${_OverridableOptions})
|
foreach(OptionName ${_OverridableOptions})
|
||||||
@@ -73,9 +73,9 @@ foreach(OptionName ${_OtherConfigOptions})
|
|||||||
AddConfigOption(${OptionName})
|
AddConfigOption(${OptionName})
|
||||||
endforeach()
|
endforeach()
|
||||||
if(DEFINED BUILD_SHARED_LIBS)
|
if(DEFINED BUILD_SHARED_LIBS)
|
||||||
set(CATCH_CONFIG_SHARED_LIBRARY ${BUILD_SHARED_LIBS})
|
set(CATCH_CONFIG_SHARED_LIBRARY ${BUILD_SHARED_LIBS})
|
||||||
else()
|
else()
|
||||||
set(CATCH_CONFIG_SHARED_LIBRARY "")
|
set(CATCH_CONFIG_SHARED_LIBRARY "")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CATCH_CONFIG_DEFAULT_REPORTER "console" CACHE STRING "Read docs/configuration.md for details. The name of the reporter should be without quotes.")
|
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)
|
include(CheckCXXCompilerFlag)
|
||||||
function(add_cxx_flag_if_supported_to_targets flagname targets)
|
function(add_cxx_flag_if_supported_to_targets flagname targets)
|
||||||
string(MAKE_C_IDENTIFIER ${flagname} flag_identifier )
|
string(MAKE_C_IDENTIFIER ${flagname} flag_identifier)
|
||||||
check_cxx_compiler_flag("${flagname}" HAVE_FLAG_${flag_identifier})
|
check_cxx_compiler_flag("${flagname}" HAVE_FLAG_${flag_identifier})
|
||||||
|
|
||||||
if (HAVE_FLAG_${flag_identifier})
|
if(HAVE_FLAG_${flag_identifier})
|
||||||
foreach(target ${targets})
|
foreach(target ${targets})
|
||||||
target_compile_options(${target} PRIVATE ${flagname})
|
target_compile_options(${target} PRIVATE ${flagname})
|
||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Assumes that it is only called for development builds, where warnings
|
# Assumes that it is only called for development builds, where warnings
|
||||||
# and Werror is desired, so it also enables Werror.
|
# and Werror is desired, so it also enables Werror.
|
||||||
function(add_warnings_to_targets targets)
|
function(add_warnings_to_targets targets)
|
||||||
LIST(LENGTH targets TARGETS_LEN)
|
LIST(LENGTH targets TARGETS_LEN)
|
||||||
# For now we just assume 2 possibilities: msvc and msvc-like compilers,
|
# For now we just assume 2 possibilities: msvc and msvc-like compilers,
|
||||||
# and other.
|
# and other.
|
||||||
if (MSVC)
|
if(MSVC)
|
||||||
foreach(target ${targets})
|
foreach(target ${targets})
|
||||||
# Force MSVC to consider everything as encoded in utf-8
|
# Force MSVC to consider everything as encoded in utf-8
|
||||||
target_compile_options( ${target} PRIVATE /utf-8 )
|
target_compile_options(${target} PRIVATE /utf-8)
|
||||||
# Enable Werror equivalent
|
# Enable Werror equivalent
|
||||||
if (CATCH_ENABLE_WERROR)
|
if(CATCH_ENABLE_WERROR)
|
||||||
target_compile_options( ${target} PRIVATE /WX )
|
target_compile_options(${target} PRIVATE /WX)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# MSVC is currently handled specially
|
# MSVC is currently handled specially
|
||||||
if ( CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
|
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||||
STRING(REGEX REPLACE "/W[0-9]" "/W4" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # override default warning level
|
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 )
|
target_compile_options(${target} PRIVATE /w44265 /w44061 /w44062 /w45038)
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
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()
|
||||||
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()
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Adds flags required for reproducible build to the target
|
# Adds flags required for reproducible build to the target
|
||||||
|
187
CMakeLists.txt
187
CMakeLists.txt
@@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
# detect if Catch is being bundled,
|
# detect if Catch is being bundled,
|
||||||
# disable testsuite in that case
|
# disable testsuite in that case
|
||||||
@@ -8,6 +8,8 @@ else()
|
|||||||
set(NOT_SUBPROJECT OFF)
|
set(NOT_SUBPROJECT OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
|
||||||
option(CATCH_INSTALL_DOCS "Install documentation alongside library" ON)
|
option(CATCH_INSTALL_DOCS "Install documentation alongside library" ON)
|
||||||
option(CATCH_INSTALL_EXTRAS "Install extras (CMake scripts, debugger helpers) alongside library" ON)
|
option(CATCH_INSTALL_EXTRAS "Install extras (CMake scripts, debugger helpers) alongside library" ON)
|
||||||
option(CATCH_DEVELOPMENT_BUILD "Build tests, enable warnings, enable Werror, etc" OFF)
|
option(CATCH_DEVELOPMENT_BUILD "Build tests, enable warnings, enable Werror, etc" OFF)
|
||||||
@@ -24,30 +26,26 @@ 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_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)
|
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
|
# 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
|
# 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.
|
# 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)
|
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")
|
message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(Catch2
|
project(Catch2
|
||||||
VERSION 3.7.0 # CML version placeholder, don't delete
|
VERSION 3.8.1 # CML version placeholder, don't delete
|
||||||
LANGUAGES CXX
|
LANGUAGES CXX
|
||||||
# HOMEPAGE_URL is not supported until CMake version 3.12, which
|
HOMEPAGE_URL "https://github.com/catchorg/Catch2"
|
||||||
# we do not target yet.
|
|
||||||
# HOMEPAGE_URL "https://github.com/catchorg/Catch2"
|
|
||||||
DESCRIPTION "A modern, C++-native, unit test framework."
|
DESCRIPTION "A modern, C++-native, unit test framework."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# Provide path for scripts. We first add path to the scripts we don't use,
|
# Provide path for scripts. We first add path to the scripts we don't use,
|
||||||
# but projects including us might, and set the path up to parent scope.
|
# but projects including us might, and set the path up to parent scope.
|
||||||
# Then we also add path that we use to configure the project, but is of
|
# Then we also add path that we use to configure the project, but is of
|
||||||
# no use to top level projects.
|
# no use to top level projects.
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/extras")
|
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)
|
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE)
|
||||||
endif()
|
endif()
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake")
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake")
|
||||||
@@ -68,10 +66,9 @@ set(CATCH_CMAKE_CONFIG_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Catch2")
|
|||||||
# are built during these tests, so this is required here, before
|
# are built during these tests, so this is required here, before
|
||||||
# the subdirectories are added.
|
# the subdirectories are added.
|
||||||
if(CATCH_TEST_USE_WMAIN)
|
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()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
# Basic paths
|
# Basic paths
|
||||||
set(CATCH_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
set(CATCH_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
set(SOURCES_DIR ${CATCH_DIR}/src/catch2)
|
set(SOURCES_DIR ${CATCH_DIR}/src/catch2)
|
||||||
@@ -81,121 +78,117 @@ set(SELF_TEST_DIR ${CATCH_DIR}/tests/SelfTest)
|
|||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
# Build tests only if requested
|
# Build tests only if requested
|
||||||
if (BUILD_TESTING AND CATCH_BUILD_TESTING AND NOT_SUBPROJECT)
|
if(BUILD_TESTING AND CATCH_BUILD_TESTING AND NOT_SUBPROJECT)
|
||||||
find_package(PythonInterp 3 REQUIRED)
|
find_package(PythonInterp 3 REQUIRED)
|
||||||
if (NOT PYTHONINTERP_FOUND)
|
if(NOT PYTHONINTERP_FOUND)
|
||||||
message(FATAL_ERROR "Python not found, but required for tests")
|
message(FATAL_ERROR "Python not found, but required for tests")
|
||||||
endif()
|
endif()
|
||||||
add_subdirectory(tests)
|
set(CMAKE_FOLDER "tests")
|
||||||
|
add_subdirectory(tests)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CATCH_BUILD_EXAMPLES)
|
if(CATCH_BUILD_EXAMPLES)
|
||||||
add_subdirectory(examples)
|
set(CMAKE_FOLDER "Examples")
|
||||||
|
add_subdirectory(examples)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CATCH_BUILD_EXTRA_TESTS)
|
if(CATCH_BUILD_EXTRA_TESTS)
|
||||||
add_subdirectory(tests/ExtraTests)
|
set(CMAKE_FOLDER "tests/ExtraTests")
|
||||||
|
add_subdirectory(tests/ExtraTests)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CATCH_BUILD_FUZZERS)
|
if(CATCH_BUILD_FUZZERS)
|
||||||
add_subdirectory(fuzzing)
|
set(CMAKE_FOLDER "fuzzing")
|
||||||
|
add_subdirectory(fuzzing)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (CATCH_DEVELOPMENT_BUILD)
|
if(CATCH_DEVELOPMENT_BUILD)
|
||||||
add_warnings_to_targets("${CATCH_WARNING_TARGETS}")
|
add_warnings_to_targets("${CATCH_WARNING_TARGETS}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Only perform the installation steps when Catch is not being used as
|
# Only perform the installation steps when Catch is not being used as
|
||||||
# a subproject via `add_subdirectory`, or the destinations will break,
|
# a subproject via `add_subdirectory`, or the destinations will break,
|
||||||
# see https://github.com/catchorg/Catch2/issues/1373
|
# see https://github.com/catchorg/Catch2/issues/1373
|
||||||
if (NOT_SUBPROJECT)
|
if(NOT_SUBPROJECT)
|
||||||
configure_package_config_file(
|
configure_package_config_file(
|
||||||
${CMAKE_CURRENT_LIST_DIR}/CMake/Catch2Config.cmake.in
|
${CMAKE_CURRENT_LIST_DIR}/CMake/Catch2Config.cmake.in
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake
|
${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake
|
||||||
INSTALL_DESTINATION
|
INSTALL_DESTINATION
|
||||||
${CATCH_CMAKE_CONFIG_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"
|
"${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake"
|
||||||
COMPATIBILITY
|
DESTINATION
|
||||||
SameMajorVersion
|
${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(
|
install(
|
||||||
FILES
|
FILES
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake"
|
"extras/ParseAndAddCatchTests.cmake"
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake"
|
"extras/Catch.cmake"
|
||||||
|
"extras/CatchAddTests.cmake"
|
||||||
|
"extras/CatchShardTests.cmake"
|
||||||
|
"extras/CatchShardTestsImpl.cmake"
|
||||||
DESTINATION
|
DESTINATION
|
||||||
${CATCH_CMAKE_CONFIG_DESTINATION}
|
${CATCH_CMAKE_CONFIG_DESTINATION}
|
||||||
)
|
)
|
||||||
|
|
||||||
# Install documentation
|
# Install debugger helpers
|
||||||
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(
|
install(
|
||||||
FILES
|
FILES
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/catch2.pc"
|
"extras/gdbinit"
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc"
|
"extras/lldbinit"
|
||||||
DESTINATION
|
DESTINATION
|
||||||
${PKGCONFIG_INSTALL_DIR}
|
${CMAKE_INSTALL_DATAROOTDIR}/Catch2
|
||||||
)
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
# CPack/CMake started taking the package version from project version 3.12
|
## Provide some pkg-config integration
|
||||||
# So we need to set the version manually for older CMake versions
|
set(PKGCONFIG_INSTALL_DIR
|
||||||
if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
|
"${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig"
|
||||||
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
|
CACHE PATH "Path where catch2.pc is installed"
|
||||||
endif()
|
)
|
||||||
|
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(
|
||||||
|
FILES
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/catch2.pc"
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc"
|
||||||
|
DESTINATION
|
||||||
|
${PKGCONFIG_INSTALL_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
set(CPACK_PACKAGE_CONTACT "https://github.com/catchorg/Catch2/")
|
set(CPACK_PACKAGE_CONTACT "https://github.com/catchorg/Catch2/")
|
||||||
|
|
||||||
|
|
||||||
include( CPack )
|
|
||||||
|
|
||||||
|
include(CPack)
|
||||||
endif()
|
endif()
|
||||||
|
@@ -3,9 +3,14 @@
|
|||||||
"configurePresets": [
|
"configurePresets": [
|
||||||
{
|
{
|
||||||
"name": "basic-tests",
|
"name": "basic-tests",
|
||||||
|
"binaryDir": "build",
|
||||||
|
"installDir": "build/install",
|
||||||
"displayName": "Basic development build",
|
"displayName": "Basic development build",
|
||||||
"description": "Enables development build with basic tests that are cheap to build and run",
|
"description": "Enables development build with basic tests that are cheap to build and run",
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
|
"CMAKE_CXX_EXTENSIONS": "OFF",
|
||||||
|
"CMAKE_CXX_STANDARD_REQUIRED": "ON",
|
||||||
|
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
|
||||||
"CATCH_DEVELOPMENT_BUILD": "ON"
|
"CATCH_DEVELOPMENT_BUILD": "ON"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
11
MAINTAINERS.md
Normal file
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,3 +1,4 @@
|
|||||||
module(name = "catch2")
|
module(name = "catch2")
|
||||||
|
|
||||||
bazel_dep(name = "bazel_skylib", version = "1.7.1")
|
bazel_dep(name = "bazel_skylib", version = "1.7.1")
|
||||||
|
bazel_dep(name = "rules_cc", version = "0.0.17")
|
||||||
|
@@ -1,16 +0,0 @@
|
|||||||
workspace(name = "catch2")
|
|
||||||
|
|
||||||
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
|
||||||
|
|
||||||
http_archive(
|
|
||||||
name = "bazel_skylib",
|
|
||||||
sha256 = "bc283cdfcd526a52c3201279cda4bc298652efa898b10b4db0837dc51652756f",
|
|
||||||
urls = [
|
|
||||||
"https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz",
|
|
||||||
"https://github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
|
|
||||||
|
|
||||||
bazel_skylib_workspace()
|
|
@@ -81,12 +81,11 @@ to your CMake module path.
|
|||||||
|
|
||||||
`Catch.cmake` provides function `catch_discover_tests` to get tests from
|
`Catch.cmake` provides function `catch_discover_tests` to get tests from
|
||||||
a target. This function works by running the resulting executable with
|
a target. This function works by running the resulting executable with
|
||||||
`--list-test-names-only` flag, and then parsing the output to find all
|
`--list-test` flag, and then parsing the output to find all existing tests.
|
||||||
existing tests.
|
|
||||||
|
|
||||||
#### Usage
|
#### Usage
|
||||||
```cmake
|
```cmake
|
||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
project(baz LANGUAGES CXX VERSION 0.0.1)
|
project(baz LANGUAGES CXX VERSION 0.0.1)
|
||||||
|
|
||||||
@@ -128,6 +127,8 @@ catch_discover_tests(target
|
|||||||
[OUTPUT_PREFIX prefix]
|
[OUTPUT_PREFIX prefix]
|
||||||
[OUTPUT_SUFFIX suffix]
|
[OUTPUT_SUFFIX suffix]
|
||||||
[DISCOVERY_MODE <POST_BUILD|PRE_TEST>]
|
[DISCOVERY_MODE <POST_BUILD|PRE_TEST>]
|
||||||
|
[SKIP_IS_FAILURE]
|
||||||
|
[ADD_TAGS_AS_LABELS]
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -211,6 +212,15 @@ execution (useful e.g. in cross-compilation environments).
|
|||||||
calling ``catch_discover_tests``. This provides a mechanism for globally
|
calling ``catch_discover_tests``. This provides a mechanism for globally
|
||||||
selecting a preferred test discovery behavior.
|
selecting a preferred test discovery behavior.
|
||||||
|
|
||||||
|
* `SKIP_IS_FAILURE`
|
||||||
|
|
||||||
|
Skipped tests will be marked as failed instead.
|
||||||
|
|
||||||
|
* `ADD_TAGS_AS_LABELS`
|
||||||
|
|
||||||
|
Add the tags from tests as labels to CTest.
|
||||||
|
|
||||||
|
|
||||||
### `ParseAndAddCatchTests.cmake`
|
### `ParseAndAddCatchTests.cmake`
|
||||||
|
|
||||||
⚠ This script is [deprecated](https://github.com/catchorg/Catch2/pull/2120)
|
⚠ This script is [deprecated](https://github.com/catchorg/Catch2/pull/2120)
|
||||||
@@ -229,7 +239,7 @@ parsed are *silently ignored*.
|
|||||||
#### Usage
|
#### Usage
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
project(baz LANGUAGES CXX VERSION 0.0.1)
|
project(baz LANGUAGES CXX VERSION 0.0.1)
|
||||||
|
|
||||||
|
@@ -123,7 +123,7 @@ specs. You can:
|
|||||||
This allows test cases that are tagged with **either** "[some-tag]" **or**
|
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.
|
"[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
|
that `[a][b],[c]` accepts tests that are tagged with either both "[a]" and
|
||||||
"[b]", or tests that are tagged with just "[c]".
|
"[b]", or tests that are tagged with just "[c]".
|
||||||
|
|
||||||
|
@@ -158,11 +158,14 @@ by using `_NO_` in the macro, e.g. `CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS`.
|
|||||||
CATCH_CONFIG_ANDROID_LOGWRITE // Use android's logging system for debug output
|
CATCH_CONFIG_ANDROID_LOGWRITE // Use android's logging system for debug output
|
||||||
CATCH_CONFIG_GLOBAL_NEXTAFTER // Use nextafter{,f,l} instead of std::nextafter
|
CATCH_CONFIG_GLOBAL_NEXTAFTER // Use nextafter{,f,l} instead of std::nextafter
|
||||||
CATCH_CONFIG_GETENV // System has a working `getenv`
|
CATCH_CONFIG_GETENV // System has a working `getenv`
|
||||||
|
CATCH_CONFIG_USE_BUILTIN_CONSTANT_P // Use __builtin_constant_p to trigger warnings
|
||||||
|
|
||||||
> [`CATCH_CONFIG_ANDROID_LOGWRITE`](https://github.com/catchorg/Catch2/issues/1743) and [`CATCH_CONFIG_GLOBAL_NEXTAFTER`](https://github.com/catchorg/Catch2/pull/1739) were introduced in Catch2 2.10.0
|
> [`CATCH_CONFIG_ANDROID_LOGWRITE`](https://github.com/catchorg/Catch2/issues/1743) and [`CATCH_CONFIG_GLOBAL_NEXTAFTER`](https://github.com/catchorg/Catch2/pull/1739) were introduced in Catch2 2.10.0
|
||||||
|
|
||||||
> `CATCH_CONFIG_GETENV` was [introduced](https://github.com/catchorg/Catch2/pull/2562) in Catch2 3.2.0
|
> `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
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
`CATCH_CONFIG_POSIX_SIGNALS` is on by default, except when Catch is compiled under `Cygwin`, where it is disabled by default (but can be force-enabled by defining `CATCH_CONFIG_POSIX_SIGNALS`).
|
`CATCH_CONFIG_POSIX_SIGNALS` is on by default, except when Catch is compiled under `Cygwin`, where it is disabled by default (but can be force-enabled by defining `CATCH_CONFIG_POSIX_SIGNALS`).
|
||||||
@@ -183,6 +186,12 @@ With the exception of `CATCH_CONFIG_EXPERIMENTAL_REDIRECT`,
|
|||||||
these toggles can be disabled by using `_NO_` form of the toggle,
|
these toggles can be disabled by using `_NO_` form of the toggle,
|
||||||
e.g. `CATCH_CONFIG_NO_WINDOWS_SEH`.
|
e.g. `CATCH_CONFIG_NO_WINDOWS_SEH`.
|
||||||
|
|
||||||
|
`CATCH_CONFIG_USE_BUILTIN_CONSTANT_P` is ON by default for Clang and GCC
|
||||||
|
(but as far as possible, not for other compilers masquerading for these
|
||||||
|
two). However, it can cause bugs where the enclosed code is evaluated, even
|
||||||
|
though it should not be, e.g. in [#2925](https://github.com/catchorg/Catch2/issues/2925).
|
||||||
|
|
||||||
|
|
||||||
### `CATCH_CONFIG_FAST_COMPILE`
|
### `CATCH_CONFIG_FAST_COMPILE`
|
||||||
This compile-time flag speeds up compilation of assertion macros by ~20%,
|
This compile-time flag speeds up compilation of assertion macros by ~20%,
|
||||||
by disabling the generation of assertion-local try-catch blocks for
|
by disabling the generation of assertion-local try-catch blocks for
|
||||||
|
@@ -107,8 +107,7 @@ cmake -B debug-build -S . -DCMAKE_BUILD_TYPE=Debug --preset all-tests
|
|||||||
cmake --build debug-build
|
cmake --build debug-build
|
||||||
|
|
||||||
# 4. Run the tests using CTest
|
# 4. Run the tests using CTest
|
||||||
cd debug-build
|
ctest -j 4 --output-on-failure -C Debug --test-dir debug-build
|
||||||
ctest -j 4 --output-on-failure -C Debug
|
|
||||||
```
|
```
|
||||||
<sup><a href='/tools/scripts/buildAndTest.sh#L6-L19' title='File snippet `catch2-build-and-test` was extracted from'>snippet source</a> | <a href='#snippet-catch2-build-and-test' title='Navigate to start of snippet `catch2-build-and-test`'>anchor</a></sup>
|
<sup><a href='/tools/scripts/buildAndTest.sh#L6-L19' title='File snippet `catch2-build-and-test` was extracted from'>snippet source</a> | <a href='#snippet-catch2-build-and-test' title='Navigate to start of snippet `catch2-build-and-test`'>anchor</a></sup>
|
||||||
<!-- endSnippet -->
|
<!-- endSnippet -->
|
||||||
|
@@ -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
|
`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
|
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
|
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
|
```cpp
|
||||||
TEST_CASE("Generators") {
|
TEST_CASE("Generators") {
|
||||||
@@ -103,7 +106,7 @@ a test case,
|
|||||||
* 2 fundamental generators
|
* 2 fundamental generators
|
||||||
* `SingleValueGenerator<T>` -- contains only single element
|
* `SingleValueGenerator<T>` -- contains only single element
|
||||||
* `FixedValuesGenerator<T>` -- contains multiple elements
|
* `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
|
* `FilterGenerator<T, Predicate>` -- filters out elements from a generator
|
||||||
for which the predicate returns "false"
|
for which the predicate returns "false"
|
||||||
* `TakeGenerator<T>` -- takes first `n` elements from a generator
|
* `TakeGenerator<T>` -- takes first `n` elements from a generator
|
||||||
@@ -111,11 +114,11 @@ a test case,
|
|||||||
* `MapGenerator<T, U, Func>` -- returns the result of applying `Func`
|
* `MapGenerator<T, U, Func>` -- returns the result of applying `Func`
|
||||||
on elements from a different generator
|
on elements from a different generator
|
||||||
* `ChunkGenerator<T>` -- returns chunks (inside `std::vector`) of n elements from a generator
|
* `ChunkGenerator<T>` -- returns chunks (inside `std::vector`) of n elements from a generator
|
||||||
* 4 specific purpose generators
|
* 4 specific purpose generators (defined in `catch2/generators/catch_generators_random.hpp`)
|
||||||
* `RandomIntegerGenerator<Integral>` -- generates random Integrals from range
|
* `RandomIntegerGenerator<Integral>` -- generates random Integrals from range
|
||||||
* `RandomFloatGenerator<Float>` -- generates random Floats from range
|
* `RandomFloatGenerator<Float>` -- generates random Floats from range
|
||||||
* `RangeGenerator<T>(first, last)` -- generates all values inside a `[first, last)` arithmetic range
|
* `RangeGenerator<T>(first, last)` -- generates all values inside a `[first, last)` arithmetic range (defined in `catch2/generators/catch_generators_range.hpp`)
|
||||||
* `IteratorGenerator<T>` -- copies and returns values from an iterator range
|
* `IteratorGenerator<T>` -- copies and returns values from an iterator range (defined in `catch2/generators/catch_generators_range.hpp`)
|
||||||
|
|
||||||
> `ChunkGenerator<T>`, `RandomIntegerGenerator<Integral>`, `RandomFloatGenerator<Float>` and `RangeGenerator<T>` were introduced in Catch2 2.7.0.
|
> `ChunkGenerator<T>`, `RandomIntegerGenerator<Integral>`, `RandomFloatGenerator<Float>` and `RangeGenerator<T>` were introduced in Catch2 2.7.0.
|
||||||
|
|
||||||
@@ -216,8 +219,8 @@ For floating point generators, the situation is much more complex.
|
|||||||
Generally Catch2 only promises reproducibility (or even just correctness!)
|
Generally Catch2 only promises reproducibility (or even just correctness!)
|
||||||
on platforms that obey the IEEE-754 standard. Furthermore, reproducibility
|
on platforms that obey the IEEE-754 standard. Furthermore, reproducibility
|
||||||
only applies between binaries that perform floating point math in the
|
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
|
same way, e.g. if you compile a binary targeting the x87 FPU and another
|
||||||
one targetting SSE2 for floating point math, their results will vary.
|
one targeting SSE2 for floating point math, their results will vary.
|
||||||
Similarly, binaries compiled with compiler flags that relax the IEEE-754
|
Similarly, binaries compiled with compiler flags that relax the IEEE-754
|
||||||
adherence, e.g. `-ffast-math`, might provide different results than those
|
adherence, e.g. `-ffast-math`, might provide different results than those
|
||||||
compiled for strict IEEE-754 adherence.
|
compiled for strict IEEE-754 adherence.
|
||||||
|
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
# Release notes
|
# Release notes
|
||||||
**Contents**<br>
|
**Contents**<br>
|
||||||
|
[3.8.1](#381)<br>
|
||||||
|
[3.8.0](#380)<br>
|
||||||
|
[3.7.1](#371)<br>
|
||||||
[3.7.0](#370)<br>
|
[3.7.0](#370)<br>
|
||||||
[3.6.0](#360)<br>
|
[3.6.0](#360)<br>
|
||||||
[3.5.4](#354)<br>
|
[3.5.4](#354)<br>
|
||||||
@@ -64,9 +67,61 @@
|
|||||||
[Even Older versions](#even-older-versions)<br>
|
[Even Older versions](#even-older-versions)<br>
|
||||||
|
|
||||||
|
|
||||||
|
## 3.8.1
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
* Fixed bug where catch_discover_tests fails when no TEST_CASEs are present (#2962)
|
||||||
|
* Fixed Clang 19 -Wc++20-extensions warning (#2968)
|
||||||
|
|
||||||
|
|
||||||
|
## 3.8.0
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
* Added `std::initializer_list` overloads for `(Unordered)RangeEquals` matcher (#2915, #2919)
|
||||||
|
* Added explicit casts to silence GCC's `Wconversion` (#2875)
|
||||||
|
* Made the use of `builtin_constant_p` tricks in assertion macros configurable (#2925)
|
||||||
|
* It is used to prod GCC-like compilers into providing warnings for the asserted expressions, but the compilers miscompile it annoyingly often.
|
||||||
|
* Cleaned out Clang-Tidy's `performance-enum-size` warnings
|
||||||
|
* Added support for using `from_range` generator with iterators with `value_type = const T` (#2926)
|
||||||
|
* This is not correct `value_type` typedef, but it is used in the wild and the change does not make the code meaningfully worse.
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
* Fixed crash when stringifying pre-1970 (epoch) dates on Windows (#2944)
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
* Fixes and improvements for `catch_discover_tests` CMake helper
|
||||||
|
* 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 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.
|
||||||
|
|
||||||
|
|
||||||
|
## 3.7.1
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
* Applied the JUnit reporter's optimization from last release to the SonarQube reporter
|
||||||
|
* Suppressed `-Wuseless-cast` in `CHECK_THROWS_MATCHES` (#2904)
|
||||||
|
* Standardize exit codes for various failures
|
||||||
|
* Running no tests is now guaranteed to exit with 2 (without the `--allow-running-no-tests` flag)
|
||||||
|
* All tests skipped is now always 4 (...)
|
||||||
|
* Assertion failures are now always 42
|
||||||
|
* and so on
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
* Fixed out-of-bounds access when the arg parser encounters single `-` as an argument (#2905)
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
* Added `catch_config_prefix_messages.hpp` to meson build (#2903)
|
||||||
|
* `catch_discover_tests` now supports skipped tests (#2873)
|
||||||
|
* You can get the old behaviour by calling `catch_discover_tests` with `SKIP_IS_FAILURE` option.
|
||||||
|
|
||||||
|
|
||||||
## 3.7.0
|
## 3.7.0
|
||||||
|
|
||||||
### improvements
|
### Improvements
|
||||||
* Slightly improved compile times of benchmarks
|
* Slightly improved compile times of benchmarks
|
||||||
* Made the resolution estimation in benchmarks slightly more precise
|
* Made the resolution estimation in benchmarks slightly more precise
|
||||||
* Added new test case macro, `TEST_CASE_PERSISTENT_FIXTURE` (#2885, #1602)
|
* Added new test case macro, `TEST_CASE_PERSISTENT_FIXTURE` (#2885, #1602)
|
||||||
@@ -120,7 +175,7 @@
|
|||||||
### Improvements
|
### Improvements
|
||||||
* Reintroduced support for GCC 5 and 6 (#2836)
|
* Reintroduced support for GCC 5 and 6 (#2836)
|
||||||
* As with VS2017, if they start causing trouble again, they will be dropped again.
|
* 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
|
* `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.
|
* 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+%
|
* Improved performance of generating 64bit random integers by 20+%
|
||||||
|
@@ -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
|
1. Improve test run times by reducing the amount of expensive and
|
||||||
redundant setup and tear-down required.
|
redundant setup and tear-down required.
|
||||||
2. Reusing results from the previous partial run, in the current
|
2. Reusing results from the previous partial run, in the current
|
||||||
|
@@ -75,7 +75,7 @@ CATCH_TRANSLATE_EXCEPTION( MyType const& ex ) {
|
|||||||
|
|
||||||
Enums that already have a `<<` overload for `std::ostream` will convert to strings as expected.
|
Enums that already have a `<<` overload for `std::ostream` will convert to strings as expected.
|
||||||
If you only need to convert enums to strings for test reporting purposes you can provide a `StringMaker` specialisations as any other type.
|
If you only need to convert enums to strings for test reporting purposes you can provide a `StringMaker` specialisations as any other type.
|
||||||
However, as a convenience, Catch provides the `REGISTER_ENUM` helper macro that will generate the `StringMaker` specialisation for you with minimal code.
|
However, as a convenience, Catch provides the `CATCH_REGISTER_ENUM` helper macro that will generate the `StringMaker` specialisation for you with minimal code.
|
||||||
Simply provide it the (qualified) enum name, followed by all the enum values, and you're done!
|
Simply provide it the (qualified) enum name, followed by all the enum values, and you're done!
|
||||||
|
|
||||||
E.g.
|
E.g.
|
||||||
|
@@ -1,50 +1,47 @@
|
|||||||
cmake_minimum_required( VERSION 3.10 )
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
project(Catch2Examples LANGUAGES CXX)
|
||||||
project( Catch2Examples LANGUAGES CXX )
|
|
||||||
|
|
||||||
message( STATUS "Examples included" )
|
|
||||||
|
|
||||||
|
message(STATUS "Examples included")
|
||||||
|
|
||||||
# Some one-offs first:
|
# Some one-offs first:
|
||||||
# 1) Tests and main in one file
|
# 1) Tests and main in one file
|
||||||
add_executable( 010-TestCase
|
add_executable(010-TestCase
|
||||||
010-TestCase.cpp
|
010-TestCase.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
# 2) Tests and main across two files
|
# 2) Tests and main across two files
|
||||||
add_executable( 020-MultiFile
|
add_executable(020-MultiFile
|
||||||
020-TestCase-1.cpp
|
020-TestCase-1.cpp
|
||||||
020-TestCase-2.cpp
|
020-TestCase-2.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
add_executable(231-Cfg_OutputStreams
|
add_executable(231-Cfg_OutputStreams
|
||||||
231-Cfg-OutputStreams.cpp
|
231-Cfg-OutputStreams.cpp
|
||||||
)
|
)
|
||||||
target_link_libraries(231-Cfg_OutputStreams Catch2_buildall_interface)
|
target_link_libraries(231-Cfg_OutputStreams Catch2_buildall_interface)
|
||||||
target_compile_definitions(231-Cfg_OutputStreams PUBLIC CATCH_CONFIG_NOSTDOUT)
|
target_compile_definitions(231-Cfg_OutputStreams PUBLIC CATCH_CONFIG_NOSTDOUT)
|
||||||
|
|
||||||
# These examples use the standard separate compilation
|
# These examples use the standard separate compilation
|
||||||
set( SOURCES_IDIOMATIC_EXAMPLES
|
set(SOURCES_IDIOMATIC_EXAMPLES
|
||||||
030-Asn-Require-Check.cpp
|
030-Asn-Require-Check.cpp
|
||||||
100-Fix-Section.cpp
|
100-Fix-Section.cpp
|
||||||
110-Fix-ClassFixture.cpp
|
110-Fix-ClassFixture.cpp
|
||||||
111-Fix-PersistentFixture.cpp
|
111-Fix-PersistentFixture.cpp
|
||||||
120-Bdd-ScenarioGivenWhenThen.cpp
|
120-Bdd-ScenarioGivenWhenThen.cpp
|
||||||
210-Evt-EventListeners.cpp
|
210-Evt-EventListeners.cpp
|
||||||
232-Cfg-CustomMain.cpp
|
232-Cfg-CustomMain.cpp
|
||||||
300-Gen-OwnGenerator.cpp
|
300-Gen-OwnGenerator.cpp
|
||||||
301-Gen-MapTypeConversion.cpp
|
301-Gen-MapTypeConversion.cpp
|
||||||
302-Gen-Table.cpp
|
302-Gen-Table.cpp
|
||||||
310-Gen-VariablesInGenerators.cpp
|
310-Gen-VariablesInGenerators.cpp
|
||||||
311-Gen-CustomCapture.cpp
|
311-Gen-CustomCapture.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
string( REPLACE ".cpp" "" BASENAMES_IDIOMATIC_EXAMPLES "${SOURCES_IDIOMATIC_EXAMPLES}" )
|
string(REPLACE ".cpp" "" BASENAMES_IDIOMATIC_EXAMPLES "${SOURCES_IDIOMATIC_EXAMPLES}")
|
||||||
set( TARGETS_IDIOMATIC_EXAMPLES ${BASENAMES_IDIOMATIC_EXAMPLES} )
|
set(TARGETS_IDIOMATIC_EXAMPLES ${BASENAMES_IDIOMATIC_EXAMPLES})
|
||||||
|
|
||||||
|
foreach(name ${TARGETS_IDIOMATIC_EXAMPLES})
|
||||||
foreach( name ${TARGETS_IDIOMATIC_EXAMPLES} )
|
add_executable(${name} ${name}.cpp)
|
||||||
add_executable( ${name} ${name}.cpp )
|
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
set(ALL_EXAMPLE_TARGETS
|
set(ALL_EXAMPLE_TARGETS
|
||||||
@@ -53,10 +50,9 @@ set(ALL_EXAMPLE_TARGETS
|
|||||||
020-MultiFile
|
020-MultiFile
|
||||||
)
|
)
|
||||||
|
|
||||||
foreach( name ${ALL_EXAMPLE_TARGETS} )
|
foreach(name ${ALL_EXAMPLE_TARGETS})
|
||||||
target_link_libraries( ${name} Catch2WithMain )
|
target_link_libraries(${name} Catch2WithMain)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
|
||||||
list(APPEND CATCH_WARNING_TARGETS ${ALL_EXAMPLE_TARGETS})
|
list(APPEND CATCH_WARNING_TARGETS ${ALL_EXAMPLE_TARGETS})
|
||||||
set(CATCH_WARNING_TARGETS ${CATCH_WARNING_TARGETS} PARENT_SCOPE)
|
set(CATCH_WARNING_TARGETS ${CATCH_WARNING_TARGETS} PARENT_SCOPE)
|
||||||
|
@@ -38,6 +38,8 @@ same as the Catch name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``.
|
|||||||
[OUTPUT_PREFIX prefix]
|
[OUTPUT_PREFIX prefix]
|
||||||
[OUTPUT_SUFFIX suffix]
|
[OUTPUT_SUFFIX suffix]
|
||||||
[DISCOVERY_MODE <POST_BUILD|PRE_TEST>]
|
[DISCOVERY_MODE <POST_BUILD|PRE_TEST>]
|
||||||
|
[SKIP_IS_FAILURE]
|
||||||
|
[ADD_TAGS_AS_LABELS]
|
||||||
)
|
)
|
||||||
|
|
||||||
``catch_discover_tests`` sets up a post-build command on the test executable
|
``catch_discover_tests`` sets up a post-build command on the test executable
|
||||||
@@ -131,7 +133,7 @@ same as the Catch name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``.
|
|||||||
of test cases from the test executable and when the tests are executed themselves.
|
of test cases from the test executable and when the tests are executed themselves.
|
||||||
This requires cmake/ctest >= 3.22.
|
This requires cmake/ctest >= 3.22.
|
||||||
|
|
||||||
`DISCOVERY_MODE mode``
|
``DISCOVERY_MODE mode``
|
||||||
Provides control over when ``catch_discover_tests`` performs test discovery.
|
Provides control over when ``catch_discover_tests`` performs test discovery.
|
||||||
By default, ``POST_BUILD`` sets up a post-build command to perform test discovery
|
By default, ``POST_BUILD`` sets up a post-build command to perform test discovery
|
||||||
at build time. In certain scenarios, like cross-compiling, this ``POST_BUILD``
|
at build time. In certain scenarios, like cross-compiling, this ``POST_BUILD``
|
||||||
@@ -144,6 +146,12 @@ same as the Catch name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``.
|
|||||||
calling ``catch_discover_tests``. This provides a mechanism for globally selecting
|
calling ``catch_discover_tests``. This provides a mechanism for globally selecting
|
||||||
a preferred test discovery behavior without having to modify each call site.
|
a preferred test discovery behavior without having to modify each call site.
|
||||||
|
|
||||||
|
``SKIP_IS_FAILURE``
|
||||||
|
Disables skipped test detection.
|
||||||
|
|
||||||
|
``ADD_TAGS_AS_LABELS``
|
||||||
|
Adds all test tags as CTest labels.
|
||||||
|
|
||||||
#]=======================================================================]
|
#]=======================================================================]
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
@@ -151,12 +159,16 @@ function(catch_discover_tests TARGET)
|
|||||||
|
|
||||||
cmake_parse_arguments(
|
cmake_parse_arguments(
|
||||||
""
|
""
|
||||||
""
|
"SKIP_IS_FAILURE;ADD_TAGS_AS_LABELS"
|
||||||
"TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST;REPORTER;OUTPUT_DIR;OUTPUT_PREFIX;OUTPUT_SUFFIX;DISCOVERY_MODE"
|
"TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST;REPORTER;OUTPUT_DIR;OUTPUT_PREFIX;OUTPUT_SUFFIX;DISCOVERY_MODE"
|
||||||
"TEST_SPEC;EXTRA_ARGS;PROPERTIES;DL_PATHS;DL_FRAMEWORK_PATHS"
|
"TEST_SPEC;EXTRA_ARGS;PROPERTIES;DL_PATHS;DL_FRAMEWORK_PATHS"
|
||||||
${ARGN}
|
${ARGN}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(${CMAKE_VERSION} VERSION_LESS "3.19")
|
||||||
|
message(FATAL_ERROR "This script requires JSON support from CMake version 3.19 or greater.")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT _WORKING_DIRECTORY)
|
if(NOT _WORKING_DIRECTORY)
|
||||||
set(_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
|
set(_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
endif()
|
endif()
|
||||||
@@ -175,7 +187,7 @@ function(catch_discover_tests TARGET)
|
|||||||
endif()
|
endif()
|
||||||
set(_DISCOVERY_MODE ${CMAKE_CATCH_DISCOVER_TESTS_DISCOVERY_MODE})
|
set(_DISCOVERY_MODE ${CMAKE_CATCH_DISCOVER_TESTS_DISCOVERY_MODE})
|
||||||
endif()
|
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}")
|
message(FATAL_ERROR "Unknown DISCOVERY_MODE: ${_DISCOVERY_MODE}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -192,6 +204,9 @@ function(catch_discover_tests TARGET)
|
|||||||
TARGET ${TARGET}
|
TARGET ${TARGET}
|
||||||
PROPERTY CROSSCOMPILING_EMULATOR
|
PROPERTY CROSSCOMPILING_EMULATOR
|
||||||
)
|
)
|
||||||
|
if(NOT _SKIP_IS_FAILURE)
|
||||||
|
set(_PROPERTIES ${_PROPERTIES} SKIP_RETURN_CODE 4)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(_DISCOVERY_MODE STREQUAL "POST_BUILD")
|
if(_DISCOVERY_MODE STREQUAL "POST_BUILD")
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
@@ -215,6 +230,7 @@ function(catch_discover_tests TARGET)
|
|||||||
-D "TEST_DL_PATHS=${_DL_PATHS}"
|
-D "TEST_DL_PATHS=${_DL_PATHS}"
|
||||||
-D "TEST_DL_FRAMEWORK_PATHS=${_DL_FRAMEWORK_PATHS}"
|
-D "TEST_DL_FRAMEWORK_PATHS=${_DL_FRAMEWORK_PATHS}"
|
||||||
-D "CTEST_FILE=${ctest_tests_file}"
|
-D "CTEST_FILE=${ctest_tests_file}"
|
||||||
|
-D "ADD_TAGS_AS_LABELS=${_ADD_TAGS_AS_LABELS}"
|
||||||
-P "${_CATCH_DISCOVER_TESTS_SCRIPT}"
|
-P "${_CATCH_DISCOVER_TESTS_SCRIPT}"
|
||||||
VERBATIM
|
VERBATIM
|
||||||
)
|
)
|
||||||
@@ -260,7 +276,7 @@ function(catch_discover_tests TARGET)
|
|||||||
" CTEST_FILE" " [==[" "${ctest_tests_file}" "]==]" "\n"
|
" CTEST_FILE" " [==[" "${ctest_tests_file}" "]==]" "\n"
|
||||||
" TEST_DL_PATHS" " [==[" "${_DL_PATHS}" "]==]" "\n"
|
" TEST_DL_PATHS" " [==[" "${_DL_PATHS}" "]==]" "\n"
|
||||||
" TEST_DL_FRAMEWORK_PATHS" " [==[" "${_DL_FRAMEWORK_PATHS}" "]==]" "\n"
|
" TEST_DL_FRAMEWORK_PATHS" " [==[" "${_DL_FRAMEWORK_PATHS}" "]==]" "\n"
|
||||||
" CTEST_FILE" " [==[" "${CTEST_FILE}" "]==]" "\n"
|
" ADD_TAGS_AS_LABELS" " [==[" "${_ADD_TAGS_AS_LABELS}" "]==]" "\n"
|
||||||
" )" "\n"
|
" )" "\n"
|
||||||
" endif()" "\n"
|
" endif()" "\n"
|
||||||
" include(\"${ctest_tests_file}\")" "\n"
|
" include(\"${ctest_tests_file}\")" "\n"
|
||||||
@@ -287,22 +303,10 @@ function(catch_discover_tests TARGET)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0")
|
# Add discovered tests to directory TEST_INCLUDE_FILES
|
||||||
# Add discovered tests to directory TEST_INCLUDE_FILES
|
set_property(DIRECTORY
|
||||||
set_property(DIRECTORY
|
APPEND PROPERTY TEST_INCLUDE_FILES "${ctest_include_file}"
|
||||||
APPEND PROPERTY TEST_INCLUDE_FILES "${ctest_include_file}"
|
)
|
||||||
)
|
|
||||||
else()
|
|
||||||
# Add discovered tests as directory TEST_INCLUDE_FILE if possible
|
|
||||||
get_property(test_include_file_set DIRECTORY PROPERTY TEST_INCLUDE_FILE SET)
|
|
||||||
if (NOT ${test_include_file_set})
|
|
||||||
set_property(DIRECTORY
|
|
||||||
PROPERTY TEST_INCLUDE_FILE "${ctest_include_file}"
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Cannot set more than one TEST_INCLUDE_FILE")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
@@ -22,10 +22,11 @@ function(catch_discover_tests_impl)
|
|||||||
""
|
""
|
||||||
""
|
""
|
||||||
"TEST_EXECUTABLE;TEST_WORKING_DIR;TEST_OUTPUT_DIR;TEST_OUTPUT_PREFIX;TEST_OUTPUT_SUFFIX;TEST_PREFIX;TEST_REPORTER;TEST_SPEC;TEST_SUFFIX;TEST_LIST;CTEST_FILE"
|
"TEST_EXECUTABLE;TEST_WORKING_DIR;TEST_OUTPUT_DIR;TEST_OUTPUT_PREFIX;TEST_OUTPUT_SUFFIX;TEST_PREFIX;TEST_REPORTER;TEST_SPEC;TEST_SUFFIX;TEST_LIST;CTEST_FILE"
|
||||||
"TEST_EXTRA_ARGS;TEST_PROPERTIES;TEST_EXECUTOR;TEST_DL_PATHS;TEST_DL_FRAMEWORK_PATHS"
|
"TEST_EXTRA_ARGS;TEST_PROPERTIES;TEST_EXECUTOR;TEST_DL_PATHS;TEST_DL_FRAMEWORK_PATHS;ADD_TAGS_AS_LABELS"
|
||||||
${ARGN}
|
${ARGN}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set(add_tags "${_ADD_TAGS_AS_LABELS}")
|
||||||
set(prefix "${_TEST_PREFIX}")
|
set(prefix "${_TEST_PREFIX}")
|
||||||
set(suffix "${_TEST_SUFFIX}")
|
set(suffix "${_TEST_SUFFIX}")
|
||||||
set(spec ${_TEST_SPEC})
|
set(spec ${_TEST_SPEC})
|
||||||
@@ -72,25 +73,19 @@ function(catch_discover_tests_impl)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${_TEST_EXECUTOR} "${_TEST_EXECUTABLE}" ${spec} --list-tests --verbosity quiet
|
COMMAND ${_TEST_EXECUTOR} "${_TEST_EXECUTABLE}" ${spec} --list-tests --reporter json
|
||||||
OUTPUT_VARIABLE output
|
OUTPUT_VARIABLE listing_output
|
||||||
RESULT_VARIABLE result
|
RESULT_VARIABLE result
|
||||||
WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
|
WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
|
||||||
)
|
)
|
||||||
if(NOT ${result} EQUAL 0)
|
if(NOT ${result} EQUAL 0)
|
||||||
message(FATAL_ERROR
|
message(FATAL_ERROR
|
||||||
"Error running test executable '${_TEST_EXECUTABLE}':\n"
|
"Error listing tests from executable '${_TEST_EXECUTABLE}':\n"
|
||||||
" Result: ${result}\n"
|
" Result: ${result}\n"
|
||||||
" Output: ${output}\n"
|
" Output: ${listing_output}\n"
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Make sure to escape ; (semicolons) in test names first, because
|
|
||||||
# that'd break the foreach loop for "Parse output" later and create
|
|
||||||
# wrongly splitted and thus failing test cases (false positives)
|
|
||||||
string(REPLACE ";" "\;" output "${output}")
|
|
||||||
string(REPLACE "\n" ";" output "${output}")
|
|
||||||
|
|
||||||
# Prepare reporter
|
# Prepare reporter
|
||||||
if(reporter)
|
if(reporter)
|
||||||
set(reporter_arg "--reporter ${reporter}")
|
set(reporter_arg "--reporter ${reporter}")
|
||||||
@@ -110,7 +105,7 @@ function(catch_discover_tests_impl)
|
|||||||
)
|
)
|
||||||
elseif(NOT ${reporter_check_result} EQUAL 0)
|
elseif(NOT ${reporter_check_result} EQUAL 0)
|
||||||
message(FATAL_ERROR
|
message(FATAL_ERROR
|
||||||
"Error running test executable '${_TEST_EXECUTABLE}':\n"
|
"Error checking for reporter in test executable '${_TEST_EXECUTABLE}':\n"
|
||||||
" Result: ${reporter_check_result}\n"
|
" Result: ${reporter_check_result}\n"
|
||||||
" Output: ${reporter_check_output}\n"
|
" Output: ${reporter_check_output}\n"
|
||||||
)
|
)
|
||||||
@@ -139,46 +134,92 @@ function(catch_discover_tests_impl)
|
|||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Parse output
|
# Parse JSON output for list of tests/class names/tags
|
||||||
foreach(line ${output})
|
string(JSON version GET "${listing_output}" "version")
|
||||||
set(test "${line}")
|
if(NOT version STREQUAL "1")
|
||||||
|
message(FATAL_ERROR "Unsupported catch output version: '${version}'")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Speed-up reparsing by cutting away unneeded parts of JSON.
|
||||||
|
string(JSON test_listing GET "${listing_output}" "listings" "tests")
|
||||||
|
string(JSON num_tests LENGTH "${test_listing}")
|
||||||
|
|
||||||
|
# Exit early if no tests are detected
|
||||||
|
if(num_tests STREQUAL "0")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# CMake's foreach-RANGE is inclusive, so we have to subtract 1
|
||||||
|
math(EXPR num_tests "${num_tests} - 1")
|
||||||
|
|
||||||
|
foreach(idx RANGE ${num_tests})
|
||||||
|
string(JSON single_test GET ${test_listing} ${idx})
|
||||||
|
string(JSON test_tags GET "${single_test}" "tags")
|
||||||
|
string(JSON plain_name GET "${single_test}" "name")
|
||||||
|
|
||||||
# Escape characters in test case names that would be parsed by Catch2
|
# Escape characters in test case names that would be parsed by Catch2
|
||||||
# Note that the \ escaping must happen FIRST! Do not change the order.
|
# Note that the \ escaping must happen FIRST! Do not change the order.
|
||||||
set(test_name "${test}")
|
set(escaped_name "${plain_name}")
|
||||||
foreach(char \\ , [ ])
|
foreach(char \\ , [ ] ;)
|
||||||
string(REPLACE ${char} "\\${char}" test_name "${test_name}")
|
string(REPLACE ${char} "\\${char}" escaped_name "${escaped_name}")
|
||||||
endforeach(char)
|
endforeach(char)
|
||||||
# ...add output dir
|
# ...add output dir
|
||||||
if(output_dir)
|
if(output_dir)
|
||||||
string(REGEX REPLACE "[^A-Za-z0-9_]" "_" test_name_clean "${test_name}")
|
string(REGEX REPLACE "[^A-Za-z0-9_]" "_" escaped_name_clean "${escaped_name}")
|
||||||
set(output_dir_arg "--out ${output_dir}/${output_prefix}${test_name_clean}${output_suffix}")
|
set(output_dir_arg "--out ${output_dir}/${output_prefix}${escaped_name_clean}${output_suffix}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ...and add to script
|
# ...and add to script
|
||||||
add_command(add_test
|
add_command(add_test
|
||||||
"${prefix}${test}${suffix}"
|
"${prefix}${plain_name}${suffix}"
|
||||||
${_TEST_EXECUTOR}
|
${_TEST_EXECUTOR}
|
||||||
"${_TEST_EXECUTABLE}"
|
"${_TEST_EXECUTABLE}"
|
||||||
"${test_name}"
|
"${escaped_name}"
|
||||||
${extra_args}
|
${extra_args}
|
||||||
"${reporter_arg}"
|
"${reporter_arg}"
|
||||||
"${output_dir_arg}"
|
"${output_dir_arg}"
|
||||||
)
|
)
|
||||||
add_command(set_tests_properties
|
add_command(set_tests_properties
|
||||||
"${prefix}${test}${suffix}"
|
"${prefix}${plain_name}${suffix}"
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
|
WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
|
||||||
${properties}
|
${properties}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
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")
|
||||||
|
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
|
||||||
|
# in CMake, so we have to escape them. Ideally we could use the [=[...]=]
|
||||||
|
# syntax for this, but CTest currently keeps the square quotes in the label
|
||||||
|
# name. So we add 2 backslashes to escape it instead.
|
||||||
|
# **IMPORTANT**: The number of backslashes depends on how many layers
|
||||||
|
# of CMake the tag goes. If this script is changed, the
|
||||||
|
# number of backslashes to escape may change as well.
|
||||||
|
string(REPLACE ";" "\\;" a_tag "${a_tag}")
|
||||||
|
list(APPEND tag_list "${a_tag}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
add_command(set_tests_properties
|
||||||
|
"${prefix}${plain_name}${suffix}"
|
||||||
|
PROPERTIES
|
||||||
|
LABELS "${tag_list}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif(add_tags)
|
||||||
|
|
||||||
if(environment_modifications)
|
if(environment_modifications)
|
||||||
add_command(set_tests_properties
|
add_command(set_tests_properties
|
||||||
"${prefix}${test}${suffix}"
|
"${prefix}${plain_name}${suffix}"
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
ENVIRONMENT_MODIFICATION "${environment_modifications}")
|
ENVIRONMENT_MODIFICATION "${environment_modifications}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
list(APPEND tests "${prefix}${test}${suffix}")
|
list(APPEND tests "${prefix}${plain_name}${suffix}")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
# Create a list of all discovered tests, which users may use to e.g. set
|
# Create a list of all discovered tests, which users may use to e.g. set
|
||||||
@@ -207,5 +248,6 @@ if(CMAKE_SCRIPT_MODE_FILE)
|
|||||||
TEST_DL_PATHS ${TEST_DL_PATHS}
|
TEST_DL_PATHS ${TEST_DL_PATHS}
|
||||||
TEST_DL_FRAMEWORK_PATHS ${TEST_DL_FRAMEWORK_PATHS}
|
TEST_DL_FRAMEWORK_PATHS ${TEST_DL_FRAMEWORK_PATHS}
|
||||||
CTEST_FILE ${CTEST_FILE}
|
CTEST_FILE ${CTEST_FILE}
|
||||||
|
ADD_TAGS_AS_LABELS ${ADD_TAGS_AS_LABELS}
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
# * REPORTER - reporter spec to use for tests
|
# * REPORTER - reporter spec to use for tests
|
||||||
# * TEST_SPEC - test spec used for filtering tests
|
# * TEST_SPEC - test spec used for filtering tests
|
||||||
function(catch_add_sharded_tests TARGET)
|
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")
|
message(FATAL_ERROR "add_sharded_catch_tests only supports CMake versions 3.10.0 and up")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ function(catch_add_sharded_tests TARGET)
|
|||||||
${ARGN}
|
${ARGN}
|
||||||
)
|
)
|
||||||
|
|
||||||
if (NOT DEFINED _SHARD_COUNT)
|
if(NOT DEFINED _SHARD_COUNT)
|
||||||
set(_SHARD_COUNT 2)
|
set(_SHARD_COUNT 2)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -61,8 +61,6 @@ function(catch_add_sharded_tests TARGET)
|
|||||||
-P "${shard_impl_script_file}"
|
-P "${shard_impl_script_file}"
|
||||||
VERBATIM
|
VERBATIM
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
|
@@ -25,10 +25,10 @@ if(NOT EXISTS "${TEST_BINARY}")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(other_args "")
|
set(other_args "")
|
||||||
if (TEST_SPEC)
|
if(TEST_SPEC)
|
||||||
set(other_args "${other_args} ${TEST_SPEC}")
|
set(other_args "${other_args} ${TEST_SPEC}")
|
||||||
endif()
|
endif()
|
||||||
if (REPORTER_SPEC)
|
if(REPORTER_SPEC)
|
||||||
set(other_args "${other_args} --reporter ${REPORTER_SPEC}")
|
set(other_args "${other_args} --reporter ${REPORTER_SPEC}")
|
||||||
endif()
|
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")
|
message(FATAL_ERROR "ParseAndAddCatchTests requires CMake 2.8.8 or newer")
|
||||||
endif()
|
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)
|
option(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS "Add test file to CMAKE_CONFIGURE_DEPENDS property" OFF)
|
||||||
|
|
||||||
function(ParseAndAddCatchTests_PrintDebugMessage)
|
function(ParseAndAddCatchTests_PrintDebugMessage)
|
||||||
if(PARSE_CATCH_TESTS_VERBOSE)
|
if(PARSE_CATCH_TESTS_VERBOSE)
|
||||||
message(STATUS "ParseAndAddCatchTests: ${ARGV}")
|
message(STATUS "ParseAndAddCatchTests: ${ARGV}")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# This removes the contents between
|
# This removes the contents between
|
||||||
@@ -90,163 +90,161 @@ endfunction()
|
|||||||
|
|
||||||
# Worker function
|
# Worker function
|
||||||
function(ParseAndAddCatchTests_ParseFile SourceFile TestTarget)
|
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 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:.+>")
|
if(SourceFile MATCHES "\\\$<TARGET_OBJECTS:.+>")
|
||||||
ParseAndAddCatchTests_PrintDebugMessage("Detected OBJECT library: ${SourceFile} this will not be scanned for tests.")
|
ParseAndAddCatchTests_PrintDebugMessage("Detected OBJECT library: ${SourceFile} this will not be scanned for tests.")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
# According to CMake docs EXISTS behavior is well-defined only for full paths.
|
# According to CMake docs EXISTS behavior is well-defined only for full paths.
|
||||||
get_filename_component(SourceFile ${SourceFile} ABSOLUTE)
|
get_filename_component(SourceFile ${SourceFile} ABSOLUTE)
|
||||||
if(NOT EXISTS ${SourceFile})
|
if(NOT EXISTS ${SourceFile})
|
||||||
message(WARNING "Cannot find source file: ${SourceFile}")
|
message(WARNING "Cannot find source file: ${SourceFile}")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
ParseAndAddCatchTests_PrintDebugMessage("parsing ${SourceFile}")
|
ParseAndAddCatchTests_PrintDebugMessage("parsing ${SourceFile}")
|
||||||
file(STRINGS ${SourceFile} Contents NEWLINE_CONSUME)
|
file(STRINGS ${SourceFile} Contents NEWLINE_CONSUME)
|
||||||
|
|
||||||
# Remove block and fullline comments
|
# Remove block and fullline comments
|
||||||
ParseAndAddCatchTests_RemoveComments(Contents)
|
ParseAndAddCatchTests_RemoveComments(Contents)
|
||||||
|
|
||||||
# Find definition of test names
|
# Find definition of test names
|
||||||
# https://regex101.com/r/JygOND/1
|
# 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}")
|
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)
|
if(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS AND Tests)
|
||||||
ParseAndAddCatchTests_PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property")
|
ParseAndAddCatchTests_PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property")
|
||||||
set_property(
|
set_property(
|
||||||
DIRECTORY
|
DIRECTORY
|
||||||
APPEND
|
APPEND
|
||||||
PROPERTY CMAKE_CONFIGURE_DEPENDS ${SourceFile}
|
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()
|
endif()
|
||||||
|
|
||||||
# check CMP0110 policy for new add_test() behavior
|
# Assign name and tags
|
||||||
if(POLICY CMP0110)
|
list(GET TestStrings 0 Name)
|
||||||
cmake_policy(GET CMP0110 _cmp0110_value) # new add_test() behavior
|
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()
|
else()
|
||||||
# just to be thorough explicitly set the variable
|
set(CTestName "${Name}")
|
||||||
set(_cmp0110_value)
|
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()
|
endif()
|
||||||
|
|
||||||
foreach(TestName ${Tests})
|
list(APPEND Labels ${Tags})
|
||||||
# Strip newlines
|
|
||||||
string(REGEX REPLACE "\\\\\n|\n" "" TestName "${TestName}")
|
|
||||||
|
|
||||||
# Get test type and fixture if applicable
|
set(HiddenTagFound OFF)
|
||||||
string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^,^\"]*" TestTypeAndFixture "${TestName}")
|
foreach(label ${Labels})
|
||||||
string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)" TestType "${TestTypeAndFixture}")
|
string(REGEX MATCH "^!hide|^\\." result ${label})
|
||||||
string(REGEX REPLACE "${TestType}\\([ \t]*" "" TestFixture "${TestTypeAndFixture}")
|
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
|
# Escape commas in the test spec
|
||||||
string(REGEX MATCHALL "\"+([^\\^\"]|\\\\\")+\"+" TestStrings "${TestName}")
|
string(REPLACE "," "\\," Name ${Name})
|
||||||
|
|
||||||
# Strip wrapping quotation marks
|
# Work around CMake 3.18.0 change in `add_test()`, before the escaped quotes were necessary,
|
||||||
string(REGEX REPLACE "^\"(.*)\"$" "\\1" TestStrings "${TestStrings}")
|
# only with CMake 3.18.0 the escaped double quotes confuse the call. This change is reverted in 3.18.1
|
||||||
string(REPLACE "\";\"" ";" TestStrings "${TestStrings}")
|
# 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
|
# Handle template test cases
|
||||||
list(LENGTH TestStrings TestStringsLength)
|
if("${TestTypeAndFixture}" MATCHES ".*TEMPLATE_.*")
|
||||||
if(TestStringsLength GREATER 2 OR TestStringsLength LESS 1)
|
set(Name "${Name} - *")
|
||||||
message(FATAL_ERROR "You must provide a valid test name and tags for all tests in ${SourceFile}")
|
endif()
|
||||||
endif()
|
|
||||||
|
|
||||||
# Assign name and tags
|
# Add the test and set its properties
|
||||||
list(GET TestStrings 0 Name)
|
add_test(NAME "${CTestName}" COMMAND ${OptionalCatchTestLauncher} $<TARGET_FILE:${TestTarget}> ${Name} ${AdditionalCatchParameters})
|
||||||
if("${TestType}" STREQUAL "SCENARIO")
|
# Old CMake versions do not document VERSION_GREATER_EQUAL, so we use VERSION_GREATER with 3.8 instead
|
||||||
set(Name "Scenario: ${Name}")
|
if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_GREATER "3.8")
|
||||||
endif()
|
ParseAndAddCatchTests_PrintDebugMessage("Setting DISABLED test property")
|
||||||
if(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME AND "${TestType}" MATCHES "(CATCH_)?TEST_CASE_METHOD" AND TestFixture )
|
set_tests_properties("${CTestName}" PROPERTIES DISABLED ON)
|
||||||
set(CTestName "${TestFixture}:${Name}")
|
else()
|
||||||
else()
|
set_tests_properties("${CTestName}" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran"
|
||||||
set(CTestName "${Name}")
|
LABELS "${Labels}")
|
||||||
endif()
|
endif()
|
||||||
if(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME)
|
set_property(
|
||||||
set(CTestName "${TestTarget}:${CTestName}")
|
TARGET ${TestTarget}
|
||||||
endif()
|
APPEND
|
||||||
# add target to labels to enable running all tests added from this target
|
PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}")
|
||||||
set(Labels ${TestTarget})
|
set_property(
|
||||||
if(TestStringsLength EQUAL 2)
|
SOURCE ${SourceFile}
|
||||||
list(GET TestStrings 1 Tags)
|
APPEND
|
||||||
string(TOLOWER "${Tags}" Tags)
|
PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}")
|
||||||
# remove target from labels if the test is hidden
|
endif()
|
||||||
if("${Tags}" MATCHES ".*\\[!?(hide|\\.)\\].*")
|
endforeach()
|
||||||
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()
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# entry point
|
# entry point
|
||||||
function(ParseAndAddCatchTests TestTarget)
|
function(ParseAndAddCatchTests TestTarget)
|
||||||
message(DEPRECATION "ParseAndAddCatchTest: function deprecated because of possibility of missed test cases. Consider using 'catch_discover_tests' from 'Catch.cmake'")
|
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}")
|
ParseAndAddCatchTests_PrintDebugMessage("Started parsing ${TestTarget}")
|
||||||
get_target_property(SourceFiles ${TestTarget} SOURCES)
|
get_target_property(SourceFiles ${TestTarget} SOURCES)
|
||||||
ParseAndAddCatchTests_PrintDebugMessage("Found the following sources: ${SourceFiles}")
|
ParseAndAddCatchTests_PrintDebugMessage("Found the following sources: ${SourceFiles}")
|
||||||
foreach(SourceFile ${SourceFiles})
|
foreach(SourceFile ${SourceFiles})
|
||||||
ParseAndAddCatchTests_ParseFile(${SourceFile} ${TestTarget})
|
ParseAndAddCatchTests_ParseFile(${SourceFile} ${TestTarget})
|
||||||
endforeach()
|
endforeach()
|
||||||
ParseAndAddCatchTests_PrintDebugMessage("Finished parsing ${TestTarget}")
|
ParseAndAddCatchTests_PrintDebugMessage("Finished parsing ${TestTarget}")
|
||||||
endfunction()
|
endfunction()
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
|
||||||
// Catch v3.7.0
|
// Catch v3.8.1
|
||||||
// Generated: 2024-08-14 12:04:53.604337
|
// Generated: 2025-04-08 12:33:19.863332
|
||||||
// ----------------------------------------------------------
|
// ----------------------------------------------------------
|
||||||
// This file is an amalgamation of multiple different files.
|
// This file is an amalgamation of multiple different files.
|
||||||
// You probably shouldn't edit it directly.
|
// You probably shouldn't edit it directly.
|
||||||
@@ -332,7 +332,7 @@ namespace Catch {
|
|||||||
double diff = b - m;
|
double diff = b - m;
|
||||||
return a + diff * diff;
|
return a + diff * diff;
|
||||||
} ) /
|
} ) /
|
||||||
( last - first );
|
static_cast<double>( last - first );
|
||||||
return std::sqrt( variance );
|
return std::sqrt( variance );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,7 +367,7 @@ namespace Catch {
|
|||||||
double* first,
|
double* first,
|
||||||
double* last ) {
|
double* last ) {
|
||||||
auto count = last - first;
|
auto count = last - first;
|
||||||
double idx = (count - 1) * k / static_cast<double>(q);
|
double idx = static_cast<double>((count - 1) * k) / static_cast<double>(q);
|
||||||
int j = static_cast<int>(idx);
|
int j = static_cast<int>(idx);
|
||||||
double g = idx - j;
|
double g = idx - j;
|
||||||
std::nth_element(first, first + j, last);
|
std::nth_element(first, first + j, last);
|
||||||
@@ -470,10 +470,10 @@ namespace Catch {
|
|||||||
|
|
||||||
double accel = sum_cubes / ( 6 * std::pow( sum_squares, 1.5 ) );
|
double accel = sum_cubes / ( 6 * std::pow( sum_squares, 1.5 ) );
|
||||||
long n = static_cast<long>( resample.size() );
|
long n = static_cast<long>( resample.size() );
|
||||||
double prob_n =
|
double prob_n = static_cast<double>(
|
||||||
std::count_if( resample.begin(),
|
std::count_if( resample.begin(),
|
||||||
resample.end(),
|
resample.end(),
|
||||||
[point]( double x ) { return x < point; } ) /
|
[point]( double x ) { return x < point; } )) /
|
||||||
static_cast<double>( n );
|
static_cast<double>( n );
|
||||||
// degenerate case with uniform samples
|
// degenerate case with uniform samples
|
||||||
if ( Catch::Detail::directCompare( prob_n, 0. ) ) {
|
if ( Catch::Detail::directCompare( prob_n, 0. ) ) {
|
||||||
@@ -627,7 +627,7 @@ std::string StringMaker<Catch::Approx>::convert(Catch::Approx const& value) {
|
|||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression):
|
AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const& _lazyExpression):
|
||||||
lazyExpression(_lazyExpression),
|
lazyExpression(_lazyExpression),
|
||||||
resultType(_resultType) {}
|
resultType(_resultType) {}
|
||||||
|
|
||||||
@@ -1170,7 +1170,13 @@ namespace Catch {
|
|||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
const int MaxExitCode = 255;
|
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) {
|
IEventListenerPtr createReporter(std::string const& reporterName, ReporterConfig&& config) {
|
||||||
auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, CATCH_MOVE(config));
|
auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, CATCH_MOVE(config));
|
||||||
@@ -1334,8 +1340,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int Session::applyCommandLine( int argc, char const * const * argv ) {
|
int Session::applyCommandLine( int argc, char const * const * argv ) {
|
||||||
if( m_startupExceptions )
|
if ( m_startupExceptions ) { return UnspecifiedErrorExitCode; }
|
||||||
return 1;
|
|
||||||
|
|
||||||
auto result = m_cli.parse( Clara::Args( argc, argv ) );
|
auto result = m_cli.parse( Clara::Args( argc, argv ) );
|
||||||
|
|
||||||
@@ -1351,7 +1356,7 @@ namespace Catch {
|
|||||||
<< TextFlow::Column( result.errorMessage() ).indent( 2 )
|
<< TextFlow::Column( result.errorMessage() ).indent( 2 )
|
||||||
<< "\n\n";
|
<< "\n\n";
|
||||||
errStream->stream() << "Run with -? for usage\n\n" << std::flush;
|
errStream->stream() << "Run with -? for usage\n\n" << std::flush;
|
||||||
return MaxExitCode;
|
return UnspecifiedErrorExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_configData.showHelp )
|
if( m_configData.showHelp )
|
||||||
@@ -1421,8 +1426,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int Session::runInternal() {
|
int Session::runInternal() {
|
||||||
if( m_startupExceptions )
|
if ( m_startupExceptions ) { return UnspecifiedErrorExitCode; }
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (m_configData.showHelp || m_configData.libIdentify) {
|
if (m_configData.showHelp || m_configData.libIdentify) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1433,7 +1437,7 @@ namespace Catch {
|
|||||||
<< ") must be greater than the shard index ("
|
<< ") must be greater than the shard index ("
|
||||||
<< m_configData.shardIndex << ")\n"
|
<< m_configData.shardIndex << ")\n"
|
||||||
<< std::flush;
|
<< std::flush;
|
||||||
return 1;
|
return UnspecifiedErrorExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
CATCH_TRY {
|
CATCH_TRY {
|
||||||
@@ -1456,7 +1460,7 @@ namespace Catch {
|
|||||||
for ( auto const& spec : invalidSpecs ) {
|
for ( auto const& spec : invalidSpecs ) {
|
||||||
reporter->reportInvalidTestSpec( spec );
|
reporter->reportInvalidTestSpec( spec );
|
||||||
}
|
}
|
||||||
return 1;
|
return InvalidTestSpecExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1470,29 +1474,29 @@ namespace Catch {
|
|||||||
|
|
||||||
if ( tests.hadUnmatchedTestSpecs()
|
if ( tests.hadUnmatchedTestSpecs()
|
||||||
&& m_config->warnAboutUnmatchedTestSpecs() ) {
|
&& m_config->warnAboutUnmatchedTestSpecs() ) {
|
||||||
return 3;
|
// UnmatchedTestSpecExitCode
|
||||||
|
return UnmatchedTestSpecExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( totals.testCases.total() == 0
|
if ( totals.testCases.total() == 0
|
||||||
&& !m_config->zeroTestsCountAsSuccess() ) {
|
&& !m_config->zeroTestsCountAsSuccess() ) {
|
||||||
return 2;
|
return NoTestsRunExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( totals.testCases.total() > 0 &&
|
if ( totals.testCases.total() > 0 &&
|
||||||
totals.testCases.total() == totals.testCases.skipped
|
totals.testCases.total() == totals.testCases.skipped
|
||||||
&& !m_config->zeroTestsCountAsSuccess() ) {
|
&& !m_config->zeroTestsCountAsSuccess() ) {
|
||||||
return 4;
|
return AllTestsSkippedExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note that on unices only the lower 8 bits are usually used, clamping
|
if ( totals.assertions.failed ) { return TestFailureExitCode; }
|
||||||
// the return value to 255 prevents false negative when some multiple
|
return 0;
|
||||||
// of 256 tests has failed
|
|
||||||
return (std::min) (MaxExitCode, static_cast<int>(totals.assertions.failed));
|
|
||||||
}
|
}
|
||||||
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
|
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
|
||||||
catch( std::exception& ex ) {
|
catch( std::exception& ex ) {
|
||||||
Catch::cerr() << ex.what() << '\n' << std::flush;
|
Catch::cerr() << ex.what() << '\n' << std::flush;
|
||||||
return MaxExitCode;
|
return UnspecifiedErrorExitCode;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -1528,26 +1532,26 @@ namespace Catch {
|
|||||||
static_assert(sizeof(TestCaseProperties) == sizeof(TCP_underlying_type),
|
static_assert(sizeof(TestCaseProperties) == sizeof(TCP_underlying_type),
|
||||||
"The size of the TestCaseProperties is different from the assumed size");
|
"The size of the TestCaseProperties is different from the assumed size");
|
||||||
|
|
||||||
TestCaseProperties operator|(TestCaseProperties lhs, TestCaseProperties rhs) {
|
constexpr TestCaseProperties operator|(TestCaseProperties lhs, TestCaseProperties rhs) {
|
||||||
return static_cast<TestCaseProperties>(
|
return static_cast<TestCaseProperties>(
|
||||||
static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs)
|
static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TestCaseProperties& operator|=(TestCaseProperties& lhs, TestCaseProperties rhs) {
|
constexpr TestCaseProperties& operator|=(TestCaseProperties& lhs, TestCaseProperties rhs) {
|
||||||
lhs = static_cast<TestCaseProperties>(
|
lhs = static_cast<TestCaseProperties>(
|
||||||
static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs)
|
static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs)
|
||||||
);
|
);
|
||||||
return lhs;
|
return lhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestCaseProperties operator&(TestCaseProperties lhs, TestCaseProperties rhs) {
|
constexpr TestCaseProperties operator&(TestCaseProperties lhs, TestCaseProperties rhs) {
|
||||||
return static_cast<TestCaseProperties>(
|
return static_cast<TestCaseProperties>(
|
||||||
static_cast<TCP_underlying_type>(lhs) & static_cast<TCP_underlying_type>(rhs)
|
static_cast<TCP_underlying_type>(lhs) & static_cast<TCP_underlying_type>(rhs)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool applies(TestCaseProperties tcp) {
|
constexpr bool applies(TestCaseProperties tcp) {
|
||||||
static_assert(static_cast<TCP_underlying_type>(TestCaseProperties::None) == 0,
|
static_assert(static_cast<TCP_underlying_type>(TestCaseProperties::None) == 0,
|
||||||
"TestCaseProperties::None must be equal to 0");
|
"TestCaseProperties::None must be equal to 0");
|
||||||
return tcp != TestCaseProperties::None;
|
return tcp != TestCaseProperties::None;
|
||||||
@@ -1586,7 +1590,7 @@ namespace Catch {
|
|||||||
return "Anonymous test case " + std::to_string(++counter);
|
return "Anonymous test case " + std::to_string(++counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
StringRef extractFilenamePart(StringRef filename) {
|
constexpr StringRef extractFilenamePart(StringRef filename) {
|
||||||
size_t lastDot = filename.size();
|
size_t lastDot = filename.size();
|
||||||
while (lastDot > 0 && filename[lastDot - 1] != '.') {
|
while (lastDot > 0 && filename[lastDot - 1] != '.') {
|
||||||
--lastDot;
|
--lastDot;
|
||||||
@@ -1604,7 +1608,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Returns the upper bound on size of extra tags ([#file]+[.])
|
// Returns the upper bound on size of extra tags ([#file]+[.])
|
||||||
size_t sizeOfExtraTags(StringRef filepath) {
|
constexpr size_t sizeOfExtraTags(StringRef filepath) {
|
||||||
// [.] is 3, [#] is another 3
|
// [.] is 3, [#] is another 3
|
||||||
const size_t extras = 3 + 3;
|
const size_t extras = 3 + 3;
|
||||||
return extractFilenamePart(filepath).size() + extras;
|
return extractFilenamePart(filepath).size() + extras;
|
||||||
@@ -1765,10 +1769,6 @@ namespace Catch {
|
|||||||
return lhs.tags < rhs.tags;
|
return lhs.tags < rhs.tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestCaseInfo const& TestCaseHandle::getTestCaseInfo() const {
|
|
||||||
return *m_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
|
|
||||||
@@ -1909,7 +1909,7 @@ namespace Catch {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
static auto getCurrentNanosecondsSinceEpoch() -> uint64_t {
|
static auto getCurrentNanosecondsSinceEpoch() -> uint64_t {
|
||||||
return std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
|
return std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
|
||||||
}
|
}
|
||||||
} // end unnamed namespace
|
} // end unnamed namespace
|
||||||
|
|
||||||
@@ -1926,7 +1926,7 @@ namespace Catch {
|
|||||||
return static_cast<unsigned int>(getElapsedMicroseconds()/1000);
|
return static_cast<unsigned int>(getElapsedMicroseconds()/1000);
|
||||||
}
|
}
|
||||||
auto Timer::getElapsedSeconds() const -> double {
|
auto Timer::getElapsedSeconds() const -> double {
|
||||||
return getElapsedMicroseconds()/1000000.0;
|
return static_cast<double>(getElapsedMicroseconds())/1000000.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1946,7 +1946,10 @@ namespace Detail {
|
|||||||
const int hexThreshold = 255;
|
const int hexThreshold = 255;
|
||||||
|
|
||||||
struct Endianness {
|
struct Endianness {
|
||||||
enum Arch { Big, Little };
|
enum Arch : uint8_t {
|
||||||
|
Big,
|
||||||
|
Little
|
||||||
|
};
|
||||||
|
|
||||||
static Arch which() {
|
static Arch which() {
|
||||||
int one = 1;
|
int one = 1;
|
||||||
@@ -2280,7 +2283,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Version const& libraryVersion() {
|
Version const& libraryVersion() {
|
||||||
static Version version( 3, 7, 0, "", 0 );
|
static Version version( 3, 8, 1, "", 0 );
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2536,8 +2539,8 @@ namespace Catch {
|
|||||||
void AssertionHandler::handleExpr( ITransientExpression const& expr ) {
|
void AssertionHandler::handleExpr( ITransientExpression const& expr ) {
|
||||||
m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction );
|
m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction );
|
||||||
}
|
}
|
||||||
void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef message) {
|
void AssertionHandler::handleMessage(ResultWas::OfType resultType, std::string&& message) {
|
||||||
m_resultCapture.handleMessage( m_assertionInfo, resultType, message, m_reaction );
|
m_resultCapture.handleMessage( m_assertionInfo, resultType, CATCH_MOVE(message), m_reaction );
|
||||||
}
|
}
|
||||||
|
|
||||||
auto AssertionHandler::allowThrows() const -> bool {
|
auto AssertionHandler::allowThrows() const -> bool {
|
||||||
@@ -2683,7 +2686,7 @@ namespace Catch {
|
|||||||
{ TokenType::Argument,
|
{ TokenType::Argument,
|
||||||
next.substr( delimiterPos + 1, next.size() ) } );
|
next.substr( delimiterPos + 1, next.size() ) } );
|
||||||
} else {
|
} else {
|
||||||
if ( next[1] != '-' && next.size() > 2 ) {
|
if ( next.size() > 1 && next[1] != '-' && next.size() > 2 ) {
|
||||||
// Combined short args, e.g. "-ab" for "-a -b"
|
// Combined short args, e.g. "-ab" for "-a -b"
|
||||||
for ( size_t i = 1; i < next.size(); ++i ) {
|
for ( size_t i = 1; i < next.size(); ++i ) {
|
||||||
m_tokenBuffer.push_back(
|
m_tokenBuffer.push_back(
|
||||||
@@ -3516,7 +3519,7 @@ namespace {
|
|||||||
#endif // Windows/ ANSI/ None
|
#endif // Windows/ ANSI/ None
|
||||||
|
|
||||||
|
|
||||||
#if defined( CATCH_PLATFORM_LINUX ) || defined( CATCH_PLATFORM_MAC )
|
#if defined( CATCH_PLATFORM_LINUX ) || defined( CATCH_PLATFORM_MAC ) || defined( __GLIBC__ )
|
||||||
# define CATCH_INTERNAL_HAS_ISATTY
|
# define CATCH_INTERNAL_HAS_ISATTY
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -3656,12 +3659,6 @@ namespace Catch {
|
|||||||
return *Context::currentContext;
|
return *Context::currentContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Context::setResultCapture( IResultCapture* resultCapture ) {
|
|
||||||
m_resultCapture = resultCapture;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Context::setConfig( IConfig const* config ) { m_config = config; }
|
|
||||||
|
|
||||||
SimplePcg32& sharedRng() {
|
SimplePcg32& sharedRng() {
|
||||||
static SimplePcg32 s_rng;
|
static SimplePcg32 s_rng;
|
||||||
return s_rng;
|
return s_rng;
|
||||||
@@ -5264,7 +5261,7 @@ namespace {
|
|||||||
SimplePcg32::result_type SimplePcg32::operator()() {
|
SimplePcg32::result_type SimplePcg32::operator()() {
|
||||||
// prepare the output value
|
// prepare the output value
|
||||||
const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u);
|
const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u);
|
||||||
const auto output = rotate_right(xorshifted, m_state >> 59u);
|
const auto output = rotate_right(xorshifted, static_cast<uint32_t>(m_state >> 59u));
|
||||||
|
|
||||||
// advance state
|
// advance state
|
||||||
m_state = m_state * 6364136223846793005ULL + s_inc;
|
m_state = m_state * 6364136223846793005ULL + s_inc;
|
||||||
@@ -5547,26 +5544,6 @@ ReporterSpec::ReporterSpec(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Catch {
|
|
||||||
|
|
||||||
bool isOk( ResultWas::OfType resultType ) {
|
|
||||||
return ( resultType & ResultWas::FailureBit ) == 0;
|
|
||||||
}
|
|
||||||
bool isJustInfo( int flags ) {
|
|
||||||
return flags == ResultWas::Info;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) {
|
|
||||||
return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; }
|
|
||||||
bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; }
|
|
||||||
|
|
||||||
} // end namespace Catch
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -6232,13 +6209,13 @@ namespace Catch {
|
|||||||
void RunContext::handleMessage(
|
void RunContext::handleMessage(
|
||||||
AssertionInfo const& info,
|
AssertionInfo const& info,
|
||||||
ResultWas::OfType resultType,
|
ResultWas::OfType resultType,
|
||||||
StringRef message,
|
std::string&& message,
|
||||||
AssertionReaction& reaction
|
AssertionReaction& reaction
|
||||||
) {
|
) {
|
||||||
m_lastAssertionInfo = info;
|
m_lastAssertionInfo = info;
|
||||||
|
|
||||||
AssertionResultData data( resultType, LazyExpression( false ) );
|
AssertionResultData data( resultType, LazyExpression( false ) );
|
||||||
data.message = static_cast<std::string>(message);
|
data.message = CATCH_MOVE( message );
|
||||||
AssertionResult assertionResult{ m_lastAssertionInfo,
|
AssertionResult assertionResult{ m_lastAssertionInfo,
|
||||||
CATCH_MOVE( data ) };
|
CATCH_MOVE( data ) };
|
||||||
|
|
||||||
@@ -7153,7 +7130,7 @@ namespace Catch {
|
|||||||
TestType m_testAsFunction;
|
TestType m_testAsFunction;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TestInvokerAsFunction( TestType testAsFunction ) noexcept:
|
constexpr TestInvokerAsFunction( TestType testAsFunction ) noexcept:
|
||||||
m_testAsFunction( testAsFunction ) {}
|
m_testAsFunction( testAsFunction ) {}
|
||||||
|
|
||||||
void invoke() const override { m_testAsFunction(); }
|
void invoke() const override { m_testAsFunction(); }
|
||||||
@@ -7888,36 +7865,16 @@ namespace {
|
|||||||
os.flags(f);
|
os.flags(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldNewline(XmlFormatting fmt) {
|
constexpr bool shouldNewline(XmlFormatting fmt) {
|
||||||
return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Newline));
|
return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Newline));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldIndent(XmlFormatting fmt) {
|
constexpr bool shouldIndent(XmlFormatting fmt) {
|
||||||
return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Indent));
|
return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Indent));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs) {
|
|
||||||
return static_cast<XmlFormatting>(
|
|
||||||
static_cast<std::underlying_type_t<XmlFormatting>>(lhs) |
|
|
||||||
static_cast<std::underlying_type_t<XmlFormatting>>(rhs)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs) {
|
|
||||||
return static_cast<XmlFormatting>(
|
|
||||||
static_cast<std::underlying_type_t<XmlFormatting>>(lhs) &
|
|
||||||
static_cast<std::underlying_type_t<XmlFormatting>>(rhs)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
XmlEncode::XmlEncode( StringRef str, ForWhat forWhat )
|
|
||||||
: m_str( str ),
|
|
||||||
m_forWhat( forWhat )
|
|
||||||
{}
|
|
||||||
|
|
||||||
void XmlEncode::encodeTo( std::ostream& os ) const {
|
void XmlEncode::encodeTo( std::ostream& os ) const {
|
||||||
// Apostrophe escaping not necessary if we always use " to write attributes
|
// Apostrophe escaping not necessary if we always use " to write attributes
|
||||||
// (see: http://www.w3.org/TR/xml/#syntax)
|
// (see: http://www.w3.org/TR/xml/#syntax)
|
||||||
@@ -9154,7 +9111,7 @@ struct RowBreak {};
|
|||||||
struct OutputFlush {};
|
struct OutputFlush {};
|
||||||
|
|
||||||
class Duration {
|
class Duration {
|
||||||
enum class Unit {
|
enum class Unit : uint8_t {
|
||||||
Auto,
|
Auto,
|
||||||
Nanoseconds,
|
Nanoseconds,
|
||||||
Microseconds,
|
Microseconds,
|
||||||
@@ -9226,7 +9183,10 @@ public:
|
|||||||
};
|
};
|
||||||
} // end anon namespace
|
} // end anon namespace
|
||||||
|
|
||||||
enum class Justification { Left, Right };
|
enum class Justification : uint8_t {
|
||||||
|
Left,
|
||||||
|
Right
|
||||||
|
};
|
||||||
|
|
||||||
struct ColumnInfo {
|
struct ColumnInfo {
|
||||||
std::string name;
|
std::string name;
|
||||||
@@ -11050,9 +11010,9 @@ namespace Catch {
|
|||||||
if (!rootName.empty())
|
if (!rootName.empty())
|
||||||
name = rootName + '/' + name;
|
name = rootName + '/' + name;
|
||||||
|
|
||||||
if ( sectionNode.hasAnyAssertions()
|
if ( sectionNode.stats.assertions.total() > 0
|
||||||
|| !sectionNode.stdOut.empty()
|
|| !sectionNode.stdOut.empty()
|
||||||
|| !sectionNode.stdErr.empty() ) {
|
|| !sectionNode.stdErr.empty() ) {
|
||||||
XmlWriter::ScopedElement e = xml.scopedElement("testCase");
|
XmlWriter::ScopedElement e = xml.scopedElement("testCase");
|
||||||
xml.writeAttribute("name"_sr, name);
|
xml.writeAttribute("name"_sr, name);
|
||||||
xml.writeAttribute("duration"_sr, static_cast<long>(sectionNode.stats.durationInSeconds * 1000));
|
xml.writeAttribute("duration"_sr, static_cast<long>(sectionNode.stats.durationInSeconds * 1000));
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
|
||||||
// Catch v3.7.0
|
// Catch v3.8.1
|
||||||
// Generated: 2024-08-14 12:04:53.220567
|
// Generated: 2025-04-08 12:33:19.851017
|
||||||
// ----------------------------------------------------------
|
// ----------------------------------------------------------
|
||||||
// This file is an amalgamation of multiple different files.
|
// This file is an amalgamation of multiple different files.
|
||||||
// You probably shouldn't edit it directly.
|
// You probably shouldn't edit it directly.
|
||||||
@@ -150,7 +150,7 @@
|
|||||||
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \
|
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \
|
||||||
_Pragma( "GCC diagnostic ignored \"-Wshadow\"" )
|
_Pragma( "GCC diagnostic ignored \"-Wshadow\"" )
|
||||||
|
|
||||||
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)
|
# define CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -174,14 +174,45 @@
|
|||||||
// clang-cl defines _MSC_VER as well as __clang__, which could cause the
|
// clang-cl defines _MSC_VER as well as __clang__, which could cause the
|
||||||
// start/stop internal suppression macros to be double defined.
|
// start/stop internal suppression macros to be double defined.
|
||||||
#if defined(__clang__) && !defined(_MSC_VER)
|
#if defined(__clang__) && !defined(_MSC_VER)
|
||||||
|
# define CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P
|
||||||
# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )
|
# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )
|
||||||
# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" )
|
# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" )
|
||||||
|
|
||||||
#endif // __clang__ && !_MSC_VER
|
#endif // __clang__ && !_MSC_VER
|
||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wunused-variable\"" )
|
||||||
|
|
||||||
|
# if (__clang_major__ >= 20)
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wvariadic-macro-arguments-omitted\"" )
|
||||||
|
# elif (__clang_major__ == 19)
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wc++20-extensions\"" )
|
||||||
|
# else
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" )
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wunused-template\"" )
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_COMMA_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wcomma\"" )
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wshadow\"" )
|
||||||
|
|
||||||
|
#endif // __clang__
|
||||||
|
|
||||||
// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug
|
// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug
|
||||||
// which results in calls to destructors being emitted for each temporary,
|
// which results in calls to destructors being emitted for each temporary,
|
||||||
// without a matching initialization. In practice, this can result in something
|
// without a matching initialization. In practice, this can result in something
|
||||||
@@ -198,35 +229,11 @@
|
|||||||
// https://developer.nvidia.com/nvidia_bug/3321845.
|
// https://developer.nvidia.com/nvidia_bug/3321845.
|
||||||
//
|
//
|
||||||
// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
|
// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
|
||||||
# if !defined(__ibmxl__) && !defined(__CUDACC__) && !defined( __NVCOMPILER )
|
#if defined( __ibmxl__ ) || defined( __CUDACC__ ) || defined( __NVCOMPILER )
|
||||||
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */
|
# define CATCH_INTERNAL_CONFIG_NO_USE_BUILTIN_CONSTANT_P
|
||||||
# endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wunused-variable\"" )
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" )
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wunused-template\"" )
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_COMMA_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wcomma\"" )
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wshadow\"" )
|
|
||||||
|
|
||||||
#endif // __clang__
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// We know some environments not to support full POSIX signals
|
// We know some environments not to support full POSIX signals
|
||||||
@@ -450,6 +457,22 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// The goal of this macro is to avoid evaluation of the arguments, but
|
||||||
|
// still have the compiler warn on problems inside...
|
||||||
|
#if defined( CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P ) && \
|
||||||
|
!defined( CATCH_INTERNAL_CONFIG_NO_USE_BUILTIN_CONSTANT_P ) && !defined(CATCH_CONFIG_USE_BUILTIN_CONSTANT_P)
|
||||||
|
#define CATCH_CONFIG_USE_BUILTIN_CONSTANT_P
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined( CATCH_CONFIG_USE_BUILTIN_CONSTANT_P ) && \
|
||||||
|
!defined( CATCH_CONFIG_NO_USE_BUILTIN_CONSTANT_P )
|
||||||
|
# define CATCH_INTERNAL_IGNORE_BUT_WARN( ... ) \
|
||||||
|
(void)__builtin_constant_p( __VA_ARGS__ ) /* NOLINT(cppcoreguidelines-pro-type-vararg, \
|
||||||
|
hicpp-vararg) */
|
||||||
|
#else
|
||||||
|
# define CATCH_INTERNAL_IGNORE_BUT_WARN( ... )
|
||||||
|
#endif
|
||||||
|
|
||||||
// Even if we do not think the compiler has that warning, we still have
|
// Even if we do not think the compiler has that warning, we still have
|
||||||
// to provide a macro that can be used by the code.
|
// to provide a macro that can be used by the code.
|
||||||
#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)
|
#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)
|
||||||
@@ -486,13 +509,6 @@
|
|||||||
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS
|
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// The goal of this macro is to avoid evaluation of the arguments, but
|
|
||||||
// still have the compiler warn on problems inside...
|
|
||||||
#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN)
|
|
||||||
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
|
#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
|
||||||
# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
|
# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
|
||||||
#elif defined(__clang__) && (__clang_major__ < 5)
|
#elif defined(__clang__) && (__clang_major__ < 5)
|
||||||
@@ -555,10 +571,15 @@ namespace Catch {
|
|||||||
friend void cleanUpContext();
|
friend void cleanUpContext();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
IResultCapture* getResultCapture() const { return m_resultCapture; }
|
constexpr IResultCapture* getResultCapture() const {
|
||||||
IConfig const* getConfig() const { return m_config; }
|
return m_resultCapture;
|
||||||
void setResultCapture( IResultCapture* resultCapture );
|
}
|
||||||
void setConfig( IConfig const* config );
|
constexpr IConfig const* getConfig() const { return m_config; }
|
||||||
|
constexpr void setResultCapture( IResultCapture* resultCapture ) {
|
||||||
|
m_resultCapture = resultCapture;
|
||||||
|
}
|
||||||
|
constexpr void setConfig( IConfig const* config ) { m_config = config; }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Context& getCurrentMutableContext();
|
Context& getCurrentMutableContext();
|
||||||
@@ -669,7 +690,6 @@ namespace Catch {
|
|||||||
#define CATCH_INTERFACES_CAPTURE_HPP_INCLUDED
|
#define CATCH_INTERFACES_CAPTURE_HPP_INCLUDED
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <chrono>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -819,8 +839,10 @@ namespace Catch {
|
|||||||
|
|
||||||
}; };
|
}; };
|
||||||
|
|
||||||
bool isOk( ResultWas::OfType resultType );
|
constexpr bool isOk( ResultWas::OfType resultType ) {
|
||||||
bool isJustInfo( int flags );
|
return ( resultType & ResultWas::FailureBit ) == 0;
|
||||||
|
}
|
||||||
|
constexpr bool isJustInfo( int flags ) { return flags == ResultWas::Info; }
|
||||||
|
|
||||||
|
|
||||||
// ResultDisposition::Flags enum
|
// ResultDisposition::Flags enum
|
||||||
@@ -832,11 +854,18 @@ namespace Catch {
|
|||||||
SuppressFail = 0x08 // Failures are reported but do not fail the test
|
SuppressFail = 0x08 // Failures are reported but do not fail the test
|
||||||
}; };
|
}; };
|
||||||
|
|
||||||
ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs );
|
constexpr ResultDisposition::Flags operator|( ResultDisposition::Flags lhs,
|
||||||
|
ResultDisposition::Flags rhs ) {
|
||||||
|
return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) |
|
||||||
|
static_cast<int>( rhs ) );
|
||||||
|
}
|
||||||
|
|
||||||
bool shouldContinueOnFailure( int flags );
|
constexpr bool isFalseTest( int flags ) {
|
||||||
inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; }
|
return ( flags & ResultDisposition::FalseTest ) != 0;
|
||||||
bool shouldSuppressFailure( int flags );
|
}
|
||||||
|
constexpr bool shouldSuppressFailure( int flags ) {
|
||||||
|
return ( flags & ResultDisposition::SuppressFail ) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
@@ -1054,7 +1083,7 @@ namespace Catch {
|
|||||||
virtual void handleMessage
|
virtual void handleMessage
|
||||||
( AssertionInfo const& info,
|
( AssertionInfo const& info,
|
||||||
ResultWas::OfType resultType,
|
ResultWas::OfType resultType,
|
||||||
StringRef message,
|
std::string&& message,
|
||||||
AssertionReaction& reaction ) = 0;
|
AssertionReaction& reaction ) = 0;
|
||||||
virtual void handleUnexpectedExceptionNotThrown
|
virtual void handleUnexpectedExceptionNotThrown
|
||||||
( AssertionInfo const& info,
|
( AssertionInfo const& info,
|
||||||
@@ -1302,7 +1331,7 @@ namespace Catch {
|
|||||||
int high_mild = 0; // 1.5 to 3 times IQR above Q3
|
int high_mild = 0; // 1.5 to 3 times IQR above Q3
|
||||||
int high_severe = 0; // more than 3 times IQR above Q3
|
int high_severe = 0; // more than 3 times IQR above Q3
|
||||||
|
|
||||||
int total() const {
|
constexpr int total() const {
|
||||||
return low_severe + low_mild + high_mild + high_severe;
|
return low_severe + low_mild + high_mild + high_severe;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -3037,7 +3066,11 @@ struct ratio_string<std::milli> {
|
|||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
std::tm timeInfo = {};
|
std::tm timeInfo = {};
|
||||||
gmtime_s(&timeInfo, &converted);
|
const auto err = gmtime_s(&timeInfo, &converted);
|
||||||
|
if ( err ) {
|
||||||
|
return "gmtime from provided timepoint has failed. This "
|
||||||
|
"happens e.g. with pre-1970 dates using Microsoft libc";
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
std::tm* timeInfo = std::gmtime(&converted);
|
std::tm* timeInfo = std::gmtime(&converted);
|
||||||
#endif
|
#endif
|
||||||
@@ -3267,13 +3300,13 @@ namespace Catch {
|
|||||||
ITransientExpression const* m_transientExpression = nullptr;
|
ITransientExpression const* m_transientExpression = nullptr;
|
||||||
bool m_isNegated;
|
bool m_isNegated;
|
||||||
public:
|
public:
|
||||||
LazyExpression( bool isNegated ):
|
constexpr LazyExpression( bool isNegated ):
|
||||||
m_isNegated(isNegated)
|
m_isNegated(isNegated)
|
||||||
{}
|
{}
|
||||||
LazyExpression(LazyExpression const& other) = default;
|
constexpr LazyExpression(LazyExpression const& other) = default;
|
||||||
LazyExpression& operator = ( LazyExpression const& ) = delete;
|
LazyExpression& operator = ( LazyExpression const& ) = delete;
|
||||||
|
|
||||||
explicit operator bool() const {
|
constexpr explicit operator bool() const {
|
||||||
return m_transientExpression != nullptr;
|
return m_transientExpression != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4012,7 +4045,7 @@ namespace Catch {
|
|||||||
do { \
|
do { \
|
||||||
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \
|
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \
|
||||||
catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \
|
catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -5272,6 +5305,9 @@ namespace Catch {
|
|||||||
bool m_isBinaryExpression;
|
bool m_isBinaryExpression;
|
||||||
bool m_result;
|
bool m_result;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
~ITransientExpression() = default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
constexpr auto isBinaryExpression() const -> bool { return m_isBinaryExpression; }
|
constexpr auto isBinaryExpression() const -> bool { return m_isBinaryExpression; }
|
||||||
constexpr auto getResult() const -> bool { return m_result; }
|
constexpr auto getResult() const -> bool { return m_result; }
|
||||||
@@ -5283,17 +5319,13 @@ namespace Catch {
|
|||||||
m_result( result )
|
m_result( result )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
ITransientExpression() = default;
|
constexpr ITransientExpression( ITransientExpression const& ) = default;
|
||||||
ITransientExpression(ITransientExpression const&) = default;
|
constexpr ITransientExpression& operator=( ITransientExpression const& ) = default;
|
||||||
ITransientExpression& operator=(ITransientExpression const&) = default;
|
|
||||||
|
|
||||||
friend std::ostream& operator<<(std::ostream& out, ITransientExpression const& expr) {
|
friend std::ostream& operator<<(std::ostream& out, ITransientExpression const& expr) {
|
||||||
expr.streamReconstructedExpression(out);
|
expr.streamReconstructedExpression(out);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
|
||||||
~ITransientExpression() = default;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs );
|
void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs );
|
||||||
@@ -5602,12 +5634,12 @@ namespace Catch {
|
|||||||
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void handleExpr( ExprLhs<T> const& expr ) {
|
constexpr void handleExpr( ExprLhs<T> const& expr ) {
|
||||||
handleExpr( expr.makeUnaryExpr() );
|
handleExpr( expr.makeUnaryExpr() );
|
||||||
}
|
}
|
||||||
void handleExpr( ITransientExpression const& expr );
|
void handleExpr( ITransientExpression const& expr );
|
||||||
|
|
||||||
void handleMessage(ResultWas::OfType resultType, StringRef message);
|
void handleMessage(ResultWas::OfType resultType, std::string&& message);
|
||||||
|
|
||||||
void handleExceptionThrownAsExpected();
|
void handleExceptionThrownAsExpected();
|
||||||
void handleUnexpectedExceptionNotThrown();
|
void handleUnexpectedExceptionNotThrown();
|
||||||
@@ -5663,8 +5695,6 @@ namespace Catch {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define INTERNAL_CATCH_REACT( handler ) handler.complete();
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \
|
#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \
|
||||||
do { /* NOLINT(bugprone-infinite-loop) */ \
|
do { /* NOLINT(bugprone-infinite-loop) */ \
|
||||||
@@ -5677,7 +5707,7 @@ namespace Catch {
|
|||||||
catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); /* NOLINT(bugprone-chained-comparison) */ \
|
catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); /* NOLINT(bugprone-chained-comparison) */ \
|
||||||
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
|
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
|
||||||
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( (void)0, (false) && static_cast<const bool&>( !!(__VA_ARGS__) ) ) // the expression here is never evaluated at runtime but it forces the compiler to give it a look
|
} while( (void)0, (false) && static_cast<const bool&>( !!(__VA_ARGS__) ) ) // the expression here is never evaluated at runtime but it forces the compiler to give it a look
|
||||||
// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.
|
// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.
|
||||||
|
|
||||||
@@ -5705,7 +5735,7 @@ namespace Catch {
|
|||||||
catch( ... ) { \
|
catch( ... ) { \
|
||||||
catchAssertionHandler.handleUnexpectedInflightException(); \
|
catchAssertionHandler.handleUnexpectedInflightException(); \
|
||||||
} \
|
} \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -5726,7 +5756,7 @@ namespace Catch {
|
|||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -5750,7 +5780,7 @@ namespace Catch {
|
|||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
|
|
||||||
@@ -5774,7 +5804,7 @@ namespace Catch {
|
|||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
#endif // CATCH_CONFIG_DISABLE
|
#endif // CATCH_CONFIG_DISABLE
|
||||||
@@ -5975,7 +6005,8 @@ template<typename C>
|
|||||||
class TestInvokerAsMethod : public ITestInvoker {
|
class TestInvokerAsMethod : public ITestInvoker {
|
||||||
void (C::*m_testAsMethod)();
|
void (C::*m_testAsMethod)();
|
||||||
public:
|
public:
|
||||||
TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {}
|
constexpr TestInvokerAsMethod( void ( C::*testAsMethod )() ) noexcept:
|
||||||
|
m_testAsMethod( testAsMethod ) {}
|
||||||
|
|
||||||
void invoke() const override {
|
void invoke() const override {
|
||||||
C obj;
|
C obj;
|
||||||
@@ -5996,7 +6027,8 @@ class TestInvokerFixture : public ITestInvoker {
|
|||||||
Detail::unique_ptr<C> m_fixture = nullptr;
|
Detail::unique_ptr<C> m_fixture = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TestInvokerFixture( void ( C::*testAsMethod )() const) noexcept : m_testAsMethod( testAsMethod ) {}
|
constexpr TestInvokerFixture( void ( C::*testAsMethod )() const ) noexcept:
|
||||||
|
m_testAsMethod( testAsMethod ) {}
|
||||||
|
|
||||||
void prepareTestCase() override {
|
void prepareTestCase() override {
|
||||||
m_fixture = Detail::make_unique<C>();
|
m_fixture = Detail::make_unique<C>();
|
||||||
@@ -7136,7 +7168,7 @@ namespace Catch {
|
|||||||
TestCaseInfo* m_info;
|
TestCaseInfo* m_info;
|
||||||
ITestInvoker* m_invoker;
|
ITestInvoker* m_invoker;
|
||||||
public:
|
public:
|
||||||
TestCaseHandle(TestCaseInfo* info, ITestInvoker* invoker) :
|
constexpr TestCaseHandle(TestCaseInfo* info, ITestInvoker* invoker) :
|
||||||
m_info(info), m_invoker(invoker) {}
|
m_info(info), m_invoker(invoker) {}
|
||||||
|
|
||||||
void prepareTestCase() const {
|
void prepareTestCase() const {
|
||||||
@@ -7151,7 +7183,9 @@ namespace Catch {
|
|||||||
m_invoker->invoke();
|
m_invoker->invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
TestCaseInfo const& getTestCaseInfo() const;
|
constexpr TestCaseInfo const& getTestCaseInfo() const {
|
||||||
|
return *m_info;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Detail::unique_ptr<TestCaseInfo>
|
Detail::unique_ptr<TestCaseInfo>
|
||||||
@@ -7214,7 +7248,7 @@ namespace Catch {
|
|||||||
class ExceptionTranslator : public IExceptionTranslator {
|
class ExceptionTranslator : public IExceptionTranslator {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ExceptionTranslator( std::string(*translateFunction)( T const& ) )
|
constexpr ExceptionTranslator( std::string(*translateFunction)( T const& ) )
|
||||||
: m_translateFunction( translateFunction )
|
: m_translateFunction( translateFunction )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@@ -7315,8 +7349,8 @@ namespace Catch {
|
|||||||
#define CATCH_VERSION_MACROS_HPP_INCLUDED
|
#define CATCH_VERSION_MACROS_HPP_INCLUDED
|
||||||
|
|
||||||
#define CATCH_VERSION_MAJOR 3
|
#define CATCH_VERSION_MAJOR 3
|
||||||
#define CATCH_VERSION_MINOR 7
|
#define CATCH_VERSION_MINOR 8
|
||||||
#define CATCH_VERSION_PATCH 0
|
#define CATCH_VERSION_PATCH 1
|
||||||
|
|
||||||
#endif // CATCH_VERSION_MACROS_HPP_INCLUDED
|
#endif // CATCH_VERSION_MACROS_HPP_INCLUDED
|
||||||
|
|
||||||
@@ -8043,7 +8077,7 @@ namespace Catch {
|
|||||||
struct ExtendedMultResult {
|
struct ExtendedMultResult {
|
||||||
T upper;
|
T upper;
|
||||||
T lower;
|
T lower;
|
||||||
bool operator==( ExtendedMultResult const& rhs ) const {
|
constexpr bool operator==( ExtendedMultResult const& rhs ) const {
|
||||||
return upper == rhs.upper && lower == rhs.lower;
|
return upper == rhs.upper && lower == rhs.lower;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -8161,6 +8195,7 @@ namespace Catch {
|
|||||||
* get by simple casting ([0, ..., INT_MAX, INT_MIN, ..., -1])
|
* get by simple casting ([0, ..., INT_MAX, INT_MIN, ..., -1])
|
||||||
*/
|
*/
|
||||||
template <typename OriginalType, typename UnsignedType>
|
template <typename OriginalType, typename UnsignedType>
|
||||||
|
constexpr
|
||||||
std::enable_if_t<std::is_signed<OriginalType>::value, UnsignedType>
|
std::enable_if_t<std::is_signed<OriginalType>::value, UnsignedType>
|
||||||
transposeToNaturalOrder( UnsignedType in ) {
|
transposeToNaturalOrder( UnsignedType in ) {
|
||||||
static_assert(
|
static_assert(
|
||||||
@@ -8181,6 +8216,7 @@ namespace Catch {
|
|||||||
|
|
||||||
template <typename OriginalType,
|
template <typename OriginalType,
|
||||||
typename UnsignedType>
|
typename UnsignedType>
|
||||||
|
constexpr
|
||||||
std::enable_if_t<std::is_unsigned<OriginalType>::value, UnsignedType>
|
std::enable_if_t<std::is_unsigned<OriginalType>::value, UnsignedType>
|
||||||
transposeToNaturalOrder(UnsignedType in) {
|
transposeToNaturalOrder(UnsignedType in) {
|
||||||
static_assert(
|
static_assert(
|
||||||
@@ -8232,24 +8268,24 @@ class uniform_integer_distribution {
|
|||||||
// distribution will be reused many times and this is an optimization.
|
// distribution will be reused many times and this is an optimization.
|
||||||
UnsignedIntegerType m_rejection_threshold = 0;
|
UnsignedIntegerType m_rejection_threshold = 0;
|
||||||
|
|
||||||
UnsignedIntegerType computeDistance(IntegerType a, IntegerType b) const {
|
static constexpr UnsignedIntegerType computeDistance(IntegerType a, IntegerType b) {
|
||||||
// This overflows and returns 0 if a == 0 and b == TYPE_MAX.
|
// This overflows and returns 0 if a == 0 and b == TYPE_MAX.
|
||||||
// We handle that later when generating the number.
|
// We handle that later when generating the number.
|
||||||
return transposeTo(b) - transposeTo(a) + 1;
|
return transposeTo(b) - transposeTo(a) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UnsignedIntegerType computeRejectionThreshold(UnsignedIntegerType ab_distance) {
|
static constexpr UnsignedIntegerType computeRejectionThreshold(UnsignedIntegerType ab_distance) {
|
||||||
// distance == 0 means that we will return all possible values from
|
// distance == 0 means that we will return all possible values from
|
||||||
// the type's range, and that we shouldn't reject anything.
|
// the type's range, and that we shouldn't reject anything.
|
||||||
if ( ab_distance == 0 ) { return 0; }
|
if ( ab_distance == 0 ) { return 0; }
|
||||||
return ( ~ab_distance + 1 ) % ab_distance;
|
return ( ~ab_distance + 1 ) % ab_distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UnsignedIntegerType transposeTo(IntegerType in) {
|
static constexpr UnsignedIntegerType transposeTo(IntegerType in) {
|
||||||
return Detail::transposeToNaturalOrder<IntegerType>(
|
return Detail::transposeToNaturalOrder<IntegerType>(
|
||||||
static_cast<UnsignedIntegerType>( in ) );
|
static_cast<UnsignedIntegerType>( in ) );
|
||||||
}
|
}
|
||||||
static IntegerType transposeBack(UnsignedIntegerType in) {
|
static constexpr IntegerType transposeBack(UnsignedIntegerType in) {
|
||||||
return static_cast<IntegerType>(
|
return static_cast<IntegerType>(
|
||||||
Detail::transposeToNaturalOrder<IntegerType>(in) );
|
Detail::transposeToNaturalOrder<IntegerType>(in) );
|
||||||
}
|
}
|
||||||
@@ -8257,7 +8293,7 @@ class uniform_integer_distribution {
|
|||||||
public:
|
public:
|
||||||
using result_type = IntegerType;
|
using result_type = IntegerType;
|
||||||
|
|
||||||
uniform_integer_distribution( IntegerType a, IntegerType b ):
|
constexpr uniform_integer_distribution( IntegerType a, IntegerType b ):
|
||||||
m_a( transposeTo(a) ),
|
m_a( transposeTo(a) ),
|
||||||
m_ab_distance( computeDistance(a, b) ),
|
m_ab_distance( computeDistance(a, b) ),
|
||||||
m_rejection_threshold( computeRejectionThreshold(m_ab_distance) ) {
|
m_rejection_threshold( computeRejectionThreshold(m_ab_distance) ) {
|
||||||
@@ -8265,7 +8301,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename Generator>
|
template <typename Generator>
|
||||||
result_type operator()( Generator& g ) {
|
constexpr result_type operator()( Generator& g ) {
|
||||||
// All possible values of result_type are valid.
|
// All possible values of result_type are valid.
|
||||||
if ( m_ab_distance == 0 ) {
|
if ( m_ab_distance == 0 ) {
|
||||||
return transposeBack( Detail::fillBitsFrom<UnsignedIntegerType>( g ) );
|
return transposeBack( Detail::fillBitsFrom<UnsignedIntegerType>( g ) );
|
||||||
@@ -8283,8 +8319,8 @@ public:
|
|||||||
return transposeBack(m_a + emul.upper);
|
return transposeBack(m_a + emul.upper);
|
||||||
}
|
}
|
||||||
|
|
||||||
result_type a() const { return transposeBack(m_a); }
|
constexpr result_type a() const { return transposeBack(m_a); }
|
||||||
result_type b() const { return transposeBack(m_ab_distance + m_a - 1); }
|
constexpr result_type b() const { return transposeBack(m_ab_distance + m_a - 1); }
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
@@ -8697,7 +8733,7 @@ public:
|
|||||||
|
|
||||||
template <typename InputIterator,
|
template <typename InputIterator,
|
||||||
typename InputSentinel,
|
typename InputSentinel,
|
||||||
typename ResultType = typename std::iterator_traits<InputIterator>::value_type>
|
typename ResultType = std::remove_const_t<typename std::iterator_traits<InputIterator>::value_type>>
|
||||||
GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) {
|
GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) {
|
||||||
return GeneratorWrapper<ResultType>(Catch::Detail::make_unique<IteratorGenerator<ResultType>>(from, to));
|
return GeneratorWrapper<ResultType>(Catch::Detail::make_unique<IteratorGenerator<ResultType>>(from, to));
|
||||||
}
|
}
|
||||||
@@ -9742,6 +9778,7 @@ namespace Catch {
|
|||||||
typename Sentinel,
|
typename Sentinel,
|
||||||
typename T,
|
typename T,
|
||||||
typename Comparator>
|
typename Comparator>
|
||||||
|
constexpr
|
||||||
ForwardIter find_sentinel( ForwardIter start,
|
ForwardIter find_sentinel( ForwardIter start,
|
||||||
Sentinel sentinel,
|
Sentinel sentinel,
|
||||||
T const& value,
|
T const& value,
|
||||||
@@ -9757,6 +9794,7 @@ namespace Catch {
|
|||||||
typename Sentinel,
|
typename Sentinel,
|
||||||
typename T,
|
typename T,
|
||||||
typename Comparator>
|
typename Comparator>
|
||||||
|
constexpr
|
||||||
std::ptrdiff_t count_sentinel( ForwardIter start,
|
std::ptrdiff_t count_sentinel( ForwardIter start,
|
||||||
Sentinel sentinel,
|
Sentinel sentinel,
|
||||||
T const& value,
|
T const& value,
|
||||||
@@ -9770,6 +9808,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename ForwardIter, typename Sentinel>
|
template <typename ForwardIter, typename Sentinel>
|
||||||
|
constexpr
|
||||||
std::enable_if_t<!std::is_same<ForwardIter, Sentinel>::value,
|
std::enable_if_t<!std::is_same<ForwardIter, Sentinel>::value,
|
||||||
std::ptrdiff_t>
|
std::ptrdiff_t>
|
||||||
sentinel_distance( ForwardIter iter, const Sentinel sentinel ) {
|
sentinel_distance( ForwardIter iter, const Sentinel sentinel ) {
|
||||||
@@ -9782,8 +9821,8 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename ForwardIter>
|
template <typename ForwardIter>
|
||||||
std::ptrdiff_t sentinel_distance( ForwardIter first,
|
constexpr std::ptrdiff_t sentinel_distance( ForwardIter first,
|
||||||
ForwardIter last ) {
|
ForwardIter last ) {
|
||||||
return std::distance( first, last );
|
return std::distance( first, last );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9792,11 +9831,11 @@ namespace Catch {
|
|||||||
typename ForwardIter2,
|
typename ForwardIter2,
|
||||||
typename Sentinel2,
|
typename Sentinel2,
|
||||||
typename Comparator>
|
typename Comparator>
|
||||||
bool check_element_counts( ForwardIter1 first_1,
|
constexpr bool check_element_counts( ForwardIter1 first_1,
|
||||||
const Sentinel1 end_1,
|
const Sentinel1 end_1,
|
||||||
ForwardIter2 first_2,
|
ForwardIter2 first_2,
|
||||||
const Sentinel2 end_2,
|
const Sentinel2 end_2,
|
||||||
Comparator cmp ) {
|
Comparator cmp ) {
|
||||||
auto cursor = first_1;
|
auto cursor = first_1;
|
||||||
while ( cursor != end_1 ) {
|
while ( cursor != end_1 ) {
|
||||||
if ( find_sentinel( first_1, cursor, *cursor, cmp ) ==
|
if ( find_sentinel( first_1, cursor, *cursor, cmp ) ==
|
||||||
@@ -9826,11 +9865,11 @@ namespace Catch {
|
|||||||
typename ForwardIter2,
|
typename ForwardIter2,
|
||||||
typename Sentinel2,
|
typename Sentinel2,
|
||||||
typename Comparator>
|
typename Comparator>
|
||||||
bool is_permutation( ForwardIter1 first_1,
|
constexpr bool is_permutation( ForwardIter1 first_1,
|
||||||
const Sentinel1 end_1,
|
const Sentinel1 end_1,
|
||||||
ForwardIter2 first_2,
|
ForwardIter2 first_2,
|
||||||
const Sentinel2 end_2,
|
const Sentinel2 end_2,
|
||||||
Comparator cmp ) {
|
Comparator cmp ) {
|
||||||
// TODO: no optimization for stronger iterators, because we would also have to constrain on sentinel vs not sentinel types
|
// TODO: no optimization for stronger iterators, because we would also have to constrain on sentinel vs not sentinel types
|
||||||
// TODO: Comparator has to be "both sides", e.g. a == b => b == a
|
// TODO: Comparator has to be "both sides", e.g. a == b => b == a
|
||||||
// This skips shared prefix of the two ranges
|
// This skips shared prefix of the two ranges
|
||||||
@@ -10486,7 +10525,7 @@ namespace Catch {
|
|||||||
void handleMessage
|
void handleMessage
|
||||||
( AssertionInfo const& info,
|
( AssertionInfo const& info,
|
||||||
ResultWas::OfType resultType,
|
ResultWas::OfType resultType,
|
||||||
StringRef message,
|
std::string&& message,
|
||||||
AssertionReaction& reaction ) override;
|
AssertionReaction& reaction ) override;
|
||||||
void handleUnexpectedExceptionNotThrown
|
void handleUnexpectedExceptionNotThrown
|
||||||
( AssertionInfo const& info,
|
( AssertionInfo const& info,
|
||||||
@@ -11271,16 +11310,25 @@ namespace Catch {
|
|||||||
|
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
enum class XmlFormatting {
|
enum class XmlFormatting : std::uint8_t {
|
||||||
None = 0x00,
|
None = 0x00,
|
||||||
Indent = 0x01,
|
Indent = 0x01,
|
||||||
Newline = 0x02,
|
Newline = 0x02,
|
||||||
};
|
};
|
||||||
|
|
||||||
XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs);
|
constexpr XmlFormatting operator|( XmlFormatting lhs, XmlFormatting rhs ) {
|
||||||
XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs);
|
return static_cast<XmlFormatting>( static_cast<std::uint8_t>( lhs ) |
|
||||||
|
static_cast<std::uint8_t>( rhs ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr XmlFormatting operator&( XmlFormatting lhs, XmlFormatting rhs ) {
|
||||||
|
return static_cast<XmlFormatting>( static_cast<std::uint8_t>( lhs ) &
|
||||||
|
static_cast<std::uint8_t>( rhs ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper for XML-encoding text (escaping angle brackets, quotes, etc)
|
* Helper for XML-encoding text (escaping angle brackets, quotes, etc)
|
||||||
@@ -11292,7 +11340,9 @@ namespace Catch {
|
|||||||
public:
|
public:
|
||||||
enum ForWhat { ForTextNodes, ForAttributes };
|
enum ForWhat { ForTextNodes, ForAttributes };
|
||||||
|
|
||||||
XmlEncode( StringRef str, ForWhat forWhat = ForTextNodes );
|
constexpr XmlEncode( StringRef str, ForWhat forWhat = ForTextNodes ):
|
||||||
|
m_str( str ), m_forWhat( forWhat ) {}
|
||||||
|
|
||||||
|
|
||||||
void encodeTo( std::ostream& os ) const;
|
void encodeTo( std::ostream& os ) const;
|
||||||
|
|
||||||
@@ -11455,7 +11505,7 @@ namespace Catch {
|
|||||||
ArgT && m_arg;
|
ArgT && m_arg;
|
||||||
MatcherT const& m_matcher;
|
MatcherT const& m_matcher;
|
||||||
public:
|
public:
|
||||||
MatchExpr( ArgT && arg, MatcherT const& matcher )
|
constexpr MatchExpr( ArgT && arg, MatcherT const& matcher )
|
||||||
: ITransientExpression{ true, matcher.match( arg ) }, // not forwarding arg here on purpose
|
: ITransientExpression{ true, matcher.match( arg ) }, // not forwarding arg here on purpose
|
||||||
m_arg( CATCH_FORWARD(arg) ),
|
m_arg( CATCH_FORWARD(arg) ),
|
||||||
m_matcher( matcher )
|
m_matcher( matcher )
|
||||||
@@ -11485,7 +11535,8 @@ namespace Catch {
|
|||||||
void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher );
|
void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher );
|
||||||
|
|
||||||
template<typename ArgT, typename MatcherT>
|
template<typename ArgT, typename MatcherT>
|
||||||
auto makeMatchExpr( ArgT && arg, MatcherT const& matcher ) -> MatchExpr<ArgT, MatcherT> {
|
constexpr MatchExpr<ArgT, MatcherT>
|
||||||
|
makeMatchExpr( ArgT&& arg, MatcherT const& matcher ) {
|
||||||
return MatchExpr<ArgT, MatcherT>( CATCH_FORWARD(arg), matcher );
|
return MatchExpr<ArgT, MatcherT>( CATCH_FORWARD(arg), matcher );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11499,7 +11550,7 @@ namespace Catch {
|
|||||||
INTERNAL_CATCH_TRY { \
|
INTERNAL_CATCH_TRY { \
|
||||||
catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher ) ); \
|
catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher ) ); \
|
||||||
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
|
|
||||||
@@ -11509,7 +11560,10 @@ namespace Catch {
|
|||||||
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(exceptionType) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \
|
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(exceptionType) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \
|
||||||
if( catchAssertionHandler.allowThrows() ) \
|
if( catchAssertionHandler.allowThrows() ) \
|
||||||
try { \
|
try { \
|
||||||
|
CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
|
||||||
|
CATCH_INTERNAL_SUPPRESS_USELESS_CAST_WARNINGS \
|
||||||
static_cast<void>(__VA_ARGS__ ); \
|
static_cast<void>(__VA_ARGS__ ); \
|
||||||
|
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
|
||||||
catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
|
catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
|
||||||
} \
|
} \
|
||||||
catch( exceptionType const& ex ) { \
|
catch( exceptionType const& ex ) { \
|
||||||
@@ -11520,7 +11574,7 @@ namespace Catch {
|
|||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
|
|
||||||
@@ -12589,12 +12643,14 @@ namespace Catch {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
template <typename TargetRangeLike2, typename Equality2>
|
template <typename TargetRangeLike2, typename Equality2>
|
||||||
|
constexpr
|
||||||
RangeEqualsMatcher( TargetRangeLike2&& range,
|
RangeEqualsMatcher( TargetRangeLike2&& range,
|
||||||
Equality2&& predicate ):
|
Equality2&& predicate ):
|
||||||
m_desired( CATCH_FORWARD( range ) ),
|
m_desired( CATCH_FORWARD( range ) ),
|
||||||
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
||||||
|
|
||||||
template <typename RangeLike>
|
template <typename RangeLike>
|
||||||
|
constexpr
|
||||||
bool match( RangeLike&& rng ) const {
|
bool match( RangeLike&& rng ) const {
|
||||||
auto rng_start = begin( rng );
|
auto rng_start = begin( rng );
|
||||||
const auto rng_end = end( rng );
|
const auto rng_end = end( rng );
|
||||||
@@ -12627,12 +12683,14 @@ namespace Catch {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
template <typename TargetRangeLike2, typename Equality2>
|
template <typename TargetRangeLike2, typename Equality2>
|
||||||
|
constexpr
|
||||||
UnorderedRangeEqualsMatcher( TargetRangeLike2&& range,
|
UnorderedRangeEqualsMatcher( TargetRangeLike2&& range,
|
||||||
Equality2&& predicate ):
|
Equality2&& predicate ):
|
||||||
m_desired( CATCH_FORWARD( range ) ),
|
m_desired( CATCH_FORWARD( range ) ),
|
||||||
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
||||||
|
|
||||||
template <typename RangeLike>
|
template <typename RangeLike>
|
||||||
|
constexpr
|
||||||
bool match( RangeLike&& rng ) const {
|
bool match( RangeLike&& rng ) const {
|
||||||
using std::begin;
|
using std::begin;
|
||||||
using std::end;
|
using std::end;
|
||||||
@@ -12653,52 +12711,65 @@ namespace Catch {
|
|||||||
* Creates a matcher that checks if all elements in a range are equal
|
* Creates a matcher that checks if all elements in a range are equal
|
||||||
* to all elements in another range.
|
* to all elements in another range.
|
||||||
*
|
*
|
||||||
* Uses `std::equal_to` to do the comparison
|
* Uses the provided predicate `predicate` to do the comparisons
|
||||||
|
* (defaulting to `std::equal_to`)
|
||||||
*/
|
*/
|
||||||
template <typename RangeLike>
|
template <typename RangeLike,
|
||||||
std::enable_if_t<!Detail::is_matcher<RangeLike>::value,
|
typename Equality = decltype( std::equal_to<>{} )>
|
||||||
RangeEqualsMatcher<RangeLike, std::equal_to<>>>
|
constexpr
|
||||||
RangeEquals( RangeLike&& range ) {
|
|
||||||
return { CATCH_FORWARD( range ), std::equal_to<>{} };
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a matcher that checks if all elements in a range are equal
|
|
||||||
* to all elements in another range.
|
|
||||||
*
|
|
||||||
* Uses to provided predicate `predicate` to do the comparisons
|
|
||||||
*/
|
|
||||||
template <typename RangeLike, typename Equality>
|
|
||||||
RangeEqualsMatcher<RangeLike, Equality>
|
RangeEqualsMatcher<RangeLike, Equality>
|
||||||
RangeEquals( RangeLike&& range, Equality&& predicate ) {
|
RangeEquals( RangeLike&& range,
|
||||||
|
Equality&& predicate = std::equal_to<>{} ) {
|
||||||
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a matcher that checks if all elements in a range are equal
|
* Creates a matcher that checks if all elements in a range are equal
|
||||||
* to all elements in another range, in some permutation
|
* to all elements in an initializer list.
|
||||||
*
|
*
|
||||||
* Uses `std::equal_to` to do the comparison
|
* Uses the provided predicate `predicate` to do the comparisons
|
||||||
|
* (defaulting to `std::equal_to`)
|
||||||
*/
|
*/
|
||||||
template <typename RangeLike>
|
template <typename T,
|
||||||
std::enable_if_t<
|
typename Equality = decltype( std::equal_to<>{} )>
|
||||||
!Detail::is_matcher<RangeLike>::value,
|
constexpr
|
||||||
UnorderedRangeEqualsMatcher<RangeLike, std::equal_to<>>>
|
RangeEqualsMatcher<std::initializer_list<T>, Equality>
|
||||||
UnorderedRangeEquals( RangeLike&& range ) {
|
RangeEquals( std::initializer_list<T> range,
|
||||||
return { CATCH_FORWARD( range ), std::equal_to<>{} };
|
Equality&& predicate = std::equal_to<>{} ) {
|
||||||
|
return { range, CATCH_FORWARD( predicate ) };
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a matcher that checks if all elements in a range are equal
|
* Creates a matcher that checks if all elements in a range are equal
|
||||||
* to all elements in another range, in some permutation.
|
* to all elements in another range, in some permutation.
|
||||||
*
|
*
|
||||||
* Uses to provided predicate `predicate` to do the comparisons
|
* Uses the provided predicate `predicate` to do the comparisons
|
||||||
|
* (defaulting to `std::equal_to`)
|
||||||
*/
|
*/
|
||||||
template <typename RangeLike, typename Equality>
|
template <typename RangeLike,
|
||||||
|
typename Equality = decltype( std::equal_to<>{} )>
|
||||||
|
constexpr
|
||||||
UnorderedRangeEqualsMatcher<RangeLike, Equality>
|
UnorderedRangeEqualsMatcher<RangeLike, Equality>
|
||||||
UnorderedRangeEquals( RangeLike&& range, Equality&& predicate ) {
|
UnorderedRangeEquals( RangeLike&& range,
|
||||||
|
Equality&& predicate = std::equal_to<>{} ) {
|
||||||
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a matcher that checks if all elements in a range are equal
|
||||||
|
* to all elements in an initializer list, in some permutation.
|
||||||
|
*
|
||||||
|
* Uses the provided predicate `predicate` to do the comparisons
|
||||||
|
* (defaulting to `std::equal_to`)
|
||||||
|
*/
|
||||||
|
template <typename T,
|
||||||
|
typename Equality = decltype( std::equal_to<>{} )>
|
||||||
|
constexpr
|
||||||
|
UnorderedRangeEqualsMatcher<std::initializer_list<T>, Equality>
|
||||||
|
UnorderedRangeEquals( std::initializer_list<T> range,
|
||||||
|
Equality&& predicate = std::equal_to<>{} ) {
|
||||||
|
return { range, CATCH_FORWARD( predicate ) };
|
||||||
|
}
|
||||||
} // namespace Matchers
|
} // namespace Matchers
|
||||||
} // namespace Catch
|
} // namespace Catch
|
||||||
|
|
||||||
@@ -13869,7 +13940,7 @@ namespace Catch {
|
|||||||
: CumulativeReporterBase(CATCH_MOVE(config))
|
: CumulativeReporterBase(CATCH_MOVE(config))
|
||||||
, xml(m_stream) {
|
, xml(m_stream) {
|
||||||
m_preferences.shouldRedirectStdOut = true;
|
m_preferences.shouldRedirectStdOut = true;
|
||||||
m_preferences.shouldReportAllAssertions = true;
|
m_preferences.shouldReportAllAssertions = false;
|
||||||
m_shouldStoreSuccesfulAssertions = false;
|
m_shouldStoreSuccesfulAssertions = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,6 +15,6 @@ target_compile_features(fuzzhelper PUBLIC cxx_std_17)
|
|||||||
target_link_options(fuzzhelper PUBLIC "-fsanitize=fuzzer")
|
target_link_options(fuzzhelper PUBLIC "-fsanitize=fuzzer")
|
||||||
|
|
||||||
foreach(fuzzer TestSpecParser XmlWriter textflow)
|
foreach(fuzzer TestSpecParser XmlWriter textflow)
|
||||||
add_executable(fuzz_${fuzzer} fuzz_${fuzzer}.cpp)
|
add_executable(fuzz_${fuzzer} fuzz_${fuzzer}.cpp)
|
||||||
target_link_libraries(fuzz_${fuzzer} PRIVATE fuzzhelper)
|
target_link_libraries(fuzz_${fuzzer} PRIVATE fuzzhelper)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
project(
|
project(
|
||||||
'catch2',
|
'catch2',
|
||||||
'cpp',
|
'cpp',
|
||||||
version: '3.7.0', # CML version placeholder, don't delete
|
version: '3.8.1', # CML version placeholder, don't delete
|
||||||
license: 'BSL-1.0',
|
license: 'BSL-1.0',
|
||||||
meson_version: '>=0.54.1',
|
meson_version: '>=0.54.1',
|
||||||
)
|
)
|
||||||
|
@@ -1 +1,2 @@
|
|||||||
option('tests', type: 'boolean', value: true, description: 'Build the unit tests')
|
option('tests', type: 'boolean', value: true, description: 'Build the unit tests')
|
||||||
|
option('install', type: 'boolean', value: true, description: 'Install the library')
|
||||||
|
@@ -40,7 +40,6 @@ set(BENCHMARK_SOURCES
|
|||||||
)
|
)
|
||||||
set(BENCHMARK_FILES ${BENCHMARK_HEADERS} ${BENCHMARK_SOURCES})
|
set(BENCHMARK_FILES ${BENCHMARK_HEADERS} ${BENCHMARK_SOURCES})
|
||||||
|
|
||||||
|
|
||||||
set(IMPL_HEADERS
|
set(IMPL_HEADERS
|
||||||
"${PROJECT_BINARY_DIR}/generated-includes/catch2/catch_user_config.hpp"
|
"${PROJECT_BINARY_DIR}/generated-includes/catch2/catch_user_config.hpp"
|
||||||
${SOURCES_DIR}/catch_user_config.hpp.in
|
${SOURCES_DIR}/catch_user_config.hpp.in
|
||||||
@@ -74,6 +73,7 @@ set(IMPL_HEADERS
|
|||||||
${SOURCES_DIR}/internal/catch_compiler_capabilities.hpp
|
${SOURCES_DIR}/internal/catch_compiler_capabilities.hpp
|
||||||
${SOURCES_DIR}/internal/catch_config_android_logwrite.hpp
|
${SOURCES_DIR}/internal/catch_config_android_logwrite.hpp
|
||||||
${SOURCES_DIR}/internal/catch_config_counter.hpp
|
${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_static_analysis_support.hpp
|
||||||
${SOURCES_DIR}/internal/catch_config_uncaught_exceptions.hpp
|
${SOURCES_DIR}/internal/catch_config_uncaught_exceptions.hpp
|
||||||
${SOURCES_DIR}/internal/catch_config_wchar.hpp
|
${SOURCES_DIR}/internal/catch_config_wchar.hpp
|
||||||
@@ -194,7 +194,6 @@ set(IMPL_SOURCES
|
|||||||
${SOURCES_DIR}/internal/catch_random_seed_generation.cpp
|
${SOURCES_DIR}/internal/catch_random_seed_generation.cpp
|
||||||
${SOURCES_DIR}/internal/catch_reporter_registry.cpp
|
${SOURCES_DIR}/internal/catch_reporter_registry.cpp
|
||||||
${SOURCES_DIR}/internal/catch_reporter_spec_parser.cpp
|
${SOURCES_DIR}/internal/catch_reporter_spec_parser.cpp
|
||||||
${SOURCES_DIR}/internal/catch_result_type.cpp
|
|
||||||
${SOURCES_DIR}/internal/catch_reusable_string_stream.cpp
|
${SOURCES_DIR}/internal/catch_reusable_string_stream.cpp
|
||||||
${SOURCES_DIR}/internal/catch_run_context.cpp
|
${SOURCES_DIR}/internal/catch_run_context.cpp
|
||||||
${SOURCES_DIR}/internal/catch_section.cpp
|
${SOURCES_DIR}/internal/catch_section.cpp
|
||||||
@@ -348,25 +347,23 @@ source_group("generated headers"
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_library(Catch2 ${ALL_FILES})
|
add_library(Catch2 ${ALL_FILES})
|
||||||
if (CATCH_ENABLE_REPRODUCIBLE_BUILD)
|
if(CATCH_ENABLE_REPRODUCIBLE_BUILD)
|
||||||
add_build_reproducibility_settings(Catch2)
|
add_build_reproducibility_settings(Catch2)
|
||||||
endif()
|
endif()
|
||||||
add_library(Catch2::Catch2 ALIAS Catch2)
|
add_library(Catch2::Catch2 ALIAS Catch2)
|
||||||
|
|
||||||
if (ANDROID)
|
if(ANDROID)
|
||||||
target_link_libraries(Catch2 PRIVATE log)
|
target_link_libraries(Catch2 PRIVATE log)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set_target_properties(Catch2 PROPERTIES
|
set_target_properties(Catch2 PROPERTIES
|
||||||
DEBUG_POSTFIX "d"
|
DEBUG_POSTFIX "d"
|
||||||
VERSION ${PROJECT_VERSION}
|
VERSION ${PROJECT_VERSION}
|
||||||
SOVERSION ${PROJECT_VERSION})
|
SOVERSION ${PROJECT_VERSION}
|
||||||
|
)
|
||||||
|
|
||||||
# require C++14
|
# require C++14
|
||||||
target_compile_features(Catch2
|
target_compile_features(Catch2 PUBLIC cxx_std_14)
|
||||||
PUBLIC
|
|
||||||
cxx_std_14
|
|
||||||
)
|
|
||||||
|
|
||||||
configure_file(
|
configure_file(
|
||||||
"${SOURCES_DIR}/catch_user_config.hpp.in"
|
"${SOURCES_DIR}/catch_user_config.hpp.in"
|
||||||
@@ -382,105 +379,97 @@ target_include_directories(Catch2
|
|||||||
|
|
||||||
|
|
||||||
add_library(Catch2WithMain
|
add_library(Catch2WithMain
|
||||||
${SOURCES_DIR}/internal/catch_main.cpp
|
${SOURCES_DIR}/internal/catch_main.cpp
|
||||||
)
|
)
|
||||||
if (CATCH_ENABLE_REPRODUCIBLE_BUILD)
|
if(CATCH_ENABLE_REPRODUCIBLE_BUILD)
|
||||||
add_build_reproducibility_settings(Catch2WithMain)
|
add_build_reproducibility_settings(Catch2WithMain)
|
||||||
endif()
|
endif()
|
||||||
add_library(Catch2::Catch2WithMain ALIAS Catch2WithMain)
|
add_library(Catch2::Catch2WithMain ALIAS Catch2WithMain)
|
||||||
target_link_libraries(Catch2WithMain PUBLIC Catch2)
|
target_link_libraries(Catch2WithMain PUBLIC Catch2)
|
||||||
set_target_properties(Catch2WithMain
|
set_target_properties(Catch2WithMain
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
OUTPUT_NAME "Catch2Main"
|
OUTPUT_NAME "Catch2Main"
|
||||||
VERSION ${PROJECT_VERSION}
|
VERSION ${PROJECT_VERSION}
|
||||||
SOVERSION ${PROJECT_VERSION}
|
SOVERSION ${PROJECT_VERSION}
|
||||||
)
|
)
|
||||||
set_target_properties(Catch2WithMain PROPERTIES DEBUG_POSTFIX "d")
|
set_target_properties(Catch2WithMain PROPERTIES DEBUG_POSTFIX "d")
|
||||||
|
|
||||||
if (NOT_SUBPROJECT)
|
if(NOT_SUBPROJECT)
|
||||||
# create and install an export set for catch target as Catch2::Catch
|
# create and install an export set for catch target as Catch2::Catch
|
||||||
install(
|
install(
|
||||||
TARGETS
|
TARGETS
|
||||||
Catch2
|
Catch2
|
||||||
Catch2WithMain
|
Catch2WithMain
|
||||||
EXPORT
|
EXPORT
|
||||||
Catch2Targets
|
Catch2Targets
|
||||||
LIBRARY DESTINATION
|
LIBRARY DESTINATION
|
||||||
${CMAKE_INSTALL_LIBDIR}
|
${CMAKE_INSTALL_LIBDIR}
|
||||||
ARCHIVE DESTINATION
|
ARCHIVE DESTINATION
|
||||||
${CMAKE_INSTALL_LIBDIR}
|
${CMAKE_INSTALL_LIBDIR}
|
||||||
RUNTIME DESTINATION
|
RUNTIME DESTINATION
|
||||||
${CMAKE_INSTALL_BINDIR}
|
${CMAKE_INSTALL_BINDIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
install(
|
EXPORT
|
||||||
EXPORT
|
Catch2Targets
|
||||||
Catch2Targets
|
NAMESPACE
|
||||||
NAMESPACE
|
Catch2::
|
||||||
Catch2::
|
DESTINATION
|
||||||
DESTINATION
|
${CATCH_CMAKE_CONFIG_DESTINATION}
|
||||||
${CATCH_CMAKE_CONFIG_DESTINATION}
|
)
|
||||||
)
|
# Install the headers
|
||||||
# Install the headers
|
install(
|
||||||
install(
|
DIRECTORY
|
||||||
DIRECTORY
|
"${SOURCES_DIR}"
|
||||||
"${SOURCES_DIR}"
|
"${PROJECT_BINARY_DIR}/generated-includes/catch2" # Also install the generated header
|
||||||
"${PROJECT_BINARY_DIR}/generated-includes/catch2" # Also install the generated header
|
DESTINATION
|
||||||
DESTINATION
|
"${CMAKE_INSTALL_INCLUDEDIR}"
|
||||||
"${CMAKE_INSTALL_INCLUDEDIR}"
|
FILES_MATCHING
|
||||||
FILES_MATCHING
|
PATTERN "*.hpp"
|
||||||
PATTERN "*.hpp"
|
)
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Some tests require a full recompilation of Catch2 lib with different
|
# Some tests require a full recompilation of Catch2 lib with different
|
||||||
# compilation flags. They can link against this target to recompile all
|
# compilation flags. They can link against this target to recompile all
|
||||||
# the sources into the binary.
|
# the sources into the binary.
|
||||||
if (CATCH_BUILD_EXAMPLES OR CATCH_BUILD_EXTRA_TESTS)
|
if(CATCH_BUILD_EXAMPLES OR CATCH_BUILD_EXTRA_TESTS)
|
||||||
add_library(Catch2_buildall_interface INTERFACE)
|
add_library(Catch2_buildall_interface INTERFACE)
|
||||||
target_sources(Catch2_buildall_interface INTERFACE
|
target_sources(Catch2_buildall_interface INTERFACE
|
||||||
${ALL_FILES}
|
${ALL_FILES}
|
||||||
# Also include main entry point
|
# Also include main entry point
|
||||||
${SOURCES_DIR}/internal/catch_main.cpp
|
${SOURCES_DIR}/internal/catch_main.cpp
|
||||||
)
|
)
|
||||||
target_include_directories(Catch2_buildall_interface
|
target_include_directories(Catch2_buildall_interface
|
||||||
INTERFACE
|
INTERFACE
|
||||||
$<BUILD_INTERFACE:${SOURCES_DIR}/..>
|
$<BUILD_INTERFACE:${SOURCES_DIR}/..>
|
||||||
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/generated-includes>
|
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/generated-includes>
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||||
)
|
)
|
||||||
target_compile_definitions(Catch2_buildall_interface
|
target_compile_definitions(Catch2_buildall_interface INTERFACE CATCH_CONFIG_STATIC)
|
||||||
INTERFACE
|
target_compile_features(Catch2_buildall_interface INTERFACE cxx_std_14)
|
||||||
CATCH_CONFIG_STATIC
|
|
||||||
)
|
|
||||||
target_compile_features(Catch2_buildall_interface
|
|
||||||
INTERFACE
|
|
||||||
cxx_std_14
|
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
list(APPEND CATCH_WARNING_TARGETS Catch2 Catch2WithMain)
|
list(APPEND CATCH_WARNING_TARGETS Catch2 Catch2WithMain)
|
||||||
set(CATCH_WARNING_TARGETS ${CATCH_WARNING_TARGETS} PARENT_SCOPE)
|
set(CATCH_WARNING_TARGETS ${CATCH_WARNING_TARGETS} PARENT_SCOPE)
|
||||||
|
|
||||||
|
|
||||||
# We still do not support building dynamic library with hidden visibility
|
# 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
|
# 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.
|
# 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
|
set_target_properties(Catch2 Catch2WithMain
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
WINDOWS_EXPORT_ALL_SYMBOLS ON
|
CXX_VISIBILITY_PRESET "default"
|
||||||
|
VISIBILITY_INLINES_HIDDEN OFF
|
||||||
)
|
)
|
||||||
|
message(WARNING "Setting Catch2's visibility to default."
|
||||||
get_target_property(_VisPreset Catch2 CXX_VISIBILITY_PRESET)
|
" Hidden visibility is not supported.")
|
||||||
if (NOT MSVC AND _VisPreset STREQUAL "hidden")
|
endif()
|
||||||
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()
|
|
||||||
endif()
|
endif()
|
||||||
|
@@ -97,7 +97,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sets lambda to be used in fun *and* executes benchmark!
|
// 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) {
|
Benchmark & operator=(Fun func) {
|
||||||
auto const* cfg = getCurrentContext().getConfig();
|
auto const* cfg = getCurrentContext().getConfig();
|
||||||
if (!cfg->skipBenchmarks()) {
|
if (!cfg->skipBenchmarks()) {
|
||||||
|
@@ -19,7 +19,7 @@ namespace Catch {
|
|||||||
int high_mild = 0; // 1.5 to 3 times IQR above Q3
|
int high_mild = 0; // 1.5 to 3 times IQR above Q3
|
||||||
int high_severe = 0; // more than 3 times IQR above Q3
|
int high_severe = 0; // more than 3 times IQR above Q3
|
||||||
|
|
||||||
int total() const {
|
constexpr int total() const {
|
||||||
return low_severe + low_mild + high_mild + high_severe;
|
return low_severe + low_mild + high_mild + high_severe;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -21,8 +21,7 @@ namespace Catch {
|
|||||||
namespace Benchmark {
|
namespace Benchmark {
|
||||||
namespace Detail {
|
namespace Detail {
|
||||||
template <typename T, typename U>
|
template <typename T, typename U>
|
||||||
struct is_related
|
static constexpr bool is_related_v = std::is_same<std::decay_t<T>, std::decay_t<U>>::value;
|
||||||
: std::is_same<std::decay_t<T>, std::decay_t<U>> {};
|
|
||||||
|
|
||||||
/// We need to reinvent std::function because every piece of code that might add overhead
|
/// 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
|
/// in a measurement context needs to have consistent performance characteristics so that we
|
||||||
@@ -63,7 +62,7 @@ namespace Catch {
|
|||||||
BenchmarkFunction();
|
BenchmarkFunction();
|
||||||
|
|
||||||
template <typename Fun,
|
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)
|
BenchmarkFunction(Fun&& fun)
|
||||||
: f(new model<std::decay_t<Fun>>(CATCH_FORWARD(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_stats.hpp>
|
||||||
#include <catch2/benchmark/detail/catch_measure.hpp>
|
#include <catch2/benchmark/detail/catch_measure.hpp>
|
||||||
#include <catch2/benchmark/detail/catch_run_for_at_least.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 <catch2/internal/catch_unique_ptr.hpp>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@@ -178,7 +178,7 @@ namespace Catch {
|
|||||||
double diff = b - m;
|
double diff = b - m;
|
||||||
return a + diff * diff;
|
return a + diff * diff;
|
||||||
} ) /
|
} ) /
|
||||||
( last - first );
|
static_cast<double>( last - first );
|
||||||
return std::sqrt( variance );
|
return std::sqrt( variance );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,7 +213,7 @@ namespace Catch {
|
|||||||
double* first,
|
double* first,
|
||||||
double* last ) {
|
double* last ) {
|
||||||
auto count = last - first;
|
auto count = last - first;
|
||||||
double idx = (count - 1) * k / static_cast<double>(q);
|
double idx = static_cast<double>((count - 1) * k) / static_cast<double>(q);
|
||||||
int j = static_cast<int>(idx);
|
int j = static_cast<int>(idx);
|
||||||
double g = idx - j;
|
double g = idx - j;
|
||||||
std::nth_element(first, first + j, last);
|
std::nth_element(first, first + j, last);
|
||||||
@@ -316,10 +316,10 @@ namespace Catch {
|
|||||||
|
|
||||||
double accel = sum_cubes / ( 6 * std::pow( sum_squares, 1.5 ) );
|
double accel = sum_cubes / ( 6 * std::pow( sum_squares, 1.5 ) );
|
||||||
long n = static_cast<long>( resample.size() );
|
long n = static_cast<long>( resample.size() );
|
||||||
double prob_n =
|
double prob_n = static_cast<double>(
|
||||||
std::count_if( resample.begin(),
|
std::count_if( resample.begin(),
|
||||||
resample.end(),
|
resample.end(),
|
||||||
[point]( double x ) { return x < point; } ) /
|
[point]( double x ) { return x < point; } )) /
|
||||||
static_cast<double>( n );
|
static_cast<double>( n );
|
||||||
// degenerate case with uniform samples
|
// degenerate case with uniform samples
|
||||||
if ( Catch::Detail::directCompare( prob_n, 0. ) ) {
|
if ( Catch::Detail::directCompare( prob_n, 0. ) ) {
|
||||||
|
@@ -13,8 +13,6 @@
|
|||||||
#include <catch2/benchmark/catch_clock.hpp>
|
#include <catch2/benchmark/catch_clock.hpp>
|
||||||
#include <catch2/benchmark/detail/catch_complete_invoke.hpp>
|
#include <catch2/benchmark/detail/catch_complete_invoke.hpp>
|
||||||
|
|
||||||
#include <type_traits>
|
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
namespace Benchmark {
|
namespace Benchmark {
|
||||||
template <typename Result>
|
template <typename Result>
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression):
|
AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const& _lazyExpression):
|
||||||
lazyExpression(_lazyExpression),
|
lazyExpression(_lazyExpression),
|
||||||
resultType(_resultType) {}
|
resultType(_resultType) {}
|
||||||
|
|
||||||
|
@@ -76,7 +76,7 @@ namespace Catch {
|
|||||||
WarnAbout::What warnings = WarnAbout::Nothing;
|
WarnAbout::What warnings = WarnAbout::Nothing;
|
||||||
ShowDurations showDurations = ShowDurations::DefaultForReporter;
|
ShowDurations showDurations = ShowDurations::DefaultForReporter;
|
||||||
double minDuration = -1;
|
double minDuration = -1;
|
||||||
TestRunOrder runOrder = TestRunOrder::Declared;
|
TestRunOrder runOrder = TestRunOrder::Randomized;
|
||||||
ColourMode defaultColourMode = ColourMode::PlatformDefault;
|
ColourMode defaultColourMode = ColourMode::PlatformDefault;
|
||||||
WaitForKeypress::When waitForKeypress = WaitForKeypress::Never;
|
WaitForKeypress::When waitForKeypress = WaitForKeypress::Never;
|
||||||
|
|
||||||
|
@@ -94,7 +94,7 @@ namespace Catch {
|
|||||||
do { \
|
do { \
|
||||||
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \
|
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \
|
||||||
catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \
|
catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
@@ -25,7 +25,6 @@
|
|||||||
#include <catch2/internal/catch_stdstreams.hpp>
|
#include <catch2/internal/catch_stdstreams.hpp>
|
||||||
#include <catch2/internal/catch_istream.hpp>
|
#include <catch2/internal/catch_istream.hpp>
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
@@ -34,7 +33,13 @@
|
|||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
const int MaxExitCode = 255;
|
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) {
|
IEventListenerPtr createReporter(std::string const& reporterName, ReporterConfig&& config) {
|
||||||
auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, CATCH_MOVE(config));
|
auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, CATCH_MOVE(config));
|
||||||
@@ -198,8 +203,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int Session::applyCommandLine( int argc, char const * const * argv ) {
|
int Session::applyCommandLine( int argc, char const * const * argv ) {
|
||||||
if( m_startupExceptions )
|
if ( m_startupExceptions ) { return UnspecifiedErrorExitCode; }
|
||||||
return 1;
|
|
||||||
|
|
||||||
auto result = m_cli.parse( Clara::Args( argc, argv ) );
|
auto result = m_cli.parse( Clara::Args( argc, argv ) );
|
||||||
|
|
||||||
@@ -215,7 +219,7 @@ namespace Catch {
|
|||||||
<< TextFlow::Column( result.errorMessage() ).indent( 2 )
|
<< TextFlow::Column( result.errorMessage() ).indent( 2 )
|
||||||
<< "\n\n";
|
<< "\n\n";
|
||||||
errStream->stream() << "Run with -? for usage\n\n" << std::flush;
|
errStream->stream() << "Run with -? for usage\n\n" << std::flush;
|
||||||
return MaxExitCode;
|
return UnspecifiedErrorExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_configData.showHelp )
|
if( m_configData.showHelp )
|
||||||
@@ -285,8 +289,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int Session::runInternal() {
|
int Session::runInternal() {
|
||||||
if( m_startupExceptions )
|
if ( m_startupExceptions ) { return UnspecifiedErrorExitCode; }
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (m_configData.showHelp || m_configData.libIdentify) {
|
if (m_configData.showHelp || m_configData.libIdentify) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -297,7 +300,7 @@ namespace Catch {
|
|||||||
<< ") must be greater than the shard index ("
|
<< ") must be greater than the shard index ("
|
||||||
<< m_configData.shardIndex << ")\n"
|
<< m_configData.shardIndex << ")\n"
|
||||||
<< std::flush;
|
<< std::flush;
|
||||||
return 1;
|
return UnspecifiedErrorExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
CATCH_TRY {
|
CATCH_TRY {
|
||||||
@@ -320,7 +323,7 @@ namespace Catch {
|
|||||||
for ( auto const& spec : invalidSpecs ) {
|
for ( auto const& spec : invalidSpecs ) {
|
||||||
reporter->reportInvalidTestSpec( spec );
|
reporter->reportInvalidTestSpec( spec );
|
||||||
}
|
}
|
||||||
return 1;
|
return InvalidTestSpecExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -334,29 +337,29 @@ namespace Catch {
|
|||||||
|
|
||||||
if ( tests.hadUnmatchedTestSpecs()
|
if ( tests.hadUnmatchedTestSpecs()
|
||||||
&& m_config->warnAboutUnmatchedTestSpecs() ) {
|
&& m_config->warnAboutUnmatchedTestSpecs() ) {
|
||||||
return 3;
|
// UnmatchedTestSpecExitCode
|
||||||
|
return UnmatchedTestSpecExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( totals.testCases.total() == 0
|
if ( totals.testCases.total() == 0
|
||||||
&& !m_config->zeroTestsCountAsSuccess() ) {
|
&& !m_config->zeroTestsCountAsSuccess() ) {
|
||||||
return 2;
|
return NoTestsRunExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( totals.testCases.total() > 0 &&
|
if ( totals.testCases.total() > 0 &&
|
||||||
totals.testCases.total() == totals.testCases.skipped
|
totals.testCases.total() == totals.testCases.skipped
|
||||||
&& !m_config->zeroTestsCountAsSuccess() ) {
|
&& !m_config->zeroTestsCountAsSuccess() ) {
|
||||||
return 4;
|
return AllTestsSkippedExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note that on unices only the lower 8 bits are usually used, clamping
|
if ( totals.assertions.failed ) { return TestFailureExitCode; }
|
||||||
// the return value to 255 prevents false negative when some multiple
|
return 0;
|
||||||
// of 256 tests has failed
|
|
||||||
return (std::min) (MaxExitCode, static_cast<int>(totals.assertions.failed));
|
|
||||||
}
|
}
|
||||||
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
|
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
|
||||||
catch( std::exception& ex ) {
|
catch( std::exception& ex ) {
|
||||||
Catch::cerr() << ex.what() << '\n' << std::flush;
|
Catch::cerr() << ex.what() << '\n' << std::flush;
|
||||||
return MaxExitCode;
|
return UnspecifiedErrorExitCode;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@@ -22,26 +22,26 @@ namespace Catch {
|
|||||||
static_assert(sizeof(TestCaseProperties) == sizeof(TCP_underlying_type),
|
static_assert(sizeof(TestCaseProperties) == sizeof(TCP_underlying_type),
|
||||||
"The size of the TestCaseProperties is different from the assumed size");
|
"The size of the TestCaseProperties is different from the assumed size");
|
||||||
|
|
||||||
TestCaseProperties operator|(TestCaseProperties lhs, TestCaseProperties rhs) {
|
constexpr TestCaseProperties operator|(TestCaseProperties lhs, TestCaseProperties rhs) {
|
||||||
return static_cast<TestCaseProperties>(
|
return static_cast<TestCaseProperties>(
|
||||||
static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs)
|
static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TestCaseProperties& operator|=(TestCaseProperties& lhs, TestCaseProperties rhs) {
|
constexpr TestCaseProperties& operator|=(TestCaseProperties& lhs, TestCaseProperties rhs) {
|
||||||
lhs = static_cast<TestCaseProperties>(
|
lhs = static_cast<TestCaseProperties>(
|
||||||
static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs)
|
static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs)
|
||||||
);
|
);
|
||||||
return lhs;
|
return lhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestCaseProperties operator&(TestCaseProperties lhs, TestCaseProperties rhs) {
|
constexpr TestCaseProperties operator&(TestCaseProperties lhs, TestCaseProperties rhs) {
|
||||||
return static_cast<TestCaseProperties>(
|
return static_cast<TestCaseProperties>(
|
||||||
static_cast<TCP_underlying_type>(lhs) & static_cast<TCP_underlying_type>(rhs)
|
static_cast<TCP_underlying_type>(lhs) & static_cast<TCP_underlying_type>(rhs)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool applies(TestCaseProperties tcp) {
|
constexpr bool applies(TestCaseProperties tcp) {
|
||||||
static_assert(static_cast<TCP_underlying_type>(TestCaseProperties::None) == 0,
|
static_assert(static_cast<TCP_underlying_type>(TestCaseProperties::None) == 0,
|
||||||
"TestCaseProperties::None must be equal to 0");
|
"TestCaseProperties::None must be equal to 0");
|
||||||
return tcp != TestCaseProperties::None;
|
return tcp != TestCaseProperties::None;
|
||||||
@@ -80,7 +80,7 @@ namespace Catch {
|
|||||||
return "Anonymous test case " + std::to_string(++counter);
|
return "Anonymous test case " + std::to_string(++counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
StringRef extractFilenamePart(StringRef filename) {
|
constexpr StringRef extractFilenamePart(StringRef filename) {
|
||||||
size_t lastDot = filename.size();
|
size_t lastDot = filename.size();
|
||||||
while (lastDot > 0 && filename[lastDot - 1] != '.') {
|
while (lastDot > 0 && filename[lastDot - 1] != '.') {
|
||||||
--lastDot;
|
--lastDot;
|
||||||
@@ -98,7 +98,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Returns the upper bound on size of extra tags ([#file]+[.])
|
// Returns the upper bound on size of extra tags ([#file]+[.])
|
||||||
size_t sizeOfExtraTags(StringRef filepath) {
|
constexpr size_t sizeOfExtraTags(StringRef filepath) {
|
||||||
// [.] is 3, [#] is another 3
|
// [.] is 3, [#] is another 3
|
||||||
const size_t extras = 3 + 3;
|
const size_t extras = 3 + 3;
|
||||||
return extractFilenamePart(filepath).size() + extras;
|
return extractFilenamePart(filepath).size() + extras;
|
||||||
@@ -259,8 +259,4 @@ namespace Catch {
|
|||||||
return lhs.tags < rhs.tags;
|
return lhs.tags < rhs.tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestCaseInfo const& TestCaseHandle::getTestCaseInfo() const {
|
|
||||||
return *m_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
@@ -109,7 +109,7 @@ namespace Catch {
|
|||||||
TestCaseInfo* m_info;
|
TestCaseInfo* m_info;
|
||||||
ITestInvoker* m_invoker;
|
ITestInvoker* m_invoker;
|
||||||
public:
|
public:
|
||||||
TestCaseHandle(TestCaseInfo* info, ITestInvoker* invoker) :
|
constexpr TestCaseHandle(TestCaseInfo* info, ITestInvoker* invoker) :
|
||||||
m_info(info), m_invoker(invoker) {}
|
m_info(info), m_invoker(invoker) {}
|
||||||
|
|
||||||
void prepareTestCase() const {
|
void prepareTestCase() const {
|
||||||
@@ -124,7 +124,9 @@ namespace Catch {
|
|||||||
m_invoker->invoke();
|
m_invoker->invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
TestCaseInfo const& getTestCaseInfo() const;
|
constexpr TestCaseInfo const& getTestCaseInfo() const {
|
||||||
|
return *m_info;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Detail::unique_ptr<TestCaseInfo>
|
Detail::unique_ptr<TestCaseInfo>
|
||||||
|
@@ -13,7 +13,7 @@ namespace Catch {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
static auto getCurrentNanosecondsSinceEpoch() -> uint64_t {
|
static auto getCurrentNanosecondsSinceEpoch() -> uint64_t {
|
||||||
return std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
|
return std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
|
||||||
}
|
}
|
||||||
} // end unnamed namespace
|
} // end unnamed namespace
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ namespace Catch {
|
|||||||
return static_cast<unsigned int>(getElapsedMicroseconds()/1000);
|
return static_cast<unsigned int>(getElapsedMicroseconds()/1000);
|
||||||
}
|
}
|
||||||
auto Timer::getElapsedSeconds() const -> double {
|
auto Timer::getElapsedSeconds() const -> double {
|
||||||
return getElapsedMicroseconds()/1000000.0;
|
return static_cast<double>(getElapsedMicroseconds())/1000000.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -11,7 +11,6 @@
|
|||||||
#include <catch2/internal/catch_context.hpp>
|
#include <catch2/internal/catch_context.hpp>
|
||||||
#include <catch2/internal/catch_polyfills.hpp>
|
#include <catch2/internal/catch_polyfills.hpp>
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
@@ -22,7 +21,10 @@ namespace Detail {
|
|||||||
const int hexThreshold = 255;
|
const int hexThreshold = 255;
|
||||||
|
|
||||||
struct Endianness {
|
struct Endianness {
|
||||||
enum Arch { Big, Little };
|
enum Arch : uint8_t {
|
||||||
|
Big,
|
||||||
|
Little
|
||||||
|
};
|
||||||
|
|
||||||
static Arch which() {
|
static Arch which() {
|
||||||
int one = 1;
|
int one = 1;
|
||||||
|
@@ -64,18 +64,14 @@ namespace Catch {
|
|||||||
return rawMemoryToString( &object, sizeof(object) );
|
return rawMemoryToString( &object, sizeof(object) );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T,typename = void>
|
||||||
class IsStreamInsertable {
|
static constexpr bool IsStreamInsertable_v = false;
|
||||||
template<typename Stream, typename U>
|
|
||||||
static auto test(int)
|
|
||||||
-> decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type());
|
|
||||||
|
|
||||||
template<typename, typename>
|
template <typename T>
|
||||||
static auto test(...)->std::false_type;
|
static constexpr bool IsStreamInsertable_v<
|
||||||
|
T,
|
||||||
public:
|
decltype( void( std::declval<std::ostream&>() << std::declval<T>() ) )> =
|
||||||
static const bool value = decltype(test<std::ostream, const T&>(0))::value;
|
true;
|
||||||
};
|
|
||||||
|
|
||||||
template<typename E>
|
template<typename E>
|
||||||
std::string convertUnknownEnumToString( E e );
|
std::string convertUnknownEnumToString( E e );
|
||||||
@@ -120,7 +116,7 @@ namespace Catch {
|
|||||||
struct StringMaker {
|
struct StringMaker {
|
||||||
template <typename Fake = T>
|
template <typename Fake = T>
|
||||||
static
|
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) {
|
convert(const Fake& value) {
|
||||||
ReusableStringStream rss;
|
ReusableStringStream rss;
|
||||||
// NB: call using the function-like syntax to avoid ambiguity with
|
// NB: call using the function-like syntax to avoid ambiguity with
|
||||||
@@ -131,7 +127,7 @@ namespace Catch {
|
|||||||
|
|
||||||
template <typename Fake = T>
|
template <typename Fake = T>
|
||||||
static
|
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 ) {
|
convert( const Fake& value ) {
|
||||||
#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER)
|
#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER)
|
||||||
return Detail::convertUnstreamable(value);
|
return Detail::convertUnstreamable(value);
|
||||||
@@ -523,7 +519,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename R>
|
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 ) {
|
static std::string convert( R const& range ) {
|
||||||
return rangeToString( range );
|
return rangeToString( range );
|
||||||
}
|
}
|
||||||
@@ -634,7 +630,11 @@ struct ratio_string<std::milli> {
|
|||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
std::tm timeInfo = {};
|
std::tm timeInfo = {};
|
||||||
gmtime_s(&timeInfo, &converted);
|
const auto err = gmtime_s(&timeInfo, &converted);
|
||||||
|
if ( err ) {
|
||||||
|
return "gmtime from provided timepoint has failed. This "
|
||||||
|
"happens e.g. with pre-1970 dates using Microsoft libc";
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
std::tm* timeInfo = std::gmtime(&converted);
|
std::tm* timeInfo = std::gmtime(&converted);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -25,7 +25,7 @@ namespace Catch {
|
|||||||
class ExceptionTranslator : public IExceptionTranslator {
|
class ExceptionTranslator : public IExceptionTranslator {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ExceptionTranslator( std::string(*translateFunction)( T const& ) )
|
constexpr ExceptionTranslator( std::string(*translateFunction)( T const& ) )
|
||||||
: m_translateFunction( translateFunction )
|
: m_translateFunction( translateFunction )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
@@ -178,6 +178,15 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#cmakedefine CATCH_CONFIG_USE_BUILTIN_CONSTANT_P
|
||||||
|
#cmakedefine CATCH_CONFIG_NO_USE_BUILTIN_CONSTANT_P
|
||||||
|
|
||||||
|
#if defined( CATCH_CONFIG_USE_BUILTIN_CONSTANT_P ) && \
|
||||||
|
defined( CATCH_CONFIG_NO_USE_BUILTIN_CONSTANT_P )
|
||||||
|
# error Cannot force USE_BUILTIN_CONSTANT_P to both ON and OFF
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// ------
|
// ------
|
||||||
// Simple toggle defines
|
// Simple toggle defines
|
||||||
// their value is never used and they cannot be overridden
|
// their value is never used and they cannot be overridden
|
||||||
|
@@ -36,7 +36,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Version const& libraryVersion() {
|
Version const& libraryVersion() {
|
||||||
static Version version( 3, 7, 0, "", 0 );
|
static Version version( 3, 8, 1, "", 0 );
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
#define CATCH_VERSION_MACROS_HPP_INCLUDED
|
#define CATCH_VERSION_MACROS_HPP_INCLUDED
|
||||||
|
|
||||||
#define CATCH_VERSION_MAJOR 3
|
#define CATCH_VERSION_MAJOR 3
|
||||||
#define CATCH_VERSION_MINOR 7
|
#define CATCH_VERSION_MINOR 8
|
||||||
#define CATCH_VERSION_PATCH 0
|
#define CATCH_VERSION_PATCH 1
|
||||||
|
|
||||||
#endif // CATCH_VERSION_MACROS_HPP_INCLUDED
|
#endif // CATCH_VERSION_MACROS_HPP_INCLUDED
|
||||||
|
@@ -91,7 +91,7 @@ public:
|
|||||||
|
|
||||||
template <typename InputIterator,
|
template <typename InputIterator,
|
||||||
typename InputSentinel,
|
typename InputSentinel,
|
||||||
typename ResultType = typename std::iterator_traits<InputIterator>::value_type>
|
typename ResultType = std::remove_const_t<typename std::iterator_traits<InputIterator>::value_type>>
|
||||||
GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) {
|
GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) {
|
||||||
return GeneratorWrapper<ResultType>(Catch::Detail::make_unique<IteratorGenerator<ResultType>>(from, to));
|
return GeneratorWrapper<ResultType>(Catch::Detail::make_unique<IteratorGenerator<ResultType>>(from, to));
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,6 @@
|
|||||||
#define CATCH_INTERFACES_CAPTURE_HPP_INCLUDED
|
#define CATCH_INTERFACES_CAPTURE_HPP_INCLUDED
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <chrono>
|
|
||||||
|
|
||||||
#include <catch2/internal/catch_stringref.hpp>
|
#include <catch2/internal/catch_stringref.hpp>
|
||||||
#include <catch2/internal/catch_result_type.hpp>
|
#include <catch2/internal/catch_result_type.hpp>
|
||||||
@@ -77,7 +76,7 @@ namespace Catch {
|
|||||||
virtual void handleMessage
|
virtual void handleMessage
|
||||||
( AssertionInfo const& info,
|
( AssertionInfo const& info,
|
||||||
ResultWas::OfType resultType,
|
ResultWas::OfType resultType,
|
||||||
StringRef message,
|
std::string&& message,
|
||||||
AssertionReaction& reaction ) = 0;
|
AssertionReaction& reaction ) = 0;
|
||||||
virtual void handleUnexpectedExceptionNotThrown
|
virtual void handleUnexpectedExceptionNotThrown
|
||||||
( AssertionInfo const& info,
|
( AssertionInfo const& info,
|
||||||
|
@@ -12,7 +12,6 @@
|
|||||||
#include <catch2/internal/catch_stringref.hpp>
|
#include <catch2/internal/catch_stringref.hpp>
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <iosfwd>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@@ -20,7 +20,6 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <iosfwd>
|
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
|
@@ -28,8 +28,8 @@ namespace Catch {
|
|||||||
void AssertionHandler::handleExpr( ITransientExpression const& expr ) {
|
void AssertionHandler::handleExpr( ITransientExpression const& expr ) {
|
||||||
m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction );
|
m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction );
|
||||||
}
|
}
|
||||||
void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef message) {
|
void AssertionHandler::handleMessage(ResultWas::OfType resultType, std::string&& message) {
|
||||||
m_resultCapture.handleMessage( m_assertionInfo, resultType, message, m_reaction );
|
m_resultCapture.handleMessage( m_assertionInfo, resultType, CATCH_MOVE(message), m_reaction );
|
||||||
}
|
}
|
||||||
|
|
||||||
auto AssertionHandler::allowThrows() const -> bool {
|
auto AssertionHandler::allowThrows() const -> bool {
|
||||||
|
@@ -42,12 +42,12 @@ namespace Catch {
|
|||||||
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void handleExpr( ExprLhs<T> const& expr ) {
|
constexpr void handleExpr( ExprLhs<T> const& expr ) {
|
||||||
handleExpr( expr.makeUnaryExpr() );
|
handleExpr( expr.makeUnaryExpr() );
|
||||||
}
|
}
|
||||||
void handleExpr( ITransientExpression const& expr );
|
void handleExpr( ITransientExpression const& expr );
|
||||||
|
|
||||||
void handleMessage(ResultWas::OfType resultType, StringRef message);
|
void handleMessage(ResultWas::OfType resultType, std::string&& message);
|
||||||
|
|
||||||
void handleExceptionThrownAsExpected();
|
void handleExceptionThrownAsExpected();
|
||||||
void handleUnexpectedExceptionNotThrown();
|
void handleUnexpectedExceptionNotThrown();
|
||||||
|
@@ -76,7 +76,7 @@ namespace Catch {
|
|||||||
{ TokenType::Argument,
|
{ TokenType::Argument,
|
||||||
next.substr( delimiterPos + 1, next.size() ) } );
|
next.substr( delimiterPos + 1, next.size() ) } );
|
||||||
} else {
|
} else {
|
||||||
if ( next[1] != '-' && next.size() > 2 ) {
|
if ( next.size() > 1 && next[1] != '-' && next.size() > 2 ) {
|
||||||
// Combined short args, e.g. "-ab" for "-a -b"
|
// Combined short args, e.g. "-ab" for "-a -b"
|
||||||
for ( size_t i = 1; i < next.size(); ++i ) {
|
for ( size_t i = 1; i < next.size(); ++i ) {
|
||||||
m_tokenBuffer.push_back(
|
m_tokenBuffer.push_back(
|
||||||
|
@@ -62,7 +62,7 @@
|
|||||||
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \
|
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \
|
||||||
_Pragma( "GCC diagnostic ignored \"-Wshadow\"" )
|
_Pragma( "GCC diagnostic ignored \"-Wshadow\"" )
|
||||||
|
|
||||||
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)
|
# define CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -86,14 +86,45 @@
|
|||||||
// clang-cl defines _MSC_VER as well as __clang__, which could cause the
|
// clang-cl defines _MSC_VER as well as __clang__, which could cause the
|
||||||
// start/stop internal suppression macros to be double defined.
|
// start/stop internal suppression macros to be double defined.
|
||||||
#if defined(__clang__) && !defined(_MSC_VER)
|
#if defined(__clang__) && !defined(_MSC_VER)
|
||||||
|
# define CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P
|
||||||
# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )
|
# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )
|
||||||
# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" )
|
# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" )
|
||||||
|
|
||||||
#endif // __clang__ && !_MSC_VER
|
#endif // __clang__ && !_MSC_VER
|
||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wunused-variable\"" )
|
||||||
|
|
||||||
|
# if (__clang_major__ >= 20)
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wvariadic-macro-arguments-omitted\"" )
|
||||||
|
# elif (__clang_major__ == 19)
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wc++20-extensions\"" )
|
||||||
|
# else
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" )
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wunused-template\"" )
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_COMMA_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wcomma\"" )
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \
|
||||||
|
_Pragma( "clang diagnostic ignored \"-Wshadow\"" )
|
||||||
|
|
||||||
|
#endif // __clang__
|
||||||
|
|
||||||
// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug
|
// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug
|
||||||
// which results in calls to destructors being emitted for each temporary,
|
// which results in calls to destructors being emitted for each temporary,
|
||||||
// without a matching initialization. In practice, this can result in something
|
// without a matching initialization. In practice, this can result in something
|
||||||
@@ -110,35 +141,11 @@
|
|||||||
// https://developer.nvidia.com/nvidia_bug/3321845.
|
// https://developer.nvidia.com/nvidia_bug/3321845.
|
||||||
//
|
//
|
||||||
// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
|
// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
|
||||||
# if !defined(__ibmxl__) && !defined(__CUDACC__) && !defined( __NVCOMPILER )
|
#if defined( __ibmxl__ ) || defined( __CUDACC__ ) || defined( __NVCOMPILER )
|
||||||
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */
|
# define CATCH_INTERNAL_CONFIG_NO_USE_BUILTIN_CONSTANT_P
|
||||||
# endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wunused-variable\"" )
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" )
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wunused-template\"" )
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_COMMA_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wcomma\"" )
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \
|
|
||||||
_Pragma( "clang diagnostic ignored \"-Wshadow\"" )
|
|
||||||
|
|
||||||
#endif // __clang__
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// We know some environments not to support full POSIX signals
|
// We know some environments not to support full POSIX signals
|
||||||
@@ -362,6 +369,22 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// The goal of this macro is to avoid evaluation of the arguments, but
|
||||||
|
// still have the compiler warn on problems inside...
|
||||||
|
#if defined( CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P ) && \
|
||||||
|
!defined( CATCH_INTERNAL_CONFIG_NO_USE_BUILTIN_CONSTANT_P ) && !defined(CATCH_CONFIG_USE_BUILTIN_CONSTANT_P)
|
||||||
|
#define CATCH_CONFIG_USE_BUILTIN_CONSTANT_P
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined( CATCH_CONFIG_USE_BUILTIN_CONSTANT_P ) && \
|
||||||
|
!defined( CATCH_CONFIG_NO_USE_BUILTIN_CONSTANT_P )
|
||||||
|
# define CATCH_INTERNAL_IGNORE_BUT_WARN( ... ) \
|
||||||
|
(void)__builtin_constant_p( __VA_ARGS__ ) /* NOLINT(cppcoreguidelines-pro-type-vararg, \
|
||||||
|
hicpp-vararg) */
|
||||||
|
#else
|
||||||
|
# define CATCH_INTERNAL_IGNORE_BUT_WARN( ... )
|
||||||
|
#endif
|
||||||
|
|
||||||
// Even if we do not think the compiler has that warning, we still have
|
// Even if we do not think the compiler has that warning, we still have
|
||||||
// to provide a macro that can be used by the code.
|
// to provide a macro that can be used by the code.
|
||||||
#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)
|
#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)
|
||||||
@@ -398,13 +421,6 @@
|
|||||||
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS
|
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// The goal of this macro is to avoid evaluation of the arguments, but
|
|
||||||
// still have the compiler warn on problems inside...
|
|
||||||
#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN)
|
|
||||||
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
|
#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
|
||||||
# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
|
# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
|
||||||
#elif defined(__clang__) && (__clang_major__ < 5)
|
#elif defined(__clang__) && (__clang_major__ < 5)
|
||||||
|
@@ -161,7 +161,7 @@ namespace {
|
|||||||
#endif // Windows/ ANSI/ None
|
#endif // Windows/ ANSI/ None
|
||||||
|
|
||||||
|
|
||||||
#if defined( CATCH_PLATFORM_LINUX ) || defined( CATCH_PLATFORM_MAC )
|
#if defined( CATCH_PLATFORM_LINUX ) || defined( CATCH_PLATFORM_MAC ) || defined( __GLIBC__ )
|
||||||
# define CATCH_INTERNAL_HAS_ISATTY
|
# define CATCH_INTERNAL_HAS_ISATTY
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
@@ -27,12 +27,6 @@ namespace Catch {
|
|||||||
return *Context::currentContext;
|
return *Context::currentContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Context::setResultCapture( IResultCapture* resultCapture ) {
|
|
||||||
m_resultCapture = resultCapture;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Context::setConfig( IConfig const* config ) { m_config = config; }
|
|
||||||
|
|
||||||
SimplePcg32& sharedRng() {
|
SimplePcg32& sharedRng() {
|
||||||
static SimplePcg32 s_rng;
|
static SimplePcg32 s_rng;
|
||||||
return s_rng;
|
return s_rng;
|
||||||
|
@@ -26,10 +26,15 @@ namespace Catch {
|
|||||||
friend void cleanUpContext();
|
friend void cleanUpContext();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
IResultCapture* getResultCapture() const { return m_resultCapture; }
|
constexpr IResultCapture* getResultCapture() const {
|
||||||
IConfig const* getConfig() const { return m_config; }
|
return m_resultCapture;
|
||||||
void setResultCapture( IResultCapture* resultCapture );
|
}
|
||||||
void setConfig( IConfig const* config );
|
constexpr IConfig const* getConfig() const { return m_config; }
|
||||||
|
constexpr void setResultCapture( IResultCapture* resultCapture ) {
|
||||||
|
m_resultCapture = resultCapture;
|
||||||
|
}
|
||||||
|
constexpr void setConfig( IConfig const* config ) { m_config = config; }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Context& getCurrentMutableContext();
|
Context& getCurrentMutableContext();
|
||||||
|
@@ -45,7 +45,7 @@
|
|||||||
* when the compiler handles `ExprLhs<T> == b`, it also tries to resolve
|
* when the compiler handles `ExprLhs<T> == b`, it also tries to resolve
|
||||||
* the overload set for `b == ExprLhs<T>`.
|
* the overload set for `b == ExprLhs<T>`.
|
||||||
*
|
*
|
||||||
* To accomodate these use cases, decomposer ended up rather complex.
|
* To accommodate these use cases, decomposer ended up rather complex.
|
||||||
*
|
*
|
||||||
* 1) These types are handled by adding SFINAE overloads to our comparison
|
* 1) These types are handled by adding SFINAE overloads to our comparison
|
||||||
* operators, checking whether `T == U` are comparable with the given
|
* operators, checking whether `T == U` are comparable with the given
|
||||||
@@ -157,10 +157,13 @@ namespace Catch {
|
|||||||
bool m_isBinaryExpression;
|
bool m_isBinaryExpression;
|
||||||
bool m_result;
|
bool m_result;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
~ITransientExpression() = default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
constexpr auto isBinaryExpression() const -> bool { return m_isBinaryExpression; }
|
constexpr auto isBinaryExpression() const -> bool { return m_isBinaryExpression; }
|
||||||
constexpr auto getResult() const -> bool { return m_result; }
|
constexpr auto getResult() const -> bool { return m_result; }
|
||||||
//! This function **has** to be overriden by the derived class.
|
//! This function **has** to be overridden by the derived class.
|
||||||
virtual void streamReconstructedExpression( std::ostream& os ) const;
|
virtual void streamReconstructedExpression( std::ostream& os ) const;
|
||||||
|
|
||||||
constexpr ITransientExpression( bool isBinaryExpression, bool result )
|
constexpr ITransientExpression( bool isBinaryExpression, bool result )
|
||||||
@@ -168,17 +171,13 @@ namespace Catch {
|
|||||||
m_result( result )
|
m_result( result )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
ITransientExpression() = default;
|
constexpr ITransientExpression( ITransientExpression const& ) = default;
|
||||||
ITransientExpression(ITransientExpression const&) = default;
|
constexpr ITransientExpression& operator=( ITransientExpression const& ) = default;
|
||||||
ITransientExpression& operator=(ITransientExpression const&) = default;
|
|
||||||
|
|
||||||
friend std::ostream& operator<<(std::ostream& out, ITransientExpression const& expr) {
|
friend std::ostream& operator<<(std::ostream& out, ITransientExpression const& expr) {
|
||||||
expr.streamReconstructedExpression(out);
|
expr.streamReconstructedExpression(out);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
|
||||||
~ITransientExpression() = default;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs );
|
void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs );
|
||||||
|
@@ -12,7 +12,7 @@
|
|||||||
#include <catch2/internal/catch_compiler_capabilities.hpp>
|
#include <catch2/internal/catch_compiler_capabilities.hpp>
|
||||||
#include <catch2/internal/catch_reusable_string_stream.hpp>
|
#include <catch2/internal/catch_reusable_string_stream.hpp>
|
||||||
|
|
||||||
#include <exception>
|
#include <exception> // for `std::exception` in no-exception configuration
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
|
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
|
||||||
|
@@ -11,7 +11,6 @@
|
|||||||
#include <catch2/interfaces/catch_interfaces_exception.hpp>
|
#include <catch2/interfaces/catch_interfaces_exception.hpp>
|
||||||
#include <catch2/internal/catch_unique_ptr.hpp>
|
#include <catch2/internal/catch_unique_ptr.hpp>
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
@@ -8,8 +8,8 @@
|
|||||||
#ifndef CATCH_IS_PERMUTATION_HPP_INCLUDED
|
#ifndef CATCH_IS_PERMUTATION_HPP_INCLUDED
|
||||||
#define CATCH_IS_PERMUTATION_HPP_INCLUDED
|
#define CATCH_IS_PERMUTATION_HPP_INCLUDED
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
namespace Detail {
|
namespace Detail {
|
||||||
@@ -18,6 +18,7 @@ namespace Catch {
|
|||||||
typename Sentinel,
|
typename Sentinel,
|
||||||
typename T,
|
typename T,
|
||||||
typename Comparator>
|
typename Comparator>
|
||||||
|
constexpr
|
||||||
ForwardIter find_sentinel( ForwardIter start,
|
ForwardIter find_sentinel( ForwardIter start,
|
||||||
Sentinel sentinel,
|
Sentinel sentinel,
|
||||||
T const& value,
|
T const& value,
|
||||||
@@ -33,6 +34,7 @@ namespace Catch {
|
|||||||
typename Sentinel,
|
typename Sentinel,
|
||||||
typename T,
|
typename T,
|
||||||
typename Comparator>
|
typename Comparator>
|
||||||
|
constexpr
|
||||||
std::ptrdiff_t count_sentinel( ForwardIter start,
|
std::ptrdiff_t count_sentinel( ForwardIter start,
|
||||||
Sentinel sentinel,
|
Sentinel sentinel,
|
||||||
T const& value,
|
T const& value,
|
||||||
@@ -46,6 +48,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename ForwardIter, typename Sentinel>
|
template <typename ForwardIter, typename Sentinel>
|
||||||
|
constexpr
|
||||||
std::enable_if_t<!std::is_same<ForwardIter, Sentinel>::value,
|
std::enable_if_t<!std::is_same<ForwardIter, Sentinel>::value,
|
||||||
std::ptrdiff_t>
|
std::ptrdiff_t>
|
||||||
sentinel_distance( ForwardIter iter, const Sentinel sentinel ) {
|
sentinel_distance( ForwardIter iter, const Sentinel sentinel ) {
|
||||||
@@ -58,8 +61,8 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename ForwardIter>
|
template <typename ForwardIter>
|
||||||
std::ptrdiff_t sentinel_distance( ForwardIter first,
|
constexpr std::ptrdiff_t sentinel_distance( ForwardIter first,
|
||||||
ForwardIter last ) {
|
ForwardIter last ) {
|
||||||
return std::distance( first, last );
|
return std::distance( first, last );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,11 +71,11 @@ namespace Catch {
|
|||||||
typename ForwardIter2,
|
typename ForwardIter2,
|
||||||
typename Sentinel2,
|
typename Sentinel2,
|
||||||
typename Comparator>
|
typename Comparator>
|
||||||
bool check_element_counts( ForwardIter1 first_1,
|
constexpr bool check_element_counts( ForwardIter1 first_1,
|
||||||
const Sentinel1 end_1,
|
const Sentinel1 end_1,
|
||||||
ForwardIter2 first_2,
|
ForwardIter2 first_2,
|
||||||
const Sentinel2 end_2,
|
const Sentinel2 end_2,
|
||||||
Comparator cmp ) {
|
Comparator cmp ) {
|
||||||
auto cursor = first_1;
|
auto cursor = first_1;
|
||||||
while ( cursor != end_1 ) {
|
while ( cursor != end_1 ) {
|
||||||
if ( find_sentinel( first_1, cursor, *cursor, cmp ) ==
|
if ( find_sentinel( first_1, cursor, *cursor, cmp ) ==
|
||||||
@@ -102,11 +105,11 @@ namespace Catch {
|
|||||||
typename ForwardIter2,
|
typename ForwardIter2,
|
||||||
typename Sentinel2,
|
typename Sentinel2,
|
||||||
typename Comparator>
|
typename Comparator>
|
||||||
bool is_permutation( ForwardIter1 first_1,
|
constexpr bool is_permutation( ForwardIter1 first_1,
|
||||||
const Sentinel1 end_1,
|
const Sentinel1 end_1,
|
||||||
ForwardIter2 first_2,
|
ForwardIter2 first_2,
|
||||||
const Sentinel2 end_2,
|
const Sentinel2 end_2,
|
||||||
Comparator cmp ) {
|
Comparator cmp ) {
|
||||||
// TODO: no optimization for stronger iterators, because we would also have to constrain on sentinel vs not sentinel types
|
// TODO: no optimization for stronger iterators, because we would also have to constrain on sentinel vs not sentinel types
|
||||||
// TODO: Comparator has to be "both sides", e.g. a == b => b == a
|
// TODO: Comparator has to be "both sides", e.g. a == b => b == a
|
||||||
// This skips shared prefix of the two ranges
|
// This skips shared prefix of the two ranges
|
||||||
|
@@ -14,8 +14,6 @@
|
|||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
|
@@ -12,8 +12,6 @@
|
|||||||
#include <catch2/internal/catch_unique_ptr.hpp>
|
#include <catch2/internal/catch_unique_ptr.hpp>
|
||||||
|
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
#include <cstddef>
|
|
||||||
#include <ostream>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
@@ -22,13 +22,13 @@ namespace Catch {
|
|||||||
ITransientExpression const* m_transientExpression = nullptr;
|
ITransientExpression const* m_transientExpression = nullptr;
|
||||||
bool m_isNegated;
|
bool m_isNegated;
|
||||||
public:
|
public:
|
||||||
LazyExpression( bool isNegated ):
|
constexpr LazyExpression( bool isNegated ):
|
||||||
m_isNegated(isNegated)
|
m_isNegated(isNegated)
|
||||||
{}
|
{}
|
||||||
LazyExpression(LazyExpression const& other) = default;
|
constexpr LazyExpression(LazyExpression const& other) = default;
|
||||||
LazyExpression& operator = ( LazyExpression const& ) = delete;
|
LazyExpression& operator = ( LazyExpression const& ) = delete;
|
||||||
|
|
||||||
explicit operator bool() const {
|
constexpr explicit operator bool() const {
|
||||||
return m_transientExpression != nullptr;
|
return m_transientExpression != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -69,7 +69,7 @@ namespace Catch {
|
|||||||
struct ExtendedMultResult {
|
struct ExtendedMultResult {
|
||||||
T upper;
|
T upper;
|
||||||
T lower;
|
T lower;
|
||||||
bool operator==( ExtendedMultResult const& rhs ) const {
|
constexpr bool operator==( ExtendedMultResult const& rhs ) const {
|
||||||
return upper == rhs.upper && lower == rhs.lower;
|
return upper == rhs.upper && lower == rhs.lower;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -187,6 +187,7 @@ namespace Catch {
|
|||||||
* get by simple casting ([0, ..., INT_MAX, INT_MIN, ..., -1])
|
* get by simple casting ([0, ..., INT_MAX, INT_MIN, ..., -1])
|
||||||
*/
|
*/
|
||||||
template <typename OriginalType, typename UnsignedType>
|
template <typename OriginalType, typename UnsignedType>
|
||||||
|
constexpr
|
||||||
std::enable_if_t<std::is_signed<OriginalType>::value, UnsignedType>
|
std::enable_if_t<std::is_signed<OriginalType>::value, UnsignedType>
|
||||||
transposeToNaturalOrder( UnsignedType in ) {
|
transposeToNaturalOrder( UnsignedType in ) {
|
||||||
static_assert(
|
static_assert(
|
||||||
@@ -207,6 +208,7 @@ namespace Catch {
|
|||||||
|
|
||||||
template <typename OriginalType,
|
template <typename OriginalType,
|
||||||
typename UnsignedType>
|
typename UnsignedType>
|
||||||
|
constexpr
|
||||||
std::enable_if_t<std::is_unsigned<OriginalType>::value, UnsignedType>
|
std::enable_if_t<std::is_unsigned<OriginalType>::value, UnsignedType>
|
||||||
transposeToNaturalOrder(UnsignedType in) {
|
transposeToNaturalOrder(UnsignedType in) {
|
||||||
static_assert(
|
static_assert(
|
||||||
|
@@ -52,7 +52,7 @@ namespace {
|
|||||||
SimplePcg32::result_type SimplePcg32::operator()() {
|
SimplePcg32::result_type SimplePcg32::operator()() {
|
||||||
// prepare the output value
|
// prepare the output value
|
||||||
const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u);
|
const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u);
|
||||||
const auto output = rotate_right(xorshifted, m_state >> 59u);
|
const auto output = rotate_right(xorshifted, static_cast<uint32_t>(m_state >> 59u));
|
||||||
|
|
||||||
// advance state
|
// advance state
|
||||||
m_state = m_state * 6364136223846793005ULL + s_inc;
|
m_state = m_state * 6364136223846793005ULL + s_inc;
|
||||||
|
@@ -1,26 +0,0 @@
|
|||||||
|
|
||||||
// Copyright Catch2 Authors
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE.txt or copy at
|
|
||||||
// https://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
|
||||||
#include <catch2/internal/catch_result_type.hpp>
|
|
||||||
|
|
||||||
namespace Catch {
|
|
||||||
|
|
||||||
bool isOk( ResultWas::OfType resultType ) {
|
|
||||||
return ( resultType & ResultWas::FailureBit ) == 0;
|
|
||||||
}
|
|
||||||
bool isJustInfo( int flags ) {
|
|
||||||
return flags == ResultWas::Info;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) {
|
|
||||||
return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; }
|
|
||||||
bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; }
|
|
||||||
|
|
||||||
} // end namespace Catch
|
|
@@ -33,8 +33,10 @@ namespace Catch {
|
|||||||
|
|
||||||
}; };
|
}; };
|
||||||
|
|
||||||
bool isOk( ResultWas::OfType resultType );
|
constexpr bool isOk( ResultWas::OfType resultType ) {
|
||||||
bool isJustInfo( int flags );
|
return ( resultType & ResultWas::FailureBit ) == 0;
|
||||||
|
}
|
||||||
|
constexpr bool isJustInfo( int flags ) { return flags == ResultWas::Info; }
|
||||||
|
|
||||||
|
|
||||||
// ResultDisposition::Flags enum
|
// ResultDisposition::Flags enum
|
||||||
@@ -46,11 +48,18 @@ namespace Catch {
|
|||||||
SuppressFail = 0x08 // Failures are reported but do not fail the test
|
SuppressFail = 0x08 // Failures are reported but do not fail the test
|
||||||
}; };
|
}; };
|
||||||
|
|
||||||
ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs );
|
constexpr ResultDisposition::Flags operator|( ResultDisposition::Flags lhs,
|
||||||
|
ResultDisposition::Flags rhs ) {
|
||||||
|
return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) |
|
||||||
|
static_cast<int>( rhs ) );
|
||||||
|
}
|
||||||
|
|
||||||
bool shouldContinueOnFailure( int flags );
|
constexpr bool isFalseTest( int flags ) {
|
||||||
inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; }
|
return ( flags & ResultDisposition::FalseTest ) != 0;
|
||||||
bool shouldSuppressFailure( int flags );
|
}
|
||||||
|
constexpr bool shouldSuppressFailure( int flags ) {
|
||||||
|
return ( flags & ResultDisposition::SuppressFail ) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
|
@@ -361,7 +361,7 @@ namespace Catch {
|
|||||||
auto& currentTracker = m_trackerContext.currentTracker();
|
auto& currentTracker = m_trackerContext.currentTracker();
|
||||||
assert(
|
assert(
|
||||||
currentTracker.nameAndLocation() != nameAndLoc &&
|
currentTracker.nameAndLocation() != nameAndLoc &&
|
||||||
"Trying to create tracker for a genreator that already has one" );
|
"Trying to create tracker for a generator that already has one" );
|
||||||
|
|
||||||
auto newTracker = Catch::Detail::make_unique<Generators::GeneratorTracker>(
|
auto newTracker = Catch::Detail::make_unique<Generators::GeneratorTracker>(
|
||||||
CATCH_MOVE(nameAndLoc), m_trackerContext, ¤tTracker );
|
CATCH_MOVE(nameAndLoc), m_trackerContext, ¤tTracker );
|
||||||
@@ -632,13 +632,13 @@ namespace Catch {
|
|||||||
void RunContext::handleMessage(
|
void RunContext::handleMessage(
|
||||||
AssertionInfo const& info,
|
AssertionInfo const& info,
|
||||||
ResultWas::OfType resultType,
|
ResultWas::OfType resultType,
|
||||||
StringRef message,
|
std::string&& message,
|
||||||
AssertionReaction& reaction
|
AssertionReaction& reaction
|
||||||
) {
|
) {
|
||||||
m_lastAssertionInfo = info;
|
m_lastAssertionInfo = info;
|
||||||
|
|
||||||
AssertionResultData data( resultType, LazyExpression( false ) );
|
AssertionResultData data( resultType, LazyExpression( false ) );
|
||||||
data.message = static_cast<std::string>(message);
|
data.message = CATCH_MOVE( message );
|
||||||
AssertionResult assertionResult{ m_lastAssertionInfo,
|
AssertionResult assertionResult{ m_lastAssertionInfo,
|
||||||
CATCH_MOVE( data ) };
|
CATCH_MOVE( data ) };
|
||||||
|
|
||||||
|
@@ -55,7 +55,7 @@ namespace Catch {
|
|||||||
void handleMessage
|
void handleMessage
|
||||||
( AssertionInfo const& info,
|
( AssertionInfo const& info,
|
||||||
ResultWas::OfType resultType,
|
ResultWas::OfType resultType,
|
||||||
StringRef message,
|
std::string&& message,
|
||||||
AssertionReaction& reaction ) override;
|
AssertionReaction& reaction ) override;
|
||||||
void handleUnexpectedExceptionNotThrown
|
void handleUnexpectedExceptionNotThrown
|
||||||
( AssertionInfo const& info,
|
( AssertionInfo const& info,
|
||||||
|
@@ -62,7 +62,7 @@ namespace Catch {
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
// These section definitions imply that at most one section at one level
|
// These section definitions imply that at most one section at one level
|
||||||
// will be intered (because only one section's __LINE__ can be equal to
|
// will be entered (because only one section's __LINE__ can be equal to
|
||||||
// the dummy `catchInternalSectionHint` variable from `TEST_CASE`).
|
// the dummy `catchInternalSectionHint` variable from `TEST_CASE`).
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
@@ -9,7 +9,6 @@
|
|||||||
#define CATCH_SHARDING_HPP_INCLUDED
|
#define CATCH_SHARDING_HPP_INCLUDED
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cmath>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
@@ -74,7 +74,7 @@ namespace Catch {
|
|||||||
std::string origStr = CATCH_MOVE(str);
|
std::string origStr = CATCH_MOVE(str);
|
||||||
str.clear();
|
str.clear();
|
||||||
// There is at least one replacement, so reserve with the best guess
|
// There is at least one replacement, so reserve with the best guess
|
||||||
// we can make without actually counting the number of occurences.
|
// we can make without actually counting the number of occurrences.
|
||||||
str.reserve(origStr.size() - replaceThis.size() + withThis.size());
|
str.reserve(origStr.size() - replaceThis.size() + withThis.size());
|
||||||
do {
|
do {
|
||||||
str.append(origStr, copyBegin, i-copyBegin );
|
str.append(origStr, copyBegin, i-copyBegin );
|
||||||
|
@@ -10,7 +10,6 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cstdint>
|
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
StringRef::StringRef( char const* rawChars ) noexcept
|
StringRef::StringRef( char const* rawChars ) noexcept
|
||||||
|
@@ -38,8 +38,6 @@
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define INTERNAL_CATCH_REACT( handler ) handler.complete();
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \
|
#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \
|
||||||
do { /* NOLINT(bugprone-infinite-loop) */ \
|
do { /* NOLINT(bugprone-infinite-loop) */ \
|
||||||
@@ -52,7 +50,7 @@
|
|||||||
catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); /* NOLINT(bugprone-chained-comparison) */ \
|
catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); /* NOLINT(bugprone-chained-comparison) */ \
|
||||||
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
|
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
|
||||||
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( (void)0, (false) && static_cast<const bool&>( !!(__VA_ARGS__) ) ) // the expression here is never evaluated at runtime but it forces the compiler to give it a look
|
} while( (void)0, (false) && static_cast<const bool&>( !!(__VA_ARGS__) ) ) // the expression here is never evaluated at runtime but it forces the compiler to give it a look
|
||||||
// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.
|
// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.
|
||||||
|
|
||||||
@@ -80,7 +78,7 @@
|
|||||||
catch( ... ) { \
|
catch( ... ) { \
|
||||||
catchAssertionHandler.handleUnexpectedInflightException(); \
|
catchAssertionHandler.handleUnexpectedInflightException(); \
|
||||||
} \
|
} \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -101,7 +99,7 @@
|
|||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -125,7 +123,7 @@
|
|||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
|
|
||||||
@@ -149,7 +147,7 @@
|
|||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
#endif // CATCH_CONFIG_DISABLE
|
#endif // CATCH_CONFIG_DISABLE
|
||||||
|
@@ -54,7 +54,7 @@ namespace Catch {
|
|||||||
TestType m_testAsFunction;
|
TestType m_testAsFunction;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TestInvokerAsFunction( TestType testAsFunction ) noexcept:
|
constexpr TestInvokerAsFunction( TestType testAsFunction ) noexcept:
|
||||||
m_testAsFunction( testAsFunction ) {}
|
m_testAsFunction( testAsFunction ) {}
|
||||||
|
|
||||||
void invoke() const override { m_testAsFunction(); }
|
void invoke() const override { m_testAsFunction(); }
|
||||||
|
@@ -32,7 +32,8 @@ template<typename C>
|
|||||||
class TestInvokerAsMethod : public ITestInvoker {
|
class TestInvokerAsMethod : public ITestInvoker {
|
||||||
void (C::*m_testAsMethod)();
|
void (C::*m_testAsMethod)();
|
||||||
public:
|
public:
|
||||||
TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {}
|
constexpr TestInvokerAsMethod( void ( C::*testAsMethod )() ) noexcept:
|
||||||
|
m_testAsMethod( testAsMethod ) {}
|
||||||
|
|
||||||
void invoke() const override {
|
void invoke() const override {
|
||||||
C obj;
|
C obj;
|
||||||
@@ -53,7 +54,8 @@ class TestInvokerFixture : public ITestInvoker {
|
|||||||
Detail::unique_ptr<C> m_fixture = nullptr;
|
Detail::unique_ptr<C> m_fixture = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TestInvokerFixture( void ( C::*testAsMethod )() const) noexcept : m_testAsMethod( testAsMethod ) {}
|
constexpr TestInvokerFixture( void ( C::*testAsMethod )() const ) noexcept:
|
||||||
|
m_testAsMethod( testAsMethod ) {}
|
||||||
|
|
||||||
void prepareTestCase() override {
|
void prepareTestCase() override {
|
||||||
m_fixture = Detail::make_unique<C>();
|
m_fixture = Detail::make_unique<C>();
|
||||||
|
@@ -48,24 +48,24 @@ class uniform_integer_distribution {
|
|||||||
// distribution will be reused many times and this is an optimization.
|
// distribution will be reused many times and this is an optimization.
|
||||||
UnsignedIntegerType m_rejection_threshold = 0;
|
UnsignedIntegerType m_rejection_threshold = 0;
|
||||||
|
|
||||||
UnsignedIntegerType computeDistance(IntegerType a, IntegerType b) const {
|
static constexpr UnsignedIntegerType computeDistance(IntegerType a, IntegerType b) {
|
||||||
// This overflows and returns 0 if a == 0 and b == TYPE_MAX.
|
// This overflows and returns 0 if a == 0 and b == TYPE_MAX.
|
||||||
// We handle that later when generating the number.
|
// We handle that later when generating the number.
|
||||||
return transposeTo(b) - transposeTo(a) + 1;
|
return transposeTo(b) - transposeTo(a) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UnsignedIntegerType computeRejectionThreshold(UnsignedIntegerType ab_distance) {
|
static constexpr UnsignedIntegerType computeRejectionThreshold(UnsignedIntegerType ab_distance) {
|
||||||
// distance == 0 means that we will return all possible values from
|
// distance == 0 means that we will return all possible values from
|
||||||
// the type's range, and that we shouldn't reject anything.
|
// the type's range, and that we shouldn't reject anything.
|
||||||
if ( ab_distance == 0 ) { return 0; }
|
if ( ab_distance == 0 ) { return 0; }
|
||||||
return ( ~ab_distance + 1 ) % ab_distance;
|
return ( ~ab_distance + 1 ) % ab_distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UnsignedIntegerType transposeTo(IntegerType in) {
|
static constexpr UnsignedIntegerType transposeTo(IntegerType in) {
|
||||||
return Detail::transposeToNaturalOrder<IntegerType>(
|
return Detail::transposeToNaturalOrder<IntegerType>(
|
||||||
static_cast<UnsignedIntegerType>( in ) );
|
static_cast<UnsignedIntegerType>( in ) );
|
||||||
}
|
}
|
||||||
static IntegerType transposeBack(UnsignedIntegerType in) {
|
static constexpr IntegerType transposeBack(UnsignedIntegerType in) {
|
||||||
return static_cast<IntegerType>(
|
return static_cast<IntegerType>(
|
||||||
Detail::transposeToNaturalOrder<IntegerType>(in) );
|
Detail::transposeToNaturalOrder<IntegerType>(in) );
|
||||||
}
|
}
|
||||||
@@ -73,7 +73,7 @@ class uniform_integer_distribution {
|
|||||||
public:
|
public:
|
||||||
using result_type = IntegerType;
|
using result_type = IntegerType;
|
||||||
|
|
||||||
uniform_integer_distribution( IntegerType a, IntegerType b ):
|
constexpr uniform_integer_distribution( IntegerType a, IntegerType b ):
|
||||||
m_a( transposeTo(a) ),
|
m_a( transposeTo(a) ),
|
||||||
m_ab_distance( computeDistance(a, b) ),
|
m_ab_distance( computeDistance(a, b) ),
|
||||||
m_rejection_threshold( computeRejectionThreshold(m_ab_distance) ) {
|
m_rejection_threshold( computeRejectionThreshold(m_ab_distance) ) {
|
||||||
@@ -81,7 +81,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename Generator>
|
template <typename Generator>
|
||||||
result_type operator()( Generator& g ) {
|
constexpr result_type operator()( Generator& g ) {
|
||||||
// All possible values of result_type are valid.
|
// All possible values of result_type are valid.
|
||||||
if ( m_ab_distance == 0 ) {
|
if ( m_ab_distance == 0 ) {
|
||||||
return transposeBack( Detail::fillBitsFrom<UnsignedIntegerType>( g ) );
|
return transposeBack( Detail::fillBitsFrom<UnsignedIntegerType>( g ) );
|
||||||
@@ -99,8 +99,8 @@ public:
|
|||||||
return transposeBack(m_a + emul.upper);
|
return transposeBack(m_a + emul.upper);
|
||||||
}
|
}
|
||||||
|
|
||||||
result_type a() const { return transposeBack(m_a); }
|
constexpr result_type a() const { return transposeBack(m_a); }
|
||||||
result_type b() const { return transposeBack(m_ab_distance + m_a - 1); }
|
constexpr result_type b() const { return transposeBack(m_ab_distance + m_a - 1); }
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
@@ -53,36 +53,16 @@ namespace {
|
|||||||
os.flags(f);
|
os.flags(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldNewline(XmlFormatting fmt) {
|
constexpr bool shouldNewline(XmlFormatting fmt) {
|
||||||
return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Newline));
|
return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Newline));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldIndent(XmlFormatting fmt) {
|
constexpr bool shouldIndent(XmlFormatting fmt) {
|
||||||
return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Indent));
|
return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Indent));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs) {
|
|
||||||
return static_cast<XmlFormatting>(
|
|
||||||
static_cast<std::underlying_type_t<XmlFormatting>>(lhs) |
|
|
||||||
static_cast<std::underlying_type_t<XmlFormatting>>(rhs)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs) {
|
|
||||||
return static_cast<XmlFormatting>(
|
|
||||||
static_cast<std::underlying_type_t<XmlFormatting>>(lhs) &
|
|
||||||
static_cast<std::underlying_type_t<XmlFormatting>>(rhs)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
XmlEncode::XmlEncode( StringRef str, ForWhat forWhat )
|
|
||||||
: m_str( str ),
|
|
||||||
m_forWhat( forWhat )
|
|
||||||
{}
|
|
||||||
|
|
||||||
void XmlEncode::encodeTo( std::ostream& os ) const {
|
void XmlEncode::encodeTo( std::ostream& os ) const {
|
||||||
// Apostrophe escaping not necessary if we always use " to write attributes
|
// Apostrophe escaping not necessary if we always use " to write attributes
|
||||||
// (see: http://www.w3.org/TR/xml/#syntax)
|
// (see: http://www.w3.org/TR/xml/#syntax)
|
||||||
|
@@ -13,16 +13,25 @@
|
|||||||
|
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
enum class XmlFormatting {
|
enum class XmlFormatting : std::uint8_t {
|
||||||
None = 0x00,
|
None = 0x00,
|
||||||
Indent = 0x01,
|
Indent = 0x01,
|
||||||
Newline = 0x02,
|
Newline = 0x02,
|
||||||
};
|
};
|
||||||
|
|
||||||
XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs);
|
constexpr XmlFormatting operator|( XmlFormatting lhs, XmlFormatting rhs ) {
|
||||||
XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs);
|
return static_cast<XmlFormatting>( static_cast<std::uint8_t>( lhs ) |
|
||||||
|
static_cast<std::uint8_t>( rhs ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr XmlFormatting operator&( XmlFormatting lhs, XmlFormatting rhs ) {
|
||||||
|
return static_cast<XmlFormatting>( static_cast<std::uint8_t>( lhs ) &
|
||||||
|
static_cast<std::uint8_t>( rhs ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper for XML-encoding text (escaping angle brackets, quotes, etc)
|
* Helper for XML-encoding text (escaping angle brackets, quotes, etc)
|
||||||
@@ -34,7 +43,9 @@ namespace Catch {
|
|||||||
public:
|
public:
|
||||||
enum ForWhat { ForTextNodes, ForAttributes };
|
enum ForWhat { ForTextNodes, ForAttributes };
|
||||||
|
|
||||||
XmlEncode( StringRef str, ForWhat forWhat = ForTextNodes );
|
constexpr XmlEncode( StringRef str, ForWhat forWhat = ForTextNodes ):
|
||||||
|
m_str( str ), m_forWhat( forWhat ) {}
|
||||||
|
|
||||||
|
|
||||||
void encodeTo( std::ostream& os ) const;
|
void encodeTo( std::ostream& os ) const;
|
||||||
|
|
||||||
|
@@ -79,7 +79,7 @@ namespace Catch {
|
|||||||
//! Creates a matcher that accepts ranges/containers with specific size
|
//! Creates a matcher that accepts ranges/containers with specific size
|
||||||
HasSizeMatcher SizeIs(std::size_t sz);
|
HasSizeMatcher SizeIs(std::size_t sz);
|
||||||
template <typename Matcher>
|
template <typename Matcher>
|
||||||
std::enable_if_t<Detail::is_matcher<Matcher>::value,
|
std::enable_if_t<Detail::is_matcher_v<Matcher>,
|
||||||
SizeMatchesMatcher<Matcher>> SizeIs(Matcher&& m) {
|
SizeMatchesMatcher<Matcher>> SizeIs(Matcher&& m) {
|
||||||
return SizeMatchesMatcher<Matcher>{CATCH_FORWARD(m)};
|
return SizeMatchesMatcher<Matcher>{CATCH_FORWARD(m)};
|
||||||
}
|
}
|
||||||
|
@@ -11,8 +11,8 @@
|
|||||||
#include <catch2/matchers/catch_matchers_templated.hpp>
|
#include <catch2/matchers/catch_matchers_templated.hpp>
|
||||||
#include <catch2/internal/catch_move_and_forward.hpp>
|
#include <catch2/internal/catch_move_and_forward.hpp>
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
namespace Matchers {
|
namespace Matchers {
|
||||||
@@ -74,14 +74,14 @@ namespace Catch {
|
|||||||
* Uses `std::equal_to` to do the comparison
|
* Uses `std::equal_to` to do the comparison
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
std::enable_if_t<!Detail::is_matcher<T>::value,
|
std::enable_if_t<!Detail::is_matcher_v<T>,
|
||||||
ContainsElementMatcher<T, std::equal_to<>>> Contains(T&& elem) {
|
ContainsElementMatcher<T, std::equal_to<>>> Contains(T&& elem) {
|
||||||
return { CATCH_FORWARD(elem), std::equal_to<>{} };
|
return { CATCH_FORWARD(elem), std::equal_to<>{} };
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Creates a matcher that checks whether a range contains element matching a matcher
|
//! Creates a matcher that checks whether a range contains element matching a matcher
|
||||||
template <typename Matcher>
|
template <typename Matcher>
|
||||||
std::enable_if_t<Detail::is_matcher<Matcher>::value,
|
std::enable_if_t<Detail::is_matcher_v<Matcher>,
|
||||||
ContainsMatcherMatcher<Matcher>> Contains(Matcher&& matcher) {
|
ContainsMatcherMatcher<Matcher>> Contains(Matcher&& matcher) {
|
||||||
return { CATCH_FORWARD(matcher) };
|
return { CATCH_FORWARD(matcher) };
|
||||||
}
|
}
|
||||||
|
@@ -11,8 +11,7 @@
|
|||||||
#include <catch2/internal/catch_is_permutation.hpp>
|
#include <catch2/internal/catch_is_permutation.hpp>
|
||||||
#include <catch2/matchers/catch_matchers_templated.hpp>
|
#include <catch2/matchers/catch_matchers_templated.hpp>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <functional>
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
namespace Matchers {
|
namespace Matchers {
|
||||||
@@ -28,12 +27,14 @@ namespace Catch {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
template <typename TargetRangeLike2, typename Equality2>
|
template <typename TargetRangeLike2, typename Equality2>
|
||||||
|
constexpr
|
||||||
RangeEqualsMatcher( TargetRangeLike2&& range,
|
RangeEqualsMatcher( TargetRangeLike2&& range,
|
||||||
Equality2&& predicate ):
|
Equality2&& predicate ):
|
||||||
m_desired( CATCH_FORWARD( range ) ),
|
m_desired( CATCH_FORWARD( range ) ),
|
||||||
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
||||||
|
|
||||||
template <typename RangeLike>
|
template <typename RangeLike>
|
||||||
|
constexpr
|
||||||
bool match( RangeLike&& rng ) const {
|
bool match( RangeLike&& rng ) const {
|
||||||
auto rng_start = begin( rng );
|
auto rng_start = begin( rng );
|
||||||
const auto rng_end = end( rng );
|
const auto rng_end = end( rng );
|
||||||
@@ -66,12 +67,14 @@ namespace Catch {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
template <typename TargetRangeLike2, typename Equality2>
|
template <typename TargetRangeLike2, typename Equality2>
|
||||||
|
constexpr
|
||||||
UnorderedRangeEqualsMatcher( TargetRangeLike2&& range,
|
UnorderedRangeEqualsMatcher( TargetRangeLike2&& range,
|
||||||
Equality2&& predicate ):
|
Equality2&& predicate ):
|
||||||
m_desired( CATCH_FORWARD( range ) ),
|
m_desired( CATCH_FORWARD( range ) ),
|
||||||
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
||||||
|
|
||||||
template <typename RangeLike>
|
template <typename RangeLike>
|
||||||
|
constexpr
|
||||||
bool match( RangeLike&& rng ) const {
|
bool match( RangeLike&& rng ) const {
|
||||||
using std::begin;
|
using std::begin;
|
||||||
using std::end;
|
using std::end;
|
||||||
@@ -92,52 +95,65 @@ namespace Catch {
|
|||||||
* Creates a matcher that checks if all elements in a range are equal
|
* Creates a matcher that checks if all elements in a range are equal
|
||||||
* to all elements in another range.
|
* to all elements in another range.
|
||||||
*
|
*
|
||||||
* Uses `std::equal_to` to do the comparison
|
* Uses the provided predicate `predicate` to do the comparisons
|
||||||
|
* (defaulting to `std::equal_to`)
|
||||||
*/
|
*/
|
||||||
template <typename RangeLike>
|
template <typename RangeLike,
|
||||||
std::enable_if_t<!Detail::is_matcher<RangeLike>::value,
|
typename Equality = decltype( std::equal_to<>{} )>
|
||||||
RangeEqualsMatcher<RangeLike, std::equal_to<>>>
|
constexpr
|
||||||
RangeEquals( RangeLike&& range ) {
|
|
||||||
return { CATCH_FORWARD( range ), std::equal_to<>{} };
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a matcher that checks if all elements in a range are equal
|
|
||||||
* to all elements in another range.
|
|
||||||
*
|
|
||||||
* Uses to provided predicate `predicate` to do the comparisons
|
|
||||||
*/
|
|
||||||
template <typename RangeLike, typename Equality>
|
|
||||||
RangeEqualsMatcher<RangeLike, Equality>
|
RangeEqualsMatcher<RangeLike, Equality>
|
||||||
RangeEquals( RangeLike&& range, Equality&& predicate ) {
|
RangeEquals( RangeLike&& range,
|
||||||
|
Equality&& predicate = std::equal_to<>{} ) {
|
||||||
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a matcher that checks if all elements in a range are equal
|
* Creates a matcher that checks if all elements in a range are equal
|
||||||
* to all elements in another range, in some permutation
|
* to all elements in an initializer list.
|
||||||
*
|
*
|
||||||
* Uses `std::equal_to` to do the comparison
|
* Uses the provided predicate `predicate` to do the comparisons
|
||||||
|
* (defaulting to `std::equal_to`)
|
||||||
*/
|
*/
|
||||||
template <typename RangeLike>
|
template <typename T,
|
||||||
std::enable_if_t<
|
typename Equality = decltype( std::equal_to<>{} )>
|
||||||
!Detail::is_matcher<RangeLike>::value,
|
constexpr
|
||||||
UnorderedRangeEqualsMatcher<RangeLike, std::equal_to<>>>
|
RangeEqualsMatcher<std::initializer_list<T>, Equality>
|
||||||
UnorderedRangeEquals( RangeLike&& range ) {
|
RangeEquals( std::initializer_list<T> range,
|
||||||
return { CATCH_FORWARD( range ), std::equal_to<>{} };
|
Equality&& predicate = std::equal_to<>{} ) {
|
||||||
|
return { range, CATCH_FORWARD( predicate ) };
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a matcher that checks if all elements in a range are equal
|
* Creates a matcher that checks if all elements in a range are equal
|
||||||
* to all elements in another range, in some permutation.
|
* to all elements in another range, in some permutation.
|
||||||
*
|
*
|
||||||
* Uses to provided predicate `predicate` to do the comparisons
|
* Uses the provided predicate `predicate` to do the comparisons
|
||||||
|
* (defaulting to `std::equal_to`)
|
||||||
*/
|
*/
|
||||||
template <typename RangeLike, typename Equality>
|
template <typename RangeLike,
|
||||||
|
typename Equality = decltype( std::equal_to<>{} )>
|
||||||
|
constexpr
|
||||||
UnorderedRangeEqualsMatcher<RangeLike, Equality>
|
UnorderedRangeEqualsMatcher<RangeLike, Equality>
|
||||||
UnorderedRangeEquals( RangeLike&& range, Equality&& predicate ) {
|
UnorderedRangeEquals( RangeLike&& range,
|
||||||
|
Equality&& predicate = std::equal_to<>{} ) {
|
||||||
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a matcher that checks if all elements in a range are equal
|
||||||
|
* to all elements in an initializer list, in some permutation.
|
||||||
|
*
|
||||||
|
* Uses the provided predicate `predicate` to do the comparisons
|
||||||
|
* (defaulting to `std::equal_to`)
|
||||||
|
*/
|
||||||
|
template <typename T,
|
||||||
|
typename Equality = decltype( std::equal_to<>{} )>
|
||||||
|
constexpr
|
||||||
|
UnorderedRangeEqualsMatcher<std::initializer_list<T>, Equality>
|
||||||
|
UnorderedRangeEquals( std::initializer_list<T> range,
|
||||||
|
Equality&& predicate = std::equal_to<>{} ) {
|
||||||
|
return { range, CATCH_FORWARD( predicate ) };
|
||||||
|
}
|
||||||
} // namespace Matchers
|
} // namespace Matchers
|
||||||
} // namespace Catch
|
} // namespace Catch
|
||||||
|
|
||||||
|
@@ -58,19 +58,19 @@ namespace Matchers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using is_generic_matcher = std::is_base_of<
|
static constexpr bool is_generic_matcher_v = std::is_base_of<
|
||||||
Catch::Matchers::MatcherGenericBase,
|
Catch::Matchers::MatcherGenericBase,
|
||||||
std::remove_cv_t<std::remove_reference_t<T>>
|
std::remove_cv_t<std::remove_reference_t<T>>
|
||||||
>;
|
>::value;
|
||||||
|
|
||||||
template<typename... Ts>
|
template<typename... Ts>
|
||||||
using are_generic_matchers = Catch::Detail::conjunction<is_generic_matcher<Ts>...>;
|
static constexpr bool are_generic_matchers_v = Catch::Detail::conjunction<std::integral_constant<bool,is_generic_matcher_v<Ts>>...>::value;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using is_matcher = std::is_base_of<
|
static constexpr bool is_matcher_v = std::is_base_of<
|
||||||
Catch::Matchers::MatcherUntypedBase,
|
Catch::Matchers::MatcherUntypedBase,
|
||||||
std::remove_cv_t<std::remove_reference_t<T>>
|
std::remove_cv_t<std::remove_reference_t<T>>
|
||||||
>;
|
>::value;
|
||||||
|
|
||||||
|
|
||||||
template<std::size_t N, typename Arg>
|
template<std::size_t N, typename Arg>
|
||||||
@@ -143,7 +143,7 @@ namespace Matchers {
|
|||||||
|
|
||||||
//! Avoids type nesting for `GenericAllOf && some matcher` case
|
//! Avoids type nesting for `GenericAllOf && some matcher` case
|
||||||
template<typename MatcherRHS>
|
template<typename MatcherRHS>
|
||||||
friend std::enable_if_t<is_matcher<MatcherRHS>::value,
|
friend std::enable_if_t<is_matcher_v<MatcherRHS>,
|
||||||
MatchAllOfGeneric<MatcherTs..., MatcherRHS>> operator && (
|
MatchAllOfGeneric<MatcherTs..., MatcherRHS>> operator && (
|
||||||
MatchAllOfGeneric<MatcherTs...>&& lhs,
|
MatchAllOfGeneric<MatcherTs...>&& lhs,
|
||||||
MatcherRHS const& rhs) {
|
MatcherRHS const& rhs) {
|
||||||
@@ -152,7 +152,7 @@ namespace Matchers {
|
|||||||
|
|
||||||
//! Avoids type nesting for `some matcher && GenericAllOf` case
|
//! Avoids type nesting for `some matcher && GenericAllOf` case
|
||||||
template<typename MatcherLHS>
|
template<typename MatcherLHS>
|
||||||
friend std::enable_if_t<is_matcher<MatcherLHS>::value,
|
friend std::enable_if_t<is_matcher_v<MatcherLHS>,
|
||||||
MatchAllOfGeneric<MatcherLHS, MatcherTs...>> operator && (
|
MatchAllOfGeneric<MatcherLHS, MatcherTs...>> operator && (
|
||||||
MatcherLHS const& lhs,
|
MatcherLHS const& lhs,
|
||||||
MatchAllOfGeneric<MatcherTs...>&& rhs) {
|
MatchAllOfGeneric<MatcherTs...>&& rhs) {
|
||||||
@@ -197,7 +197,7 @@ namespace Matchers {
|
|||||||
|
|
||||||
//! Avoids type nesting for `GenericAnyOf || some matcher` case
|
//! Avoids type nesting for `GenericAnyOf || some matcher` case
|
||||||
template<typename MatcherRHS>
|
template<typename MatcherRHS>
|
||||||
friend std::enable_if_t<is_matcher<MatcherRHS>::value,
|
friend std::enable_if_t<is_matcher_v<MatcherRHS>,
|
||||||
MatchAnyOfGeneric<MatcherTs..., MatcherRHS>> operator || (
|
MatchAnyOfGeneric<MatcherTs..., MatcherRHS>> operator || (
|
||||||
MatchAnyOfGeneric<MatcherTs...>&& lhs,
|
MatchAnyOfGeneric<MatcherTs...>&& lhs,
|
||||||
MatcherRHS const& rhs) {
|
MatcherRHS const& rhs) {
|
||||||
@@ -206,7 +206,7 @@ namespace Matchers {
|
|||||||
|
|
||||||
//! Avoids type nesting for `some matcher || GenericAnyOf` case
|
//! Avoids type nesting for `some matcher || GenericAnyOf` case
|
||||||
template<typename MatcherLHS>
|
template<typename MatcherLHS>
|
||||||
friend std::enable_if_t<is_matcher<MatcherLHS>::value,
|
friend std::enable_if_t<is_matcher_v<MatcherLHS>,
|
||||||
MatchAnyOfGeneric<MatcherLHS, MatcherTs...>> operator || (
|
MatchAnyOfGeneric<MatcherLHS, MatcherTs...>> operator || (
|
||||||
MatcherLHS const& lhs,
|
MatcherLHS const& lhs,
|
||||||
MatchAnyOfGeneric<MatcherTs...>&& rhs) {
|
MatchAnyOfGeneric<MatcherTs...>&& rhs) {
|
||||||
@@ -246,20 +246,20 @@ namespace Matchers {
|
|||||||
|
|
||||||
// compose only generic matchers
|
// compose only generic matchers
|
||||||
template<typename MatcherLHS, typename MatcherRHS>
|
template<typename MatcherLHS, typename MatcherRHS>
|
||||||
std::enable_if_t<Detail::are_generic_matchers<MatcherLHS, MatcherRHS>::value, Detail::MatchAllOfGeneric<MatcherLHS, MatcherRHS>>
|
std::enable_if_t<Detail::are_generic_matchers_v<MatcherLHS, MatcherRHS>, Detail::MatchAllOfGeneric<MatcherLHS, MatcherRHS>>
|
||||||
operator && (MatcherLHS const& lhs, MatcherRHS const& rhs) {
|
operator && (MatcherLHS const& lhs, MatcherRHS const& rhs) {
|
||||||
return { lhs, rhs };
|
return { lhs, rhs };
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatcherLHS, typename MatcherRHS>
|
template<typename MatcherLHS, typename MatcherRHS>
|
||||||
std::enable_if_t<Detail::are_generic_matchers<MatcherLHS, MatcherRHS>::value, Detail::MatchAnyOfGeneric<MatcherLHS, MatcherRHS>>
|
std::enable_if_t<Detail::are_generic_matchers_v<MatcherLHS, MatcherRHS>, Detail::MatchAnyOfGeneric<MatcherLHS, MatcherRHS>>
|
||||||
operator || (MatcherLHS const& lhs, MatcherRHS const& rhs) {
|
operator || (MatcherLHS const& lhs, MatcherRHS const& rhs) {
|
||||||
return { lhs, rhs };
|
return { lhs, rhs };
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Wrap provided generic matcher in generic negator
|
//! Wrap provided generic matcher in generic negator
|
||||||
template<typename MatcherT>
|
template<typename MatcherT>
|
||||||
std::enable_if_t<Detail::is_generic_matcher<MatcherT>::value, Detail::MatchNotOfGeneric<MatcherT>>
|
std::enable_if_t<Detail::is_generic_matcher_v<MatcherT>, Detail::MatchNotOfGeneric<MatcherT>>
|
||||||
operator ! (MatcherT const& matcher) {
|
operator ! (MatcherT const& matcher) {
|
||||||
return Detail::MatchNotOfGeneric<MatcherT>{matcher};
|
return Detail::MatchNotOfGeneric<MatcherT>{matcher};
|
||||||
}
|
}
|
||||||
@@ -267,25 +267,25 @@ namespace Matchers {
|
|||||||
|
|
||||||
// compose mixed generic and non-generic matchers
|
// compose mixed generic and non-generic matchers
|
||||||
template<typename MatcherLHS, typename ArgRHS>
|
template<typename MatcherLHS, typename ArgRHS>
|
||||||
std::enable_if_t<Detail::is_generic_matcher<MatcherLHS>::value, Detail::MatchAllOfGeneric<MatcherLHS, MatcherBase<ArgRHS>>>
|
std::enable_if_t<Detail::is_generic_matcher_v<MatcherLHS>, Detail::MatchAllOfGeneric<MatcherLHS, MatcherBase<ArgRHS>>>
|
||||||
operator && (MatcherLHS const& lhs, MatcherBase<ArgRHS> const& rhs) {
|
operator && (MatcherLHS const& lhs, MatcherBase<ArgRHS> const& rhs) {
|
||||||
return { lhs, rhs };
|
return { lhs, rhs };
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ArgLHS, typename MatcherRHS>
|
template<typename ArgLHS, typename MatcherRHS>
|
||||||
std::enable_if_t<Detail::is_generic_matcher<MatcherRHS>::value, Detail::MatchAllOfGeneric<MatcherBase<ArgLHS>, MatcherRHS>>
|
std::enable_if_t<Detail::is_generic_matcher_v<MatcherRHS>, Detail::MatchAllOfGeneric<MatcherBase<ArgLHS>, MatcherRHS>>
|
||||||
operator && (MatcherBase<ArgLHS> const& lhs, MatcherRHS const& rhs) {
|
operator && (MatcherBase<ArgLHS> const& lhs, MatcherRHS const& rhs) {
|
||||||
return { lhs, rhs };
|
return { lhs, rhs };
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatcherLHS, typename ArgRHS>
|
template<typename MatcherLHS, typename ArgRHS>
|
||||||
std::enable_if_t<Detail::is_generic_matcher<MatcherLHS>::value, Detail::MatchAnyOfGeneric<MatcherLHS, MatcherBase<ArgRHS>>>
|
std::enable_if_t<Detail::is_generic_matcher_v<MatcherLHS>, Detail::MatchAnyOfGeneric<MatcherLHS, MatcherBase<ArgRHS>>>
|
||||||
operator || (MatcherLHS const& lhs, MatcherBase<ArgRHS> const& rhs) {
|
operator || (MatcherLHS const& lhs, MatcherBase<ArgRHS> const& rhs) {
|
||||||
return { lhs, rhs };
|
return { lhs, rhs };
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ArgLHS, typename MatcherRHS>
|
template<typename ArgLHS, typename MatcherRHS>
|
||||||
std::enable_if_t<Detail::is_generic_matcher<MatcherRHS>::value, Detail::MatchAnyOfGeneric<MatcherBase<ArgLHS>, MatcherRHS>>
|
std::enable_if_t<Detail::is_generic_matcher_v<MatcherRHS>, Detail::MatchAnyOfGeneric<MatcherBase<ArgLHS>, MatcherRHS>>
|
||||||
operator || (MatcherBase<ArgLHS> const& lhs, MatcherRHS const& rhs) {
|
operator || (MatcherBase<ArgLHS> const& lhs, MatcherRHS const& rhs) {
|
||||||
return { lhs, rhs };
|
return { lhs, rhs };
|
||||||
}
|
}
|
||||||
|
@@ -33,7 +33,7 @@ namespace Catch {
|
|||||||
ArgT && m_arg;
|
ArgT && m_arg;
|
||||||
MatcherT const& m_matcher;
|
MatcherT const& m_matcher;
|
||||||
public:
|
public:
|
||||||
MatchExpr( ArgT && arg, MatcherT const& matcher )
|
constexpr MatchExpr( ArgT && arg, MatcherT const& matcher )
|
||||||
: ITransientExpression{ true, matcher.match( arg ) }, // not forwarding arg here on purpose
|
: ITransientExpression{ true, matcher.match( arg ) }, // not forwarding arg here on purpose
|
||||||
m_arg( CATCH_FORWARD(arg) ),
|
m_arg( CATCH_FORWARD(arg) ),
|
||||||
m_matcher( matcher )
|
m_matcher( matcher )
|
||||||
@@ -63,7 +63,8 @@ namespace Catch {
|
|||||||
void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher );
|
void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher );
|
||||||
|
|
||||||
template<typename ArgT, typename MatcherT>
|
template<typename ArgT, typename MatcherT>
|
||||||
auto makeMatchExpr( ArgT && arg, MatcherT const& matcher ) -> MatchExpr<ArgT, MatcherT> {
|
constexpr MatchExpr<ArgT, MatcherT>
|
||||||
|
makeMatchExpr( ArgT&& arg, MatcherT const& matcher ) {
|
||||||
return MatchExpr<ArgT, MatcherT>( CATCH_FORWARD(arg), matcher );
|
return MatchExpr<ArgT, MatcherT>( CATCH_FORWARD(arg), matcher );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +78,7 @@ namespace Catch {
|
|||||||
INTERNAL_CATCH_TRY { \
|
INTERNAL_CATCH_TRY { \
|
||||||
catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher ) ); \
|
catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher ) ); \
|
||||||
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
|
|
||||||
@@ -87,7 +88,10 @@ namespace Catch {
|
|||||||
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(exceptionType) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \
|
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(exceptionType) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \
|
||||||
if( catchAssertionHandler.allowThrows() ) \
|
if( catchAssertionHandler.allowThrows() ) \
|
||||||
try { \
|
try { \
|
||||||
|
CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
|
||||||
|
CATCH_INTERNAL_SUPPRESS_USELESS_CAST_WARNINGS \
|
||||||
static_cast<void>(__VA_ARGS__ ); \
|
static_cast<void>(__VA_ARGS__ ); \
|
||||||
|
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
|
||||||
catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
|
catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
|
||||||
} \
|
} \
|
||||||
catch( exceptionType const& ex ) { \
|
catch( exceptionType const& ex ) { \
|
||||||
@@ -98,7 +102,7 @@ namespace Catch {
|
|||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
catchAssertionHandler.complete(); \
|
||||||
} while( false )
|
} while( false )
|
||||||
|
|
||||||
|
|
||||||
|
@@ -16,6 +16,7 @@ configure_file(
|
|||||||
format: 'cmake@',
|
format: 'cmake@',
|
||||||
install_dir: get_option('includedir') / 'catch2',
|
install_dir: get_option('includedir') / 'catch2',
|
||||||
configuration: conf_data,
|
configuration: conf_data,
|
||||||
|
install: get_option('install')
|
||||||
)
|
)
|
||||||
|
|
||||||
fs = import('fs')
|
fs = import('fs')
|
||||||
@@ -80,6 +81,7 @@ internal_headers = [
|
|||||||
'internal/catch_compiler_capabilities.hpp',
|
'internal/catch_compiler_capabilities.hpp',
|
||||||
'internal/catch_config_android_logwrite.hpp',
|
'internal/catch_config_android_logwrite.hpp',
|
||||||
'internal/catch_config_counter.hpp',
|
'internal/catch_config_counter.hpp',
|
||||||
|
'internal/catch_config_prefix_messages.hpp',
|
||||||
'internal/catch_config_static_analysis_support.hpp',
|
'internal/catch_config_static_analysis_support.hpp',
|
||||||
'internal/catch_config_uncaught_exceptions.hpp',
|
'internal/catch_config_uncaught_exceptions.hpp',
|
||||||
'internal/catch_config_wchar.hpp',
|
'internal/catch_config_wchar.hpp',
|
||||||
@@ -233,7 +235,6 @@ internal_sources = files(
|
|||||||
'internal/catch_random_seed_generation.cpp',
|
'internal/catch_random_seed_generation.cpp',
|
||||||
'internal/catch_reporter_registry.cpp',
|
'internal/catch_reporter_registry.cpp',
|
||||||
'internal/catch_reporter_spec_parser.cpp',
|
'internal/catch_reporter_spec_parser.cpp',
|
||||||
'internal/catch_result_type.cpp',
|
|
||||||
'internal/catch_reusable_string_stream.cpp',
|
'internal/catch_reusable_string_stream.cpp',
|
||||||
'internal/catch_run_context.cpp',
|
'internal/catch_run_context.cpp',
|
||||||
'internal/catch_section.cpp',
|
'internal/catch_section.cpp',
|
||||||
@@ -339,7 +340,9 @@ foreach file : headers
|
|||||||
endif
|
endif
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
install_headers(file, subdir: join_paths(include_subdir, folder))
|
if get_option('install')
|
||||||
|
install_headers(file, subdir: join_paths(include_subdir, folder))
|
||||||
|
endif
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
catch2_dependencies = []
|
catch2_dependencies = []
|
||||||
@@ -356,7 +359,7 @@ catch2 = static_library(
|
|||||||
sources,
|
sources,
|
||||||
dependencies: catch2_dependencies,
|
dependencies: catch2_dependencies,
|
||||||
include_directories: '..',
|
include_directories: '..',
|
||||||
install: true,
|
install: get_option('install'),
|
||||||
)
|
)
|
||||||
|
|
||||||
catch2_dep = declare_dependency(
|
catch2_dep = declare_dependency(
|
||||||
@@ -364,19 +367,21 @@ catch2_dep = declare_dependency(
|
|||||||
include_directories: '..',
|
include_directories: '..',
|
||||||
)
|
)
|
||||||
|
|
||||||
pkg.generate(
|
if get_option('install')
|
||||||
catch2,
|
pkg.generate(
|
||||||
filebase: 'catch2',
|
catch2,
|
||||||
description: 'A modern, C++-native, test framework for C++14 and above',
|
filebase: 'catch2',
|
||||||
url: 'https://github.com/catchorg/Catch2',
|
description: 'A modern, C++-native, test framework for C++14 and above',
|
||||||
)
|
url: 'https://github.com/catchorg/Catch2',
|
||||||
|
)
|
||||||
|
endif
|
||||||
|
|
||||||
catch2_with_main = static_library(
|
catch2_with_main = static_library(
|
||||||
'Catch2Main',
|
'Catch2Main',
|
||||||
'internal/catch_main.cpp',
|
'internal/catch_main.cpp',
|
||||||
link_with: catch2,
|
link_with: catch2,
|
||||||
include_directories: '..',
|
include_directories: '..',
|
||||||
install: true,
|
install: get_option('install'),
|
||||||
)
|
)
|
||||||
|
|
||||||
catch2_with_main_dep = declare_dependency(
|
catch2_with_main_dep = declare_dependency(
|
||||||
@@ -384,9 +389,11 @@ catch2_with_main_dep = declare_dependency(
|
|||||||
include_directories: '..',
|
include_directories: '..',
|
||||||
)
|
)
|
||||||
|
|
||||||
pkg.generate(
|
if get_option('install')
|
||||||
catch2_with_main,
|
pkg.generate(
|
||||||
filebase: 'catch2-with-main',
|
catch2_with_main,
|
||||||
description: 'A modern, C++-native, test framework for C++14 and above (links in default main)',
|
filebase: 'catch2-with-main',
|
||||||
requires: 'catch2 = ' + meson.project_version(),
|
description: 'A modern, C++-native, test framework for C++14 and above (links in default main)',
|
||||||
)
|
requires: 'catch2 = ' + meson.project_version(),
|
||||||
|
)
|
||||||
|
endif
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user