diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c56cca3..bc5280b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -176,6 +176,7 @@ set(INTERNAL_HEADERS ${HEADER_DIR}/internal/catch_string_manip.h ${HEADER_DIR}/internal/catch_suppress_warnings.h ${HEADER_DIR}/internal/catch_tag_alias.h + ${HEADER_DIR}/internal/catch_tag_alias_autoregistrar.h ${HEADER_DIR}/internal/catch_tag_alias_registry.h ${HEADER_DIR}/internal/catch_test_case_info.h ${HEADER_DIR}/internal/catch_test_case_registry_impl.hpp @@ -223,6 +224,7 @@ set(IMPL_SOURCES ${HEADER_DIR}/internal/catch_stringref.cpp ${HEADER_DIR}/internal/catch_string_manip.cpp ${HEADER_DIR}/internal/catch_tag_alias.cpp + ${HEADER_DIR}/internal/catch_tag_alias_autoregistrar.cpp ${HEADER_DIR}/internal/catch_tag_alias_registry.cpp ${HEADER_DIR}/internal/catch_test_case_info.cpp ${HEADER_DIR}/internal/catch_test_case_registry_impl.cpp diff --git a/include/catch.hpp b/include/catch.hpp index 920e17b0..32effe1e 100644 --- a/include/catch.hpp +++ b/include/catch.hpp @@ -29,6 +29,7 @@ #endif #include "internal/catch_context.h" +#include "internal/catch_tag_alias_autoregistrar.h" #include "internal/catch_test_registry.hpp" #include "internal/catch_capture.hpp" #include "internal/catch_section.h" diff --git a/include/internal/catch_interfaces_tag_alias_registry.h b/include/internal/catch_interfaces_tag_alias_registry.h index cd6ac51d..24bc535c 100644 --- a/include/internal/catch_interfaces_tag_alias_registry.h +++ b/include/internal/catch_interfaces_tag_alias_registry.h @@ -8,14 +8,16 @@ #ifndef TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED #define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED -#include "catch_tag_alias.h" -#include "catch_option.hpp" +#include namespace Catch { + struct TagAlias; + struct ITagAliasRegistry { virtual ~ITagAliasRegistry(); - virtual Option find( std::string const& alias ) const = 0; + // Nullptr if not present + virtual TagAlias const* find( std::string const& alias ) const = 0; virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; static ITagAliasRegistry const& get(); diff --git a/include/internal/catch_tag_alias.cpp b/include/internal/catch_tag_alias.cpp new file mode 100644 index 00000000..2ea4540e --- /dev/null +++ b/include/internal/catch_tag_alias.cpp @@ -0,0 +1,5 @@ +#include "catch_tag_alias.h" + +namespace Catch { + TagAlias::TagAlias(std::string const & _tag, SourceLineInfo _lineInfo): tag(_tag), lineInfo(_lineInfo) {} +} diff --git a/include/internal/catch_tag_alias.h b/include/internal/catch_tag_alias.h index 7dd6337f..a9e6eb37 100644 --- a/include/internal/catch_tag_alias.h +++ b/include/internal/catch_tag_alias.h @@ -21,12 +21,6 @@ namespace Catch { SourceLineInfo lineInfo; }; - struct RegistrarForTagAliases { - RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - }; - } // end namespace Catch #endif // TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED - -#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } diff --git a/include/internal/catch_tag_alias_autoregistrar.cpp b/include/internal/catch_tag_alias_autoregistrar.cpp new file mode 100644 index 00000000..a2f01cba --- /dev/null +++ b/include/internal/catch_tag_alias_autoregistrar.cpp @@ -0,0 +1,15 @@ +#include "catch_tag_alias_autoregistrar.h" +#include "catch_interfaces_registry_hub.h" + +namespace Catch { + + RegistrarForTagAliases::RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo) { + try { + getMutableRegistryHub().registerTagAlias(alias, tag, lineInfo); + } catch (...) { + // Do not throw when constructing global objects, instead register the exception to be processed later + getMutableRegistryHub().registerStartupException(std::current_exception()); + } + } + +} diff --git a/include/internal/catch_tag_alias_autoregistrar.h b/include/internal/catch_tag_alias_autoregistrar.h new file mode 100644 index 00000000..e9b961e4 --- /dev/null +++ b/include/internal/catch_tag_alias_autoregistrar.h @@ -0,0 +1,22 @@ +/* + * Created by Martin on 27/07/2017. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +#ifndef TWOBLUECUBES_CATCH_TAG_ALIAS_AUTOREGISTRAR_H_INCLUDED +#define TWOBLUECUBES_CATCH_TAG_ALIAS_AUTOREGISTRAR_H_INCLUDED + +#include "catch_common.h" + +namespace Catch { + + struct RegistrarForTagAliases { + RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); + }; + +} // end namespace Catch + +#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } + +#endif // TWOBLUECUBES_CATCH_TAG_ALIAS_AUTOREGISTRAR_H_INCLUDED diff --git a/include/internal/catch_tag_alias_registry.cpp b/include/internal/catch_tag_alias_registry.cpp index 921740e0..3bf14c82 100644 --- a/include/internal/catch_tag_alias_registry.cpp +++ b/include/internal/catch_tag_alias_registry.cpp @@ -16,12 +16,12 @@ namespace Catch { TagAliasRegistry::~TagAliasRegistry() {} - Option TagAliasRegistry::find( std::string const& alias ) const { + TagAlias const* TagAliasRegistry::find( std::string const& alias ) const { auto it = m_registry.find( alias ); if( it != m_registry.end() ) - return it->second; + return &(it->second); else - return Option(); + return nullptr; } std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { diff --git a/include/internal/catch_tag_alias_registry.h b/include/internal/catch_tag_alias_registry.h index d05c7739..d3bb8ffb 100644 --- a/include/internal/catch_tag_alias_registry.h +++ b/include/internal/catch_tag_alias_registry.h @@ -9,6 +9,7 @@ #define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED #include "catch_interfaces_tag_alias_registry.h" +#include "catch_tag_alias.h" #include @@ -17,7 +18,7 @@ namespace Catch { class TagAliasRegistry : public ITagAliasRegistry { public: ~TagAliasRegistry() override; - Option find( std::string const& alias ) const override; + TagAlias const* find( std::string const& alias ) const override; std::string expandAliases( std::string const& unexpandedTestSpec ) const override; void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo );