#include #include #include #include #include using namespace dce::core; enum class Typical : u8 { R, G, B }; enum class FunnyRGB : u16 { R = 63, G = 31, B = 1, }; template struct EnumFlagSetTest : public ::testing::Test { protected: }; using Types = ::testing::Types< Typical, FunnyRGB >; TYPED_TEST_SUITE(EnumFlagSetTest, Types); TYPED_TEST(EnumFlagSetTest, ConstructsWithNone) { auto set = EnumFlagSet::none(); ASSERT_TRUE(not set.contains(TypeParam::R)); ASSERT_TRUE(not set.contains(TypeParam::G)); ASSERT_TRUE(not set.contains(TypeParam::B)); } TYPED_TEST(EnumFlagSetTest, ConstructsWithAll) { auto set = EnumFlagSet::all(); ASSERT_TRUE(set.contains(TypeParam::R)); ASSERT_TRUE(set.contains(TypeParam::G)); ASSERT_TRUE(set.contains(TypeParam::B)); } TYPED_TEST(EnumFlagSetTest, ConstructsWithOnlyA) { auto set = EnumFlagSet::only(TypeParam::R); ASSERT_TRUE(set.contains(TypeParam::R)); ASSERT_TRUE(not set.contains(TypeParam::G)); ASSERT_TRUE(not set.contains(TypeParam::B)); } TYPED_TEST(EnumFlagSetTest, ConstructsWithOnlyAAndC) { auto set = EnumFlagSet::only(TypeParam::R, TypeParam::B); ASSERT_TRUE(set.contains(TypeParam::R)); ASSERT_TRUE(not set.contains(TypeParam::G)); ASSERT_TRUE(set.contains(TypeParam::B)); } TYPED_TEST(EnumFlagSetTest, ConstructsWithOnlyAAndBAndC) { auto set = EnumFlagSet::only(TypeParam::R, TypeParam::G, TypeParam::B); ASSERT_TRUE(set.contains(TypeParam::R)); ASSERT_TRUE(set.contains(TypeParam::G)); ASSERT_TRUE(set.contains(TypeParam::B)); } TYPED_TEST(EnumFlagSetTest, ClearsSetsProperly) { auto set = EnumFlagSet::only(TypeParam::R); ASSERT_TRUE(set.contains(TypeParam::R)); ASSERT_TRUE(not set.contains(TypeParam::G)); ASSERT_TRUE(not set.contains(TypeParam::B)); set.set(TypeParam::B); ASSERT_TRUE(set.contains(TypeParam::R)); ASSERT_TRUE(not set.contains(TypeParam::G)); ASSERT_TRUE(set.contains(TypeParam::B)); set.clear(TypeParam::R); set.set(TypeParam::G); ASSERT_TRUE(not set.contains(TypeParam::R)); ASSERT_TRUE(set.contains(TypeParam::G)); ASSERT_TRUE(set.contains(TypeParam::B)); } TYPED_TEST(EnumFlagSetTest, WithAndWithout) { auto set = EnumFlagSet::only(TypeParam::R); ASSERT_TRUE(set.contains(TypeParam::R)); ASSERT_TRUE(not set.without(TypeParam::R).contains(TypeParam::R)); ASSERT_TRUE(set.contains(TypeParam::R)); ASSERT_TRUE(not set.contains(TypeParam::G)); ASSERT_TRUE(set.with(TypeParam::G).contains(TypeParam::G)); ASSERT_TRUE(set.with(TypeParam::B).contains(TypeParam::B)); ASSERT_TRUE(not set.contains(TypeParam::B)); }