From 923db163228b2eb0d8acdf970c2a285e9c6e7983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Sun, 8 Sep 2019 14:07:18 +0200 Subject: [PATCH] Use StringRefs through the enum registration --- .../internal/catch_enum_values_registry.cpp | 26 +++++++++++++------ include/internal/catch_enum_values_registry.h | 2 +- .../catch_interfaces_enum_values_registry.h | 2 +- .../Baselines/compact.sw.approved.txt | 14 +++++----- .../Baselines/console.sw.approved.txt | 26 +++++++++---------- .../SelfTest/Baselines/xml.sw.approved.txt | 26 +++++++++---------- .../IntrospectiveTests/ToString.tests.cpp | 14 +++++----- 7 files changed, 60 insertions(+), 50 deletions(-) diff --git a/include/internal/catch_enum_values_registry.cpp b/include/internal/catch_enum_values_registry.cpp index de8181fd..fb060f5b 100644 --- a/include/internal/catch_enum_values_registry.cpp +++ b/include/internal/catch_enum_values_registry.cpp @@ -18,13 +18,25 @@ namespace Catch { namespace Detail { - std::vector parseEnums( StringRef enums ) { + namespace { + // Extracts the actual name part of an enum instance + // In other words, it returns the Blue part of Bikeshed::Colour::Blue + StringRef extractInstanceName(StringRef enumInstance) { + // Find last occurence of ":" + size_t name_start = enumInstance.size(); + while (name_start > 0 && enumInstance[name_start - 1] != ':') { + --name_start; + } + return enumInstance.substr(name_start, enumInstance.size() - name_start); + } + } + + std::vector parseEnums( StringRef enums ) { auto enumValues = splitStringRef( enums, ',' ); - std::vector parsed; + std::vector parsed; parsed.reserve( enumValues.size() ); for( auto const& enumValue : enumValues ) { - auto identifiers = splitStringRef( enumValue, ':' ); - parsed.push_back( Catch::trim( identifiers.back() ) ); + parsed.push_back(trim(extractInstanceName(enumValue))); } return parsed; } @@ -54,10 +66,8 @@ namespace Catch { } EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName, StringRef allValueNames, std::vector const& values ) { - auto enumInfo = makeEnumInfo( enumName, allValueNames, values ); - EnumInfo* raw = enumInfo.get(); - m_enumInfos.push_back( std::move( enumInfo ) ); - return *raw; + m_enumInfos.push_back(makeEnumInfo(enumName, allValueNames, values)); + return *m_enumInfos.back(); } } // Detail diff --git a/include/internal/catch_enum_values_registry.h b/include/internal/catch_enum_values_registry.h index ec08d2ba..ae252fbf 100644 --- a/include/internal/catch_enum_values_registry.h +++ b/include/internal/catch_enum_values_registry.h @@ -26,7 +26,7 @@ namespace Catch { EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector const& values) override; }; - std::vector parseEnums( StringRef enums ); + std::vector parseEnums( StringRef enums ); } // Detail diff --git a/include/internal/catch_interfaces_enum_values_registry.h b/include/internal/catch_interfaces_enum_values_registry.h index 8e07fc73..81592c9b 100644 --- a/include/internal/catch_interfaces_enum_values_registry.h +++ b/include/internal/catch_interfaces_enum_values_registry.h @@ -17,7 +17,7 @@ namespace Catch { namespace Detail { struct EnumInfo { StringRef m_name; - std::vector> m_values; + std::vector> m_values; ~EnumInfo(); diff --git a/projects/SelfTest/Baselines/compact.sw.approved.txt b/projects/SelfTest/Baselines/compact.sw.approved.txt index aa3613f2..c6a401fc 100644 --- a/projects/SelfTest/Baselines/compact.sw.approved.txt +++ b/projects/SelfTest/Baselines/compact.sw.approved.txt @@ -1505,13 +1505,13 @@ Tricky.tests.cpp:: passed: ptr.get() == 0 for: 0 == 0 ToStringPair.tests.cpp:: passed: ::Catch::Detail::stringify( pair ) == "{ { 42, \"Arthur\" }, { \"Ford\", 24 } }" for: "{ { 42, "Arthur" }, { "Ford", 24 } }" == "{ { 42, "Arthur" }, { "Ford", 24 } }" -ToString.tests.cpp:: passed: parseEnums( "" ), Equals( std::vector{} ) for: { } Equals: { } -ToString.tests.cpp:: passed: parseEnums( "ClassName::EnumName::Value1" ), Equals(std::vector{"Value1"} ) for: { "Value1" } Equals: { "Value1" } -ToString.tests.cpp:: passed: parseEnums( "Value1" ), Equals( std::vector{"Value1"} ) for: { "Value1" } Equals: { "Value1" } -ToString.tests.cpp:: passed: parseEnums( "EnumName::Value1" ), Equals(std::vector{"Value1"} ) for: { "Value1" } Equals: { "Value1" } -ToString.tests.cpp:: passed: parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2" ), Equals( std::vector{"Value1", "Value2"} ) for: { "Value1", "Value2" } Equals: { "Value1", "Value2" } -ToString.tests.cpp:: passed: parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2, ClassName::EnumName::Value3" ), Equals( std::vector{"Value1", "Value2", "Value3"} ) for: { "Value1", "Value2", "Value3" } Equals: { "Value1", "Value2", "Value3" } -ToString.tests.cpp:: passed: parseEnums( "ClassName::EnumName::Value1,ClassName::EnumName::Value2 , ClassName::EnumName::Value3" ), Equals( std::vector{"Value1", "Value2", "Value3"} ) for: { "Value1", "Value2", "Value3" } Equals: { "Value1", "Value2", "Value3" } +ToString.tests.cpp:: passed: parseEnums( "" ), Equals( std::vector{} ) for: { } Equals: { } +ToString.tests.cpp:: passed: parseEnums( "ClassName::EnumName::Value1" ), Equals(std::vector{"Value1"} ) for: { Value1 } Equals: { Value1 } +ToString.tests.cpp:: passed: parseEnums( "Value1" ), Equals( std::vector{"Value1"} ) for: { Value1 } Equals: { Value1 } +ToString.tests.cpp:: passed: parseEnums( "EnumName::Value1" ), Equals(std::vector{"Value1"} ) for: { Value1 } Equals: { Value1 } +ToString.tests.cpp:: passed: parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2" ), Equals( std::vector{"Value1", "Value2"} ) for: { Value1, Value2 } Equals: { Value1, Value2 } +ToString.tests.cpp:: passed: parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2, ClassName::EnumName::Value3" ), Equals( std::vector{"Value1", "Value2", "Value3"} ) for: { Value1, Value2, Value3 } Equals: { Value1, Value2, Value3 } +ToString.tests.cpp:: passed: parseEnums( "ClassName::EnumName::Value1,ClassName::EnumName::Value2 , ClassName::EnumName::Value3" ), Equals( std::vector{"Value1", "Value2", "Value3"} ) for: { Value1, Value2, Value3 } Equals: { Value1, Value2, Value3 } Tricky.tests.cpp:: passed: p == 0 for: 0 == 0 Message.tests.cpp:: passed: true with 1 message: 'this MAY be seen IF info is printed for passing assertions' Message.tests.cpp:: failed: false with 2 messages: 'this SHOULD be seen' and 'this SHOULD also be seen' diff --git a/projects/SelfTest/Baselines/console.sw.approved.txt b/projects/SelfTest/Baselines/console.sw.approved.txt index 6a0ac776..6ab478be 100644 --- a/projects/SelfTest/Baselines/console.sw.approved.txt +++ b/projects/SelfTest/Baselines/console.sw.approved.txt @@ -11304,7 +11304,7 @@ ToString.tests.cpp: ............................................................................... ToString.tests.cpp:: PASSED: - CHECK_THAT( parseEnums( "" ), Equals( std::vector{} ) ) + CHECK_THAT( parseEnums( "" ), Equals( std::vector{} ) ) with expansion: { } Equals: { } @@ -11316,19 +11316,19 @@ ToString.tests.cpp: ............................................................................... ToString.tests.cpp:: PASSED: - CHECK_THAT( parseEnums( "ClassName::EnumName::Value1" ), Equals(std::vector{"Value1"} ) ) + CHECK_THAT( parseEnums( "ClassName::EnumName::Value1" ), Equals(std::vector{"Value1"} ) ) with expansion: - { "Value1" } Equals: { "Value1" } + { Value1 } Equals: { Value1 } ToString.tests.cpp:: PASSED: - CHECK_THAT( parseEnums( "Value1" ), Equals( std::vector{"Value1"} ) ) + CHECK_THAT( parseEnums( "Value1" ), Equals( std::vector{"Value1"} ) ) with expansion: - { "Value1" } Equals: { "Value1" } + { Value1 } Equals: { Value1 } ToString.tests.cpp:: PASSED: - CHECK_THAT( parseEnums( "EnumName::Value1" ), Equals(std::vector{"Value1"} ) ) + CHECK_THAT( parseEnums( "EnumName::Value1" ), Equals(std::vector{"Value1"} ) ) with expansion: - { "Value1" } Equals: { "Value1" } + { Value1 } Equals: { Value1 } ------------------------------------------------------------------------------- parseEnums @@ -11338,19 +11338,19 @@ ToString.tests.cpp: ............................................................................... ToString.tests.cpp:: PASSED: - CHECK_THAT( parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2" ), Equals( std::vector{"Value1", "Value2"} ) ) + CHECK_THAT( parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2" ), Equals( std::vector{"Value1", "Value2"} ) ) with expansion: - { "Value1", "Value2" } Equals: { "Value1", "Value2" } + { Value1, Value2 } Equals: { Value1, Value2 } ToString.tests.cpp:: PASSED: - CHECK_THAT( parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2, ClassName::EnumName::Value3" ), Equals( std::vector{"Value1", "Value2", "Value3"} ) ) + CHECK_THAT( parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2, ClassName::EnumName::Value3" ), Equals( std::vector{"Value1", "Value2", "Value3"} ) ) with expansion: - { "Value1", "Value2", "Value3" } Equals: { "Value1", "Value2", "Value3" } + { Value1, Value2, Value3 } Equals: { Value1, Value2, Value3 } ToString.tests.cpp:: PASSED: - CHECK_THAT( parseEnums( "ClassName::EnumName::Value1,ClassName::EnumName::Value2 , ClassName::EnumName::Value3" ), Equals( std::vector{"Value1", "Value2", "Value3"} ) ) + CHECK_THAT( parseEnums( "ClassName::EnumName::Value1,ClassName::EnumName::Value2 , ClassName::EnumName::Value3" ), Equals( std::vector{"Value1", "Value2", "Value3"} ) ) with expansion: - { "Value1", "Value2", "Value3" } Equals: { "Value1", "Value2", "Value3" } + { Value1, Value2, Value3 } Equals: { Value1, Value2, Value3 } ------------------------------------------------------------------------------- pointer to class diff --git a/projects/SelfTest/Baselines/xml.sw.approved.txt b/projects/SelfTest/Baselines/xml.sw.approved.txt index 67e85dd8..939bd6bf 100644 --- a/projects/SelfTest/Baselines/xml.sw.approved.txt +++ b/projects/SelfTest/Baselines/xml.sw.approved.txt @@ -13552,7 +13552,7 @@ loose text artifact
- parseEnums( "" ), Equals( std::vector<std::string>{} ) + parseEnums( "" ), Equals( std::vector<Catch::StringRef>{} ) { } Equals: { } @@ -13563,26 +13563,26 @@ loose text artifact
- parseEnums( "ClassName::EnumName::Value1" ), Equals(std::vector<std::string>{"Value1"} ) + parseEnums( "ClassName::EnumName::Value1" ), Equals(std::vector<Catch::StringRef>{"Value1"} ) - { "Value1" } Equals: { "Value1" } + { Value1 } Equals: { Value1 } - parseEnums( "Value1" ), Equals( std::vector<std::string>{"Value1"} ) + parseEnums( "Value1" ), Equals( std::vector<Catch::StringRef>{"Value1"} ) - { "Value1" } Equals: { "Value1" } + { Value1 } Equals: { Value1 } - parseEnums( "EnumName::Value1" ), Equals(std::vector<std::string>{"Value1"} ) + parseEnums( "EnumName::Value1" ), Equals(std::vector<Catch::StringRef>{"Value1"} ) - { "Value1" } Equals: { "Value1" } + { Value1 } Equals: { Value1 } @@ -13590,26 +13590,26 @@ loose text artifact
- parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2" ), Equals( std::vector<std::string>{"Value1", "Value2"} ) + parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2" ), Equals( std::vector<Catch::StringRef>{"Value1", "Value2"} ) - { "Value1", "Value2" } Equals: { "Value1", "Value2" } + { Value1, Value2 } Equals: { Value1, Value2 } - parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2, ClassName::EnumName::Value3" ), Equals( std::vector<std::string>{"Value1", "Value2", "Value3"} ) + parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2, ClassName::EnumName::Value3" ), Equals( std::vector<Catch::StringRef>{"Value1", "Value2", "Value3"} ) - { "Value1", "Value2", "Value3" } Equals: { "Value1", "Value2", "Value3" } + { Value1, Value2, Value3 } Equals: { Value1, Value2, Value3 } - parseEnums( "ClassName::EnumName::Value1,ClassName::EnumName::Value2 , ClassName::EnumName::Value3" ), Equals( std::vector<std::string>{"Value1", "Value2", "Value3"} ) + parseEnums( "ClassName::EnumName::Value1,ClassName::EnumName::Value2 , ClassName::EnumName::Value3" ), Equals( std::vector<Catch::StringRef>{"Value1", "Value2", "Value3"} ) - { "Value1", "Value2", "Value3" } Equals: { "Value1", "Value2", "Value3" } + { Value1, Value2, Value3 } Equals: { Value1, Value2, Value3 } diff --git a/projects/SelfTest/IntrospectiveTests/ToString.tests.cpp b/projects/SelfTest/IntrospectiveTests/ToString.tests.cpp index fc0e2a4f..caa924f5 100644 --- a/projects/SelfTest/IntrospectiveTests/ToString.tests.cpp +++ b/projects/SelfTest/IntrospectiveTests/ToString.tests.cpp @@ -10,24 +10,24 @@ TEST_CASE( "parseEnums", "[Strings][enums]" ) { using Catch::Detail::parseEnums; SECTION( "No enums" ) - CHECK_THAT( parseEnums( "" ), Equals( std::vector{} ) ); + CHECK_THAT( parseEnums( "" ), Equals( std::vector{} ) ); SECTION( "One enum value" ) { CHECK_THAT( parseEnums( "ClassName::EnumName::Value1" ), - Equals(std::vector{"Value1"} ) ); + Equals(std::vector{"Value1"} ) ); CHECK_THAT( parseEnums( "Value1" ), - Equals( std::vector{"Value1"} ) ); + Equals( std::vector{"Value1"} ) ); CHECK_THAT( parseEnums( "EnumName::Value1" ), - Equals(std::vector{"Value1"} ) ); + Equals(std::vector{"Value1"} ) ); } SECTION( "Multiple enum values" ) { CHECK_THAT( parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2" ), - Equals( std::vector{"Value1", "Value2"} ) ); + Equals( std::vector{"Value1", "Value2"} ) ); CHECK_THAT( parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2, ClassName::EnumName::Value3" ), - Equals( std::vector{"Value1", "Value2", "Value3"} ) ); + Equals( std::vector{"Value1", "Value2", "Value3"} ) ); CHECK_THAT( parseEnums( "ClassName::EnumName::Value1,ClassName::EnumName::Value2 , ClassName::EnumName::Value3" ), - Equals( std::vector{"Value1", "Value2", "Value3"} ) ); + Equals( std::vector{"Value1", "Value2", "Value3"} ) ); } }