#include #include #include namespace NYT { namespace { //////////////////////////////////////////////////////////////////////////////// DEFINE_ENUM_WITH_UNDERLYING_TYPE(ECardinal, char, ((West) (0)) ((North) (1)) ((East) (2)) ((South) (3)) ); DEFINE_BIT_ENUM_WITH_UNDERLYING_TYPE(EFeatures, ui8, ((None) (0x0000)) ((First) (0x0001)) ((Second)(0x0002)) ); DEFINE_BIT_ENUM(ELangsWithUnknown, ((None) (0x00)) ((Cpp) (0x01)) ((Go) (0x02)) ((Rust) (0x04)) ((Python) (0x08)) ((JavaScript) (0x10)) ((CppGo) (0x03)) ((All) (0x1f)) ((Unknown) (0x20)) ); DEFINE_ENUM_UNKNOWN_VALUE(ELangsWithUnknown, Unknown); DEFINE_ENUM(EColorWithUnknown, ((Red) (0)) ((Green) (1)) ((Unknown) (2)) ); DEFINE_ENUM_UNKNOWN_VALUE(EColorWithUnknown, Unknown); TEST(TCastTest, TryCheckedEnumCast) { EXPECT_EQ((TryCheckedEnumCast(2)), ECardinal::East); EXPECT_EQ((TryCheckedEnumCast(3)), ECardinal::South); EXPECT_FALSE((TryCheckedEnumCast(100))); EXPECT_FALSE((TryCheckedEnumCast(300))); EXPECT_EQ((TryCheckedEnumCast(0)), EFeatures::None); EXPECT_EQ((TryCheckedEnumCast(ToUnderlying(EFeatures::First))), EFeatures::First); EXPECT_EQ((TryCheckedEnumCast(ToUnderlying(EFeatures::Second))), EFeatures::Second); EXPECT_EQ((TryCheckedEnumCast(ToUnderlying(EFeatures::First))), EFeatures::First); EXPECT_EQ((TryCheckedEnumCast(ToUnderlying(EFeatures::First | EFeatures::Second))), EFeatures::First | EFeatures::Second); EXPECT_FALSE((TryCheckedEnumCast(0x10))); EXPECT_FALSE(TryCheckedEnumCast(3)); EXPECT_EQ(TryCheckedEnumCast(3, /*enableUnknown*/ true), EColorWithUnknown::Unknown); EXPECT_FALSE(TryCheckedEnumCast(0x40)); EXPECT_EQ(TryCheckedEnumCast(0x40, /*enableUnknown*/ true), ELangsWithUnknown::Unknown); EXPECT_EQ(TryCheckedEnumCast(0x41, /*enableUnknown*/ true), ELangsWithUnknown::Unknown | ELangsWithUnknown::Cpp); } TEST(TCastTest, CheckedEnumCast) { EXPECT_EQ((CheckedEnumCast(2)), ECardinal::East); EXPECT_EQ((CheckedEnumCast(3)), ECardinal::South); EXPECT_THROW((CheckedEnumCast(100)), TSimpleException); EXPECT_THROW((CheckedEnumCast(300)), TSimpleException); EXPECT_EQ((CheckedEnumCast(0)), EFeatures::None); EXPECT_EQ((CheckedEnumCast(ToUnderlying(EFeatures::First))), EFeatures::First); EXPECT_EQ((CheckedEnumCast(ToUnderlying(EFeatures::Second))), EFeatures::Second); EXPECT_EQ((CheckedEnumCast(ToUnderlying(EFeatures::First))), EFeatures::First); EXPECT_EQ((CheckedEnumCast(ToUnderlying(EFeatures::First | EFeatures::Second))), EFeatures::First | EFeatures::Second); EXPECT_THROW((CheckedEnumCast(0x10)), TSimpleException); EXPECT_EQ(CheckedEnumCast(3), EColorWithUnknown::Unknown); EXPECT_EQ(CheckedEnumCast(0x40), ELangsWithUnknown::Unknown); EXPECT_EQ(CheckedEnumCast(0x41), ELangsWithUnknown::Unknown | ELangsWithUnknown::Cpp); } //////////////////////////////////////////////////////////////////////////////// } // namespace } // namespace NYT