cast_ut.cpp 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <library/cpp/testing/gtest/gtest.h>
  2. #include <library/cpp/yt/misc/cast.h>
  3. #include <library/cpp/yt/misc/enum.h>
  4. namespace NYT {
  5. namespace {
  6. ////////////////////////////////////////////////////////////////////////////////
  7. DEFINE_ENUM_WITH_UNDERLYING_TYPE(ECardinal, char,
  8. ((West) (0))
  9. ((North) (1))
  10. ((East) (2))
  11. ((South) (3))
  12. );
  13. DEFINE_BIT_ENUM_WITH_UNDERLYING_TYPE(EFeatures, ui8,
  14. ((None) (0x0000))
  15. ((First) (0x0001))
  16. ((Second)(0x0002))
  17. );
  18. DEFINE_BIT_ENUM(ELangsWithUnknown,
  19. ((None) (0x00))
  20. ((Cpp) (0x01))
  21. ((Go) (0x02))
  22. ((Rust) (0x04))
  23. ((Python) (0x08))
  24. ((JavaScript) (0x10))
  25. ((CppGo) (0x03))
  26. ((All) (0x1f))
  27. ((Unknown) (0x20))
  28. );
  29. DEFINE_ENUM_UNKNOWN_VALUE(ELangsWithUnknown, Unknown);
  30. DEFINE_ENUM(EColorWithUnknown,
  31. ((Red) (0))
  32. ((Green) (1))
  33. ((Unknown) (2))
  34. );
  35. DEFINE_ENUM_UNKNOWN_VALUE(EColorWithUnknown, Unknown);
  36. TEST(TCastTest, TryCheckedEnumCast)
  37. {
  38. EXPECT_EQ((TryCheckedEnumCast<ECardinal, char>(2)), ECardinal::East);
  39. EXPECT_EQ((TryCheckedEnumCast<ECardinal, int>(3)), ECardinal::South);
  40. EXPECT_FALSE((TryCheckedEnumCast<ECardinal, char>(100)));
  41. EXPECT_FALSE((TryCheckedEnumCast<ECardinal, int>(300)));
  42. EXPECT_EQ((TryCheckedEnumCast<EFeatures, ui8>(0)), EFeatures::None);
  43. EXPECT_EQ((TryCheckedEnumCast<EFeatures, ui8>(ToUnderlying(EFeatures::First))), EFeatures::First);
  44. EXPECT_EQ((TryCheckedEnumCast<EFeatures, ui8>(ToUnderlying(EFeatures::Second))), EFeatures::Second);
  45. EXPECT_EQ((TryCheckedEnumCast<EFeatures, int>(ToUnderlying(EFeatures::First))), EFeatures::First);
  46. EXPECT_EQ((TryCheckedEnumCast<EFeatures, ui8>(ToUnderlying(EFeatures::First | EFeatures::Second))), EFeatures::First | EFeatures::Second);
  47. EXPECT_FALSE((TryCheckedEnumCast<EFeatures, ui8>(0x10)));
  48. EXPECT_FALSE(TryCheckedEnumCast<EColorWithUnknown>(3));
  49. EXPECT_EQ(TryCheckedEnumCast<EColorWithUnknown>(3, /*enableUnknown*/ true), EColorWithUnknown::Unknown);
  50. EXPECT_FALSE(TryCheckedEnumCast<ELangsWithUnknown>(0x40));
  51. EXPECT_EQ(TryCheckedEnumCast<ELangsWithUnknown>(0x40, /*enableUnknown*/ true), ELangsWithUnknown::Unknown);
  52. EXPECT_EQ(TryCheckedEnumCast<ELangsWithUnknown>(0x41, /*enableUnknown*/ true), ELangsWithUnknown::Unknown | ELangsWithUnknown::Cpp);
  53. }
  54. TEST(TCastTest, CheckedEnumCast)
  55. {
  56. EXPECT_EQ((CheckedEnumCast<ECardinal, char>(2)), ECardinal::East);
  57. EXPECT_EQ((CheckedEnumCast<ECardinal, int>(3)), ECardinal::South);
  58. EXPECT_THROW((CheckedEnumCast<ECardinal, char>(100)), TSimpleException);
  59. EXPECT_THROW((CheckedEnumCast<ECardinal, int>(300)), TSimpleException);
  60. EXPECT_EQ((CheckedEnumCast<EFeatures, ui8>(0)), EFeatures::None);
  61. EXPECT_EQ((CheckedEnumCast<EFeatures, ui8>(ToUnderlying(EFeatures::First))), EFeatures::First);
  62. EXPECT_EQ((CheckedEnumCast<EFeatures, ui8>(ToUnderlying(EFeatures::Second))), EFeatures::Second);
  63. EXPECT_EQ((CheckedEnumCast<EFeatures, int>(ToUnderlying(EFeatures::First))), EFeatures::First);
  64. EXPECT_EQ((CheckedEnumCast<EFeatures, ui8>(ToUnderlying(EFeatures::First | EFeatures::Second))), EFeatures::First | EFeatures::Second);
  65. EXPECT_THROW((CheckedEnumCast<EFeatures, ui8>(0x10)), TSimpleException);
  66. EXPECT_EQ(CheckedEnumCast<EColorWithUnknown>(3), EColorWithUnknown::Unknown);
  67. EXPECT_EQ(CheckedEnumCast<ELangsWithUnknown>(0x40), ELangsWithUnknown::Unknown);
  68. EXPECT_EQ(CheckedEnumCast<ELangsWithUnknown>(0x41), ELangsWithUnknown::Unknown | ELangsWithUnknown::Cpp);
  69. }
  70. ////////////////////////////////////////////////////////////////////////////////
  71. } // namespace
  72. } // namespace NYT