| |
| // 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/interfaces/catch_interfaces_registry_hub.hpp> |
| |
| #include <catch2/internal/catch_context.hpp> |
| #include <catch2/internal/catch_enforce.hpp> |
| #include <catch2/internal/catch_test_case_registry_impl.hpp> |
| #include <catch2/internal/catch_reporter_registry.hpp> |
| #include <catch2/internal/catch_exception_translator_registry.hpp> |
| #include <catch2/internal/catch_tag_alias_registry.hpp> |
| #include <catch2/internal/catch_startup_exception_registry.hpp> |
| #include <catch2/internal/catch_singletons.hpp> |
| #include <catch2/internal/catch_enum_values_registry.hpp> |
| #include <catch2/catch_test_case_info.hpp> |
| #include <catch2/internal/catch_noncopyable.hpp> |
| #include <catch2/interfaces/catch_interfaces_reporter_factory.hpp> |
| #include <catch2/internal/catch_move_and_forward.hpp> |
| |
| #include <exception> |
| |
| namespace Catch { |
| |
| namespace { |
| |
| class RegistryHub : public IRegistryHub, |
| public IMutableRegistryHub, |
| private Detail::NonCopyable { |
| |
| public: // IRegistryHub |
| RegistryHub() = default; |
| ReporterRegistry const& getReporterRegistry() const override { |
| return m_reporterRegistry; |
| } |
| ITestCaseRegistry const& getTestCaseRegistry() const override { |
| return m_testCaseRegistry; |
| } |
| IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const override { |
| return m_exceptionTranslatorRegistry; |
| } |
| ITagAliasRegistry const& getTagAliasRegistry() const override { |
| return m_tagAliasRegistry; |
| } |
| StartupExceptionRegistry const& getStartupExceptionRegistry() const override { |
| return m_exceptionRegistry; |
| } |
| |
| public: // IMutableRegistryHub |
| void registerReporter( std::string const& name, IReporterFactoryPtr factory ) override { |
| m_reporterRegistry.registerReporter( name, CATCH_MOVE(factory) ); |
| } |
| void registerListener( Detail::unique_ptr<EventListenerFactory> factory ) override { |
| m_reporterRegistry.registerListener( CATCH_MOVE(factory) ); |
| } |
| void registerTest( Detail::unique_ptr<TestCaseInfo>&& testInfo, Detail::unique_ptr<ITestInvoker>&& invoker ) override { |
| m_testCaseRegistry.registerTest( CATCH_MOVE(testInfo), CATCH_MOVE(invoker) ); |
| } |
| void registerTranslator( Detail::unique_ptr<IExceptionTranslator>&& translator ) override { |
| m_exceptionTranslatorRegistry.registerTranslator( CATCH_MOVE(translator) ); |
| } |
| void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) override { |
| m_tagAliasRegistry.add( alias, tag, lineInfo ); |
| } |
| void registerStartupException() noexcept override { |
| #if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) |
| m_exceptionRegistry.add(std::current_exception()); |
| #else |
| CATCH_INTERNAL_ERROR("Attempted to register active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!"); |
| #endif |
| } |
| IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override { |
| return m_enumValuesRegistry; |
| } |
| |
| private: |
| TestRegistry m_testCaseRegistry; |
| ReporterRegistry m_reporterRegistry; |
| ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; |
| TagAliasRegistry m_tagAliasRegistry; |
| StartupExceptionRegistry m_exceptionRegistry; |
| Detail::EnumValuesRegistry m_enumValuesRegistry; |
| }; |
| } |
| |
| using RegistryHubSingleton = Singleton<RegistryHub, IRegistryHub, IMutableRegistryHub>; |
| |
| IRegistryHub const& getRegistryHub() { |
| return RegistryHubSingleton::get(); |
| } |
| IMutableRegistryHub& getMutableRegistryHub() { |
| return RegistryHubSingleton::getMutable(); |
| } |
| void cleanUp() { |
| cleanupSingletons(); |
| cleanUpContext(); |
| } |
| std::string translateActiveException() { |
| return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); |
| } |
| |
| |
| } // end namespace Catch |