AzEnumTest.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/Preprocessor/Enum.h>
  9. #include <AzCore/UnitTest/TestTypes.h>
  10. namespace UnitTest
  11. {
  12. AZ_ENUM_CLASS(TestEnum,
  13. A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
  14. );
  15. AZ_ENUM(TestEnumUnscoped,
  16. X,
  17. (Y, 5)
  18. );
  19. AZ_ENUM_WITH_UNDERLYING_TYPE(TestEnum8, uint8_t,
  20. XX,
  21. (YY, 7),
  22. ZZ
  23. );
  24. AZ_ENUM_CLASS_WITH_UNDERLYING_TYPE(TestCEnum16, int16_t,
  25. (X, -10),
  26. Y,
  27. Z
  28. );
  29. TEST(AzEnumTest, BasicProperties_AreConstexpr)
  30. {
  31. // basic properties verifications:
  32. static_assert(static_cast<int>(TestEnum::A) == 0);
  33. static_assert(static_cast<int>(TestEnum::Z) == 25);
  34. // members array:
  35. static_assert(TestEnumMembers.size() == 26);
  36. static_assert(TestEnumMembers[0].m_value == TestEnum::A);
  37. static_assert(TestEnumMembers[0].m_string == "A");
  38. static_assert(TestEnumMembers[1].m_value == TestEnum::B);
  39. static_assert(TestEnumMembers[1].m_string == "B");
  40. // Unscoped-version tests
  41. static_assert(Y == 5);
  42. // 'specific underlying type'-version tests
  43. static_assert(sizeof(TestEnum8) == sizeof(uint8_t));
  44. static_assert(XX == 0);
  45. static_assert(YY == 7);
  46. static_assert(ZZ == 8);
  47. }
  48. TEST(AzEnumTest, EnumerationOverEnum_Succeeds)
  49. {
  50. auto EnumerateTestEnum = []() constexpr -> bool
  51. {
  52. int count = 0;
  53. for (TestEnumEnumeratorValueAndString enumMember : TestEnumMembers)
  54. {
  55. ++count;
  56. }
  57. return count == 26;
  58. };
  59. static_assert(EnumerateTestEnum());
  60. }
  61. TEST(AzEnumTest, FromString_WithFoundString_ReturnsEnumValue)
  62. {
  63. // optional is not dereferencable in constexpr context because of addressof
  64. // therefore we can't verify the returned value in static_assert, but we can verify that the function found something.
  65. static_assert(FromStringToTestEnum("Y").has_value());
  66. static_assert(TestEnumNamespace::FromString("X").has_value());
  67. // value verification by runtime:
  68. EXPECT_TRUE(*FromStringToTestEnum("Y") == TestEnum::Y);
  69. EXPECT_TRUE(*FromStringToTestEnumUnscoped("Y") == Y);
  70. // namespace accessed functions versions
  71. EXPECT_TRUE(*TestEnumNamespace::FromString("Y") == TestEnum::Y);
  72. EXPECT_TRUE(*TestEnumUnscopedNamespace::FromString("Y") == Y);
  73. // and on runtime as well
  74. EXPECT_TRUE(*FromStringToTestEnumUnscoped("X") == X);
  75. }
  76. TEST(AzEnumTest, FromString_WithNotFoundString_ReturnsInvalid)
  77. {
  78. static_assert(!FromStringToTestEnum("alien")); // nullopt in boolean context should evaluate to false
  79. static_assert(!FromStringToTestEnumUnscoped("alien"));
  80. // namespace accessed functions versions
  81. static_assert(!TestEnumNamespace::FromString("alien"));
  82. static_assert(!TestEnumUnscopedNamespace::FromString("alien"));
  83. }
  84. TEST(AzEnumTest, ToString_WithValidEnumOption_ReturnsNonEmptyString)
  85. {
  86. static_assert(ToString(TestEnum::X) == "X");
  87. static_assert(ToString(TestEnum::Y) == "Y");
  88. static_assert(ToString(TestEnum8::XX) == "XX");
  89. static_assert(ToString(TestEnum8::YY) == "YY");
  90. }
  91. TEST(AzEnumTest, ToString_WithInvalidEnumValue_ReturnsEmptyString)
  92. {
  93. static_assert(ToString(static_cast<TestEnum>(40)).empty());
  94. static_assert(ToString(static_cast<TestEnumUnscoped>(15)).empty());
  95. static_assert(ToString(static_cast<TestEnum8>(20)).empty());
  96. }
  97. TEST(AzEnumTest, TraitsBehaviorRegular)
  98. {
  99. static_assert(AzEnumTraits<TestEnum>::Members.size() == 26);
  100. }
  101. }