enum_ut.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. );
  24. DEFINE_ENUM(ECustomDomainName,
  25. ((A) (1) ("value_a"))
  26. ((B) (2) ("value_b"))
  27. );
  28. TEST(TFormatTest, Enum)
  29. {
  30. EXPECT_EQ("Red", Format("%v", EColor::Red));
  31. EXPECT_EQ("red", Format("%lv", EColor::Red));
  32. EXPECT_EQ("BlackAndWhite", Format("%v", EColor::BlackAndWhite));
  33. EXPECT_EQ("black_and_white", Format("%lv", EColor::BlackAndWhite));
  34. EXPECT_EQ("EColor(100)", Format("%v", EColor(100)));
  35. EXPECT_EQ("JavaScript", Format("%v", ELangs::JavaScript));
  36. EXPECT_EQ("java_script", Format("%lv", ELangs::JavaScript));
  37. EXPECT_EQ("None", Format("%v", ELangs::None));
  38. EXPECT_EQ("none", Format("%lv", ELangs::None));
  39. EXPECT_EQ("Cpp | Go", Format("%v", ELangs::Cpp | ELangs::Go));
  40. EXPECT_EQ("cpp | go", Format("%lv", ELangs::Cpp | ELangs::Go));
  41. auto four = ELangs::Cpp | ELangs::Go | ELangs::Python | ELangs::JavaScript;
  42. EXPECT_EQ("Cpp | Go | Python | JavaScript", Format("%v", four));
  43. EXPECT_EQ("cpp | go | python | java_script", Format("%lv", four));
  44. }
  45. TEST(TFormatEnumTest, FormatEnumWithCustomDomainName)
  46. {
  47. EXPECT_EQ("value_a", FormatEnum(ECustomDomainName::A));
  48. EXPECT_EQ("value_b", FormatEnum(ECustomDomainName::B));
  49. }
  50. TEST(TParseEnumTest, ParseEnumWithCustomDomainName)
  51. {
  52. EXPECT_EQ(ECustomDomainName::A, TryParseEnum<ECustomDomainName>("value_a"));
  53. EXPECT_EQ(ECustomDomainName::B, TryParseEnum<ECustomDomainName>("value_b"));
  54. EXPECT_EQ(std::nullopt, TryParseEnum<ECustomDomainName>("b"));
  55. }
  56. TEST(TParseEnumTest, ParseBitEnum)
  57. {
  58. EXPECT_EQ(ELangs::None, TryParseEnum<ELangs>(""));
  59. EXPECT_EQ(ELangs::Cpp, TryParseEnum<ELangs>("cpp"));
  60. EXPECT_EQ(ELangs::Cpp | ELangs::Rust, TryParseEnum<ELangs>("cpp|rust"));
  61. EXPECT_EQ(ELangs::Cpp | ELangs::Rust, TryParseEnum<ELangs>("cpp | rust"));
  62. EXPECT_EQ(std::nullopt, TryParseEnum<ELangs>("unk | rust"));
  63. }
  64. ////////////////////////////////////////////////////////////////////////////////
  65. } // namespace
  66. } // namespace NYT