// 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 #include #include #include #include #include #include #include #include #include #include #include #include namespace Catch { struct ReporterRegistry::ReporterRegistryImpl { std::vector> listeners; std::map factories; }; ReporterRegistry::ReporterRegistry(): m_impl( Detail::make_unique() ) { // Because it is impossible to move out of initializer list, // we have to add the elements manually m_impl->factories["Automake"] = Detail::make_unique>(); m_impl->factories["compact"] = Detail::make_unique>(); m_impl->factories["console"] = Detail::make_unique>(); m_impl->factories["JUnit"] = Detail::make_unique>(); m_impl->factories["SonarQube"] = Detail::make_unique>(); m_impl->factories["TAP"] = Detail::make_unique>(); m_impl->factories["TeamCity"] = Detail::make_unique>(); m_impl->factories["XML"] = Detail::make_unique>(); } ReporterRegistry::~ReporterRegistry() = default; IEventListenerPtr ReporterRegistry::create( std::string const& name, ReporterConfig&& config ) const { auto it = m_impl->factories.find( name ); if ( it == m_impl->factories.end() ) return nullptr; return it->second->create( CATCH_MOVE( config ) ); } void ReporterRegistry::registerReporter( std::string const& name, IReporterFactoryPtr factory ) { CATCH_ENFORCE( name.find( "::" ) == name.npos, "'::' is not allowed in reporter name: '" + name + '\'' ); auto ret = m_impl->factories.emplace( name, CATCH_MOVE( factory ) ); CATCH_ENFORCE( ret.second, "reporter using '" + name + "' as name was already registered" ); } void ReporterRegistry::registerListener( Detail::unique_ptr factory ) { m_impl->listeners.push_back( CATCH_MOVE( factory ) ); } std::map const& ReporterRegistry::getFactories() const { return m_impl->factories; } std::vector> const& ReporterRegistry::getListeners() const { return m_impl->listeners; } } // namespace Catch