1 #include "catch.hpp"
2 
3 #include "internal/catch_enum_values_registry.h"
4 
5 enum class EnumClass3 { Value1, Value2, Value3, Value4 };
6 
7 struct UsesSentinel {
8     using const_iterator = int const*;
9     using const_sentinel = std::nullptr_t;
10 
beginUsesSentinel11     const_iterator begin() const { return nullptr; }
endUsesSentinel12     const_iterator end() const { return nullptr; }
13 };
14 
15 TEST_CASE( "parseEnums", "[Strings][enums]" ) {
16     using namespace Catch::Matchers;
17     using Catch::Detail::parseEnums;
18 
19     SECTION( "No enums" )
20         CHECK_THAT( parseEnums( "" ), Equals( std::vector<Catch::StringRef>{} ) );
21 
22     SECTION( "One enum value" ) {
23         CHECK_THAT( parseEnums( "ClassName::EnumName::Value1" ),
24                 Equals(std::vector<Catch::StringRef>{"Value1"} ) );
25         CHECK_THAT( parseEnums( "Value1" ),
26                 Equals( std::vector<Catch::StringRef>{"Value1"} ) );
27         CHECK_THAT( parseEnums( "EnumName::Value1" ),
28                 Equals(std::vector<Catch::StringRef>{"Value1"} ) );
29     }
30 
31     SECTION( "Multiple enum values" ) {
32         CHECK_THAT( parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2" ),
33                     Equals( std::vector<Catch::StringRef>{"Value1", "Value2"} ) );
34         CHECK_THAT( parseEnums( "ClassName::EnumName::Value1, ClassName::EnumName::Value2, ClassName::EnumName::Value3" ),
35                     Equals( std::vector<Catch::StringRef>{"Value1", "Value2", "Value3"} ) );
36         CHECK_THAT( parseEnums( "ClassName::EnumName::Value1,ClassName::EnumName::Value2 , ClassName::EnumName::Value3" ),
37                     Equals( std::vector<Catch::StringRef>{"Value1", "Value2", "Value3"} ) );
38     }
39 }
40 
41 TEST_CASE( "Directly creating an EnumInfo" ) {
42 
43     using namespace Catch::Detail;
44     std::unique_ptr<EnumInfo> enumInfo = makeEnumInfo( "EnumName", "EnumName::Value1, EnumName::Value2", {0, 1} );
45 
46     CHECK( enumInfo->lookup(0) == "Value1" );
47     CHECK( enumInfo->lookup(1) == "Value2" );
48     CHECK( enumInfo->lookup(3) == "{** unexpected enum value **}" );
49 }
50 
51 TEST_CASE("Range type with sentinel") {
52     CHECK( Catch::Detail::stringify(UsesSentinel{}) == "{  }" );
53 }