Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
authorMartin Hořeňovský2026-05-10 23:05:46 +0200
committerMartin Hořeňovský2026-05-12 11:05:02 +0200
commit651247c7f40eda6846fec736d2f9edac8949dacb (patch)
tree76b4ef9f6d100c787f6b8af93779c43ea9524f67 /tests
parent15b9393f0f32327e28833c5032b2c4e02c31d82c (diff)
downloadcatch3-651247c7f40eda6846fec736d2f9edac8949dacb.tar.gz
Support for constexpr matchers in C++20 (P0784)
To make this all work, I had to remove the stringification cache from matchers. In theory, this can cause performance penalty in cases where single matcher instance is stringified multiple times, but in practice this does not happen much, and the difference is surprisingly small anyway, because the performance of stringification is already horrible and full of allocating strings just to throw them away. The matcher combinators need P2738 from C++26 to be `constexpr`. Closes #3091
Diffstat (limited to 'tests')
-rw-r--r--tests/BUILD.bazel1
-rw-r--r--tests/CMakeLists.txt3
-rw-r--r--tests/ExtraTests/CMakeLists.txt2
-rw-r--r--tests/ExtraTests/X02-DisabledMacros.cpp2
-rw-r--r--tests/ExtraTests/X05-DeferredStaticChecks.cpp26
-rw-r--r--tests/SelfTest/UsageTests/MatchersConstexpr.tests.cpp52
-rw-r--r--tests/meson.build1
7 files changed, 85 insertions, 2 deletions
diff --git a/tests/BUILD.bazel b/tests/BUILD.bazel
index 58c05205..1e192a1c 100644
--- a/tests/BUILD.bazel
+++ b/tests/BUILD.bazel
@@ -62,6 +62,7 @@ cc_test(
"SelfTest/UsageTests/Exception.tests.cpp",
"SelfTest/UsageTests/Generators.tests.cpp",
"SelfTest/UsageTests/Matchers.tests.cpp",
+ "SelfTest/UsageTests/MatchersConstexpr.tests.cpp",
"SelfTest/UsageTests/MatchersRanges.tests.cpp",
"SelfTest/UsageTests/Message.tests.cpp",
"SelfTest/UsageTests/Misc.tests.cpp",
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 3329e90f..7429734f 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -124,8 +124,9 @@ set(TEST_SOURCES
${SELF_TEST_DIR}/UsageTests/ToStringWhich.tests.cpp
${SELF_TEST_DIR}/UsageTests/Tricky.tests.cpp
${SELF_TEST_DIR}/UsageTests/VariadicMacros.tests.cpp
- ${SELF_TEST_DIR}/UsageTests/MatchersRanges.tests.cpp
${SELF_TEST_DIR}/UsageTests/Matchers.tests.cpp
+ ${SELF_TEST_DIR}/UsageTests/MatchersConstexpr.tests.cpp
+ ${SELF_TEST_DIR}/UsageTests/MatchersRanges.tests.cpp
)
set(TEST_HEADERS
diff --git a/tests/ExtraTests/CMakeLists.txt b/tests/ExtraTests/CMakeLists.txt
index 886c059e..731bcf1c 100644
--- a/tests/ExtraTests/CMakeLists.txt
+++ b/tests/ExtraTests/CMakeLists.txt
@@ -174,7 +174,7 @@ target_compile_definitions(DeferredStaticChecks PRIVATE "CATCH_CONFIG_RUNTIME_ST
add_test(NAME DeferredStaticChecks COMMAND DeferredStaticChecks -r compact)
set_tests_properties(DeferredStaticChecks
PROPERTIES
- PASS_REGULAR_EXPRESSION "test cases: 1 \\| 1 failed\nassertions: 3 \\| 3 failed"
+ PASS_REGULAR_EXPRESSION "test cases: 1 \\| 1 failed\nassertions: 3 \\| 3 failed;test cases: 1 \\| 1 failed\nassertions: 4 \\| 4 failed"
)
add_executable(MixingClearedAndUnclearedMessages ${TESTS_DIR}/X06-MixingClearedAndUnclearedMessages.cpp)
diff --git a/tests/ExtraTests/X02-DisabledMacros.cpp b/tests/ExtraTests/X02-DisabledMacros.cpp
index 0c051acc..3449ab73 100644
--- a/tests/ExtraTests/X02-DisabledMacros.cpp
+++ b/tests/ExtraTests/X02-DisabledMacros.cpp
@@ -53,6 +53,8 @@ TEST_CASE( "Disabled Macros" ) {
REQUIRE_THAT( 1,
Catch::Matchers::Predicate( []( int ) { return false; } ) );
BENCHMARK( "Disabled benchmark" ) { REQUIRE( 1 == 2 ); };
+
+ STATIC_REQUIRE_THAT( 1, Catch::Matchers::Predicate( []( int ) { return false; } ) );
}
struct DisabledFixture {};
diff --git a/tests/ExtraTests/X05-DeferredStaticChecks.cpp b/tests/ExtraTests/X05-DeferredStaticChecks.cpp
index 8005dbcf..79ff35cc 100644
--- a/tests/ExtraTests/X05-DeferredStaticChecks.cpp
+++ b/tests/ExtraTests/X05-DeferredStaticChecks.cpp
@@ -12,10 +12,36 @@
*/
#include <catch2/catch_test_macros.hpp>
+#include <catch2/matchers/catch_matchers_templated.hpp>
+
+#if defined( CATCH_INTERNAL_CONSTEXPR_MATCHERS_ENABLED )
+
+namespace {
+ struct MatchNoneMatcher final : public Catch::Matchers::MatcherGenericBase {
+ public:
+ template <typename Any>
+ constexpr bool match( Any&& ) const {
+ return false;
+ }
+
+ std::string describe() const override {
+ using namespace std::string_literals;
+ return "Matches anything"s;
+ }
+ };
+
+ constexpr MatchNoneMatcher MatchNone() { return MatchNoneMatcher(); }
+
+} // namespace
+
+#endif
TEST_CASE("Deferred static checks") {
STATIC_CHECK(1 == 2);
STATIC_CHECK_FALSE(1 != 2);
+#if defined(CATCH_INTERNAL_CONSTEXPR_MATCHERS_ENABLED)
+ STATIC_CHECK_THAT(1, MatchNone());
+#endif
// This last assertion must be executed too
CHECK(1 == 2);
}
diff --git a/tests/SelfTest/UsageTests/MatchersConstexpr.tests.cpp b/tests/SelfTest/UsageTests/MatchersConstexpr.tests.cpp
new file mode 100644
index 00000000..edd03519
--- /dev/null
+++ b/tests/SelfTest/UsageTests/MatchersConstexpr.tests.cpp
@@ -0,0 +1,52 @@
+
+// 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/catch_test_macros.hpp>
+#include <catch2/matchers/catch_matchers_templated.hpp>
+
+#if defined( CATCH_INTERNAL_CONSTEXPR_MATCHERS_ENABLED )
+
+namespace {
+ struct MatchAllMatcher final : public Catch::Matchers::MatcherGenericBase {
+ public:
+ template <typename Any>
+ constexpr bool match( Any&& ) const {
+ return true;
+ }
+
+ std::string describe() const override {
+ using namespace std::string_literals;
+ return "Matches anything"s;
+ }
+ };
+
+ constexpr MatchAllMatcher MatchAll() { return MatchAllMatcher(); }
+
+} // namespace
+
+TEST_CASE( "Constexpr support for matchers", "[constexpr][matchers][approvals]" ) {
+ STATIC_REQUIRE( MatchAll().match( 1 ) );
+ STATIC_REQUIRE_THAT( 1, MatchAll() );
+}
+
+// Combining matchers needs C++26 and P2738, so they are in separate preprocessor block
+# if __cpp_constexpr >= 202306L
+
+TEST_CASE("Constexpr support for combining matchers",
+ "[constexpr][matchers][approvals]") {
+ STATIC_REQUIRE( ( MatchAll() && MatchAll() ).match( 1 ) );
+ STATIC_REQUIRE( ( MatchAll() || MatchAll() ).match( 1 ) );
+ STATIC_REQUIRE( ( !!MatchAll() ).match( 1 ) );
+ STATIC_REQUIRE_THAT( 1, MatchAll() && MatchAll() );
+ STATIC_REQUIRE_THAT( 1, MatchAll() || MatchAll() );
+ STATIC_REQUIRE_THAT( 1, !!MatchAll() );
+}
+
+#endif // __cpp_constexpr >= 202306L
+
+#endif
diff --git a/tests/meson.build b/tests/meson.build
index 58302b7a..0e44eaab 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -49,6 +49,7 @@ self_test_sources = files(
'SelfTest/UsageTests/Exception.tests.cpp',
'SelfTest/UsageTests/Generators.tests.cpp',
'SelfTest/UsageTests/Matchers.tests.cpp',
+ 'SelfTest/UsageTests/MatchersConstexpr.tests.cpp',
'SelfTest/UsageTests/MatchersRanges.tests.cpp',
'SelfTest/UsageTests/Message.tests.cpp',
'SelfTest/UsageTests/Misc.tests.cpp',