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

summaryrefslogtreecommitdiffhomepage
path: root/src/Progmasoft/Catch3/Internal/TestRegistry.cpp
diff options
context:
space:
mode:
authorLeitwolf2026-10-25 10:31:36 +0300
committerGitHub2026-10-25 10:31:36 +0300
commitd2e3e074bb2e1b8ffd9fc990d0b87667ea602f58 (patch)
tree0bce4462b2e190c39b3e1c5f697e3e4abd1a5e2a /src/Progmasoft/Catch3/Internal/TestRegistry.cpp
parent13f81a480a93807c14dddb5abdb97355ced4d4c5 (diff)
parent126dc333564cb72b5115d9a9242d66694694b6d0 (diff)
downloadcatch3-d2e3e074bb2e1b8ffd9fc990d0b87667ea602f58.tar.gz
Merge pull request #18 from Progmasoft/build/catch3-identity
Give Catch3 its own build names and headers
Diffstat (limited to 'src/Progmasoft/Catch3/Internal/TestRegistry.cpp')
-rw-r--r--src/Progmasoft/Catch3/Internal/TestRegistry.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/Progmasoft/Catch3/Internal/TestRegistry.cpp b/src/Progmasoft/Catch3/Internal/TestRegistry.cpp
new file mode 100644
index 00000000..a76fe250
--- /dev/null
+++ b/src/Progmasoft/Catch3/Internal/TestRegistry.cpp
@@ -0,0 +1,93 @@
+
+// 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 <Progmasoft/Catch3/Internal/TestRegistry.hpp>
+#include <Progmasoft/Catch3/Internal/CompilerCapabilities.hpp>
+#include <Progmasoft/Catch3/TestCaseInfo.hpp>
+#include <Progmasoft/Catch3/Interfaces/IRegistryHub.hpp>
+#include <Progmasoft/Catch3/Internal/StringManip.hpp>
+#include <Progmasoft/Catch3/Internal/MoveAndForward.hpp>
+
+#include <algorithm>
+#include <iterator>
+
+namespace Catch {
+ void ITestInvoker::prepareTestCase() {}
+ void ITestInvoker::tearDownTestCase() {}
+ ITestInvoker::~ITestInvoker() = default;
+
+ namespace {
+ static StringRef extractClassName( StringRef classOrMethodName ) {
+ if ( !startsWith( classOrMethodName, '&' ) ) {
+ return classOrMethodName;
+ }
+
+ // Remove the leading '&' to avoid having to special case it later
+ const auto methodName =
+ classOrMethodName.substr( 1, classOrMethodName.size() );
+
+ auto reverseStart = std::make_reverse_iterator( methodName.end() );
+ auto reverseEnd = std::make_reverse_iterator( methodName.begin() );
+
+ // We make a simplifying assumption that ":" is only present
+ // in the input as part of "::" from C++ typenames (this is
+ // relatively safe assumption because the input is generated
+ // as stringification of type through preprocessor).
+ auto lastColons = std::find( reverseStart, reverseEnd, ':' ) + 1;
+ auto secondLastColons =
+ std::find( lastColons + 1, reverseEnd, ':' );
+
+ auto const startIdx = reverseEnd - secondLastColons;
+ auto const classNameSize = secondLastColons - lastColons - 1;
+
+ return methodName.substr(
+ static_cast<std::size_t>( startIdx ),
+ static_cast<std::size_t>( classNameSize ) );
+ }
+
+ class TestInvokerAsFunction final : public ITestInvoker {
+ using TestType = void ( * )();
+ TestType m_testAsFunction;
+
+ public:
+ constexpr TestInvokerAsFunction( TestType testAsFunction ) noexcept:
+ m_testAsFunction( testAsFunction ) {}
+
+ void invoke() const override { m_testAsFunction(); }
+ };
+
+ } // namespace
+
+ Detail::unique_ptr<ITestInvoker> makeTestInvoker( void(*testAsFunction)() ) {
+ return Detail::make_unique<TestInvokerAsFunction>( testAsFunction );
+ }
+
+ AutoReg::AutoReg( void ( *testAsFunction )(),
+ SourceLineInfo const& lineInfo,
+ StringRef classOrMethod,
+ NameAndTags const& nameAndTags ) noexcept:
+ AutoReg( makeTestInvoker( testAsFunction ),
+ lineInfo,
+ classOrMethod,
+ nameAndTags ) {}
+
+ AutoReg::AutoReg( Detail::unique_ptr<ITestInvoker> invoker, SourceLineInfo const& lineInfo, StringRef classOrMethod, NameAndTags const& nameAndTags ) noexcept {
+ CATCH_TRY {
+ getMutableRegistryHub()
+ .registerTest(
+ makeTestCaseInfo(
+ extractClassName( classOrMethod ),
+ nameAndTags,
+ lineInfo),
+ CATCH_MOVE(invoker)
+ );
+ } CATCH_CATCH_ALL {
+ // Do not throw when constructing global objects, instead register the exception to be processed later
+ getMutableRegistryHub().registerStartupException();
+ }
+ }
+}