serialized_enum_ut.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "serialized_enum.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. #include <util/generic/deque.h>
  4. #include <util/generic/map.h>
  5. #include <util/generic/typelist.h>
  6. #include <util/generic/vector.h>
  7. Y_UNIT_TEST_SUITE(TestSerializedEnum) {
  8. Y_UNIT_TEST(RepresentationTypes) {
  9. using namespace NEnumSerializationRuntime::NDetail;
  10. static_assert(TIsPromotable<int, int>::value, "int -> int");
  11. static_assert(TIsPromotable<char, int>::value, "char -> int");
  12. static_assert(TIsPromotable<unsigned short, unsigned long>::value, "unsigned short -> unsigned long");
  13. static_assert(TIsPromotable<i64, long long>::value, "i64 -> long long");
  14. static_assert(!TIsPromotable<ui64, ui8>::value, "ui64 -> ui8");
  15. static_assert(!TIsPromotable<i64, short>::value, "i64 -> short");
  16. enum EEmpty {
  17. };
  18. UNIT_ASSERT_C((TTypeList<int, unsigned>::THave<typename TSelectEnumRepresentationType<EEmpty>::TType>::value), "empty enum using signed or unsigned integer underlying type");
  19. using TRepresentationTypeList = TTypeList<int, unsigned, long long, unsigned long long>;
  20. enum class ERegular {
  21. One = 1,
  22. Two = 2,
  23. Five = 5,
  24. };
  25. UNIT_ASSERT(TRepresentationTypeList::THave<typename TSelectEnumRepresentationType<ERegular>::TType>::value);
  26. enum class ESmall: unsigned char {
  27. Six = 6,
  28. };
  29. UNIT_ASSERT(TRepresentationTypeList::THave<typename TSelectEnumRepresentationType<ESmall>::TType>::value);
  30. enum class EHugeUnsigned: ui64 {
  31. Value = 0,
  32. };
  33. UNIT_ASSERT(TRepresentationTypeList::THave<typename TSelectEnumRepresentationType<EHugeUnsigned>::TType>::value);
  34. enum class EHugeSigned: i64 {
  35. Value = -2,
  36. };
  37. UNIT_ASSERT(TRepresentationTypeList::THave<typename TSelectEnumRepresentationType<EHugeSigned>::TType>::value);
  38. }
  39. Y_UNIT_TEST(MappedArrayView) {
  40. enum class ETestEnum: signed char {
  41. Zero = 0,
  42. One = 1,
  43. Two = 2,
  44. Three = 3,
  45. Four = 4,
  46. Eleven = 11,
  47. };
  48. const TVector<int> values = {1, 2, 3, 0, 0, 0, 11, 0, 0, 0, 0, 0, 2};
  49. const auto view = ::NEnumSerializationRuntime::TMappedArrayView<ETestEnum>{values};
  50. UNIT_ASSERT_VALUES_EQUAL(view.size(), values.size());
  51. UNIT_ASSERT_VALUES_EQUAL(view.empty(), false);
  52. UNIT_ASSERT_EQUAL(*view.begin(), ETestEnum::One);
  53. UNIT_ASSERT_EQUAL(view[6], ETestEnum::Eleven);
  54. UNIT_ASSERT_EXCEPTION(view.at(-1), std::out_of_range);
  55. UNIT_ASSERT_VALUES_EQUAL(sizeof(view[4]), sizeof(signed char));
  56. UNIT_ASSERT_VALUES_EQUAL(sizeof(values[4]), sizeof(int));
  57. for (const ETestEnum e : view) {
  58. UNIT_ASSERT_UNEQUAL(e, ETestEnum::Four);
  59. }
  60. const TVector<ETestEnum> typedValues = {ETestEnum::One, ETestEnum::Two, ETestEnum::Three, ETestEnum::Zero, ETestEnum::Zero, ETestEnum::Zero, ETestEnum::Eleven, ETestEnum::Zero, ETestEnum::Zero, ETestEnum::Zero, ETestEnum::Zero, ETestEnum::Zero, ETestEnum::Two};
  61. UNIT_ASSERT_EQUAL(typedValues, view.Materialize());
  62. const TDeque<ETestEnum> typedValuesDeque{typedValues.begin(), typedValues.end()};
  63. UNIT_ASSERT_EQUAL(typedValuesDeque, view.Materialize<TDeque>());
  64. }
  65. Y_UNIT_TEST(MappedDictView) {
  66. enum class ETestEnum: unsigned short {
  67. Zero = 0,
  68. One = 1,
  69. Two = 2,
  70. Three = 3,
  71. Four = 4,
  72. Eleven = 11,
  73. Fake = (unsigned short)(-1),
  74. };
  75. const TMap<unsigned, unsigned> map = {{0, 1}, {1, 2}, {2, 4}, {3, 8}, {4, 16}, {11, 2048}};
  76. const auto view = ::NEnumSerializationRuntime::NDetail::TMappedDictView<ETestEnum, unsigned, unsigned, decltype(map)>{map};
  77. UNIT_ASSERT_VALUES_EQUAL(view.size(), map.size());
  78. UNIT_ASSERT_VALUES_EQUAL(map.empty(), false);
  79. UNIT_ASSERT_EQUAL(view.begin()->first, ETestEnum::Zero);
  80. UNIT_ASSERT_VALUES_EQUAL(view.begin()->second, 1u);
  81. UNIT_ASSERT_VALUES_EQUAL(view.contains(ETestEnum::Fake), false);
  82. UNIT_ASSERT_VALUES_EQUAL(view.contains(ETestEnum::Four), true);
  83. UNIT_ASSERT_EXCEPTION(view.at(ETestEnum::Fake), std::out_of_range);
  84. UNIT_ASSERT_NO_EXCEPTION(view.at(ETestEnum::Eleven));
  85. UNIT_ASSERT_VALUES_EQUAL(view.at(ETestEnum::Three), 8u);
  86. unsigned mask = 0;
  87. unsigned sum = 0;
  88. for (const auto e : view) {
  89. mask |= e.second;
  90. sum += e.second;
  91. }
  92. UNIT_ASSERT_VALUES_EQUAL(mask, 2079);
  93. UNIT_ASSERT_VALUES_EQUAL(sum, 2079);
  94. const TMap<ETestEnum, unsigned> materialized = view.Materialize<TMap>();
  95. UNIT_ASSERT_VALUES_EQUAL(materialized.size(), map.size());
  96. UNIT_ASSERT_VALUES_EQUAL(materialized.at(ETestEnum::Four), 16);
  97. }
  98. } // Y_UNIT_TEST_SUITE(TestSerializedEnum)