enum.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include <gtest/gtest.h>
  2. #include <entt/core/enum.hpp>
  3. #include <entt/core/type_traits.hpp>
  4. enum class detected {
  5. foo = 0x01,
  6. bar = 0x02,
  7. quux = 0x04,
  8. _entt_enum_as_bitmask
  9. };
  10. enum class registered {
  11. foo = 0x01,
  12. bar = 0x02,
  13. quux = 0x04
  14. };
  15. template<>
  16. struct entt::enum_as_bitmask<registered>
  17. : std::true_type {};
  18. template<typename Type>
  19. struct Enum: testing::Test {
  20. using type = Type;
  21. };
  22. using EnumTypes = ::testing::Types<detected, registered>;
  23. TYPED_TEST_SUITE(Enum, EnumTypes);
  24. TYPED_TEST(Enum, Functionalities) {
  25. using enum_type = typename TestFixture::type;
  26. ASSERT_TRUE(!!((enum_type::foo | enum_type::bar) & enum_type::foo));
  27. ASSERT_TRUE(!!((enum_type::foo | enum_type::bar) & enum_type::bar));
  28. ASSERT_TRUE(!((enum_type::foo | enum_type::bar) & enum_type::quux));
  29. ASSERT_TRUE(!!((enum_type::foo ^ enum_type::bar) & enum_type::foo));
  30. ASSERT_TRUE(!((enum_type::foo ^ enum_type::foo) & enum_type::foo));
  31. ASSERT_TRUE(!(~enum_type::foo & enum_type::foo));
  32. ASSERT_TRUE(!!(~enum_type::foo & enum_type::bar));
  33. ASSERT_TRUE(enum_type::foo == enum_type::foo);
  34. ASSERT_TRUE(enum_type::foo != enum_type::bar);
  35. enum_type value = enum_type::foo;
  36. ASSERT_TRUE(!!(value & enum_type::foo));
  37. ASSERT_TRUE(!(value & enum_type::bar));
  38. ASSERT_TRUE(!(value & enum_type::quux));
  39. value |= (enum_type::bar | enum_type::quux);
  40. ASSERT_TRUE(!!(value & enum_type::foo));
  41. ASSERT_TRUE(!!(value & enum_type::bar));
  42. ASSERT_TRUE(!!(value & enum_type::quux));
  43. value &= (enum_type::bar | enum_type::quux);
  44. ASSERT_TRUE(!(value & enum_type::foo));
  45. ASSERT_TRUE(!!(value & enum_type::bar));
  46. ASSERT_TRUE(!!(value & enum_type::quux));
  47. value ^= enum_type::bar;
  48. ASSERT_TRUE(!(value & enum_type::foo));
  49. ASSERT_TRUE(!(value & enum_type::bar));
  50. ASSERT_TRUE(!!(value & enum_type::quux));
  51. }