enum_ut.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include <library/cpp/testing/gtest/gtest.h>
  2. #include <library/cpp/yt/string/enum.h>
  3. #include <library/cpp/yt/string/format.h>
  4. #include <limits>
  5. namespace NYT {
  6. namespace {
  7. ////////////////////////////////////////////////////////////////////////////////
  8. // Some compile-time sanity checks.
  9. DEFINE_ENUM(ESample, (One)(Two));
  10. static_assert(CFormattable<ESample>);
  11. static_assert(CFormattable<TEnumIndexedArray<ESample, int>>);
  12. DEFINE_ENUM(EColor,
  13. (Red)
  14. (BlackAndWhite)
  15. );
  16. DEFINE_BIT_ENUM(ELangs,
  17. ((None) (0x00))
  18. ((Cpp) (0x01))
  19. ((Go) (0x02))
  20. ((Rust) (0x04))
  21. ((Python) (0x08))
  22. ((JavaScript) (0x10))
  23. ((CppGo) (0x03))
  24. ((All) (0x1f))
  25. );
  26. DEFINE_BIT_ENUM(ELangsWithUnknown,
  27. ((None) (0x00))
  28. ((Cpp) (0x01))
  29. ((Go) (0x02))
  30. ((Rust) (0x04))
  31. ((Python) (0x08))
  32. ((JavaScript) (0x10))
  33. ((CppGo) (0x03))
  34. ((All) (0x1f))
  35. ((Unknown) (0x20))
  36. );
  37. DEFINE_ENUM_UNKNOWN_VALUE(ELangsWithUnknown, Unknown);
  38. DEFINE_ENUM(ECustomDomainName,
  39. ((A) (1) ("value_a"))
  40. ((B) (2) ("value_b"))
  41. );
  42. DEFINE_ENUM(EColorWithUnknown,
  43. (Red)
  44. (Green)
  45. (Unknown)
  46. );
  47. DEFINE_ENUM_UNKNOWN_VALUE(EColorWithUnknown, Unknown);
  48. DEFINE_BIT_ENUM(EBitEnumWithoutNone,
  49. ((Some)(1))
  50. );
  51. TEST(TFormatTest, Enum)
  52. {
  53. EXPECT_EQ("Red", Format("%v", EColor::Red));
  54. EXPECT_EQ("red", Format("%lv", EColor::Red));
  55. EXPECT_EQ("BlackAndWhite", Format("%v", EColor::BlackAndWhite));
  56. EXPECT_EQ("black_and_white", Format("%lv", EColor::BlackAndWhite));
  57. EXPECT_EQ("EColor::unknown-100", Format("%v", EColor(100)));
  58. EXPECT_EQ("Cpp | ELangs::unknown-32", Format("%v", ELangs(0x21)));
  59. EXPECT_EQ("JavaScript", Format("%v", ELangs::JavaScript));
  60. EXPECT_EQ("java_script", Format("%lv", ELangs::JavaScript));
  61. EXPECT_EQ("None", Format("%v", ELangs::None));
  62. EXPECT_EQ("none", Format("%lv", ELangs::None));
  63. EXPECT_EQ("", Format("%v", EBitEnumWithoutNone()));
  64. EXPECT_EQ("Cpp | Go", Format("%v", ELangs::Cpp | ELangs::Go));
  65. EXPECT_EQ("cpp | go", Format("%lv", ELangs::Cpp | ELangs::Go));
  66. auto four = ELangs::Cpp | ELangs::Go | ELangs::Python | ELangs::JavaScript;
  67. EXPECT_EQ("Cpp | Go | Python | JavaScript", Format("%v", four));
  68. EXPECT_EQ("cpp | go | python | java_script", Format("%lv", four));
  69. }
  70. TEST(TFormatEnumTest, FormatEnumWithCustomDomainName)
  71. {
  72. EXPECT_EQ("value_a", FormatEnum(ECustomDomainName::A));
  73. EXPECT_EQ("value_b", FormatEnum(ECustomDomainName::B));
  74. }
  75. TEST(TParseEnumTest, ParseUnknown)
  76. {
  77. EXPECT_EQ(std::nullopt, TryParseEnum<EColor>("yellow"));
  78. EXPECT_THROW(ParseEnum<EColor>("yellow"), TSimpleException);
  79. EXPECT_EQ(std::nullopt, TryParseEnum<EColorWithUnknown>("yellow"));
  80. EXPECT_EQ(EColorWithUnknown::Unknown, TryParseEnum<EColorWithUnknown>("yellow", /*enableUnknown*/ true));
  81. EXPECT_EQ(EColorWithUnknown::Unknown, ParseEnum<EColorWithUnknown>("yellow"));
  82. EXPECT_EQ(std::nullopt, TryParseEnum<ELangs>("cpp | haskell"));
  83. EXPECT_THROW(ParseEnum<ELangs>("cpp | haskell"), TSimpleException);
  84. EXPECT_EQ(ELangsWithUnknown::Cpp | ELangsWithUnknown::Unknown, TryParseEnum<ELangsWithUnknown>("cpp | haskell", /*enableUnknown*/ true));
  85. EXPECT_EQ(ELangsWithUnknown::Cpp | ELangsWithUnknown::Unknown, ParseEnum<ELangsWithUnknown>("cpp | haskell"));
  86. }
  87. TEST(TParseEnumTest, ParseEnumWithCustomDomainName)
  88. {
  89. EXPECT_EQ(ECustomDomainName::A, TryParseEnum<ECustomDomainName>("value_a"));
  90. EXPECT_EQ(ECustomDomainName::B, TryParseEnum<ECustomDomainName>("value_b"));
  91. EXPECT_EQ(std::nullopt, TryParseEnum<ECustomDomainName>("b"));
  92. }
  93. TEST(TParseEnumTest, ParseBitEnum)
  94. {
  95. EXPECT_EQ(ELangs::None, TryParseEnum<ELangs>(""));
  96. EXPECT_EQ(ELangs::Cpp, TryParseEnum<ELangs>("cpp"));
  97. EXPECT_EQ(ELangs::Cpp | ELangs::Rust, TryParseEnum<ELangs>("cpp|rust"));
  98. EXPECT_EQ(ELangs::Cpp | ELangs::Rust, TryParseEnum<ELangs>("cpp | rust"));
  99. EXPECT_EQ(std::nullopt, TryParseEnum<ELangs>("haskell | rust"));
  100. }
  101. ////////////////////////////////////////////////////////////////////////////////
  102. } // namespace
  103. } // namespace NYT