va_args_ut.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "va_args.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. Y_UNIT_TEST_SUITE(TMacroVarargMapTest) {
  4. Y_UNIT_TEST(TestMapArgs) {
  5. static const char COMBINED[] = Y_MAP_ARGS(Y_STRINGIZE, 1, 2, 3);
  6. UNIT_ASSERT_STRINGS_EQUAL(COMBINED, "123");
  7. }
  8. Y_UNIT_TEST(TestMapArgsWithLast) {
  9. #define ADD(x) x +
  10. #define ID(x) x
  11. static const int SUM = Y_MAP_ARGS_WITH_LAST(ADD, ID, 1, 2, 3, 4 + 5);
  12. UNIT_ASSERT_VALUES_EQUAL(SUM, 1 + 2 + 3 + 4 + 5);
  13. #undef ADD
  14. #undef ID
  15. }
  16. Y_UNIT_TEST(TestMapArgsN) {
  17. #define MAP_ARG(INDEX, X) Y_STRINGIZE(X)
  18. #define MAP_INDEX(INDEX, X) Y_STRINGIZE(INDEX)
  19. static const char COMBINED_ARGS[] = Y_MAP_ARGS_N(MAP_ARG, 1, 2, 3);
  20. UNIT_ASSERT_STRINGS_EQUAL(COMBINED_ARGS, "123");
  21. static const char COMBINED_INDEXES[] = Y_MAP_ARGS_N(MAP_INDEX, 1, 2, 3);
  22. UNIT_ASSERT_STRINGS_EQUAL(COMBINED_INDEXES, "321");
  23. #undef MAP_INDEX
  24. #undef MAP_ARG
  25. }
  26. Y_UNIT_TEST(TestMapArgsWithLastN) {
  27. #define ADD_ARG(INDEX, X) X +
  28. #define ID_ARG(INDEX, X) X
  29. #define MAP_INDEX(INDEX, X) Y_STRINGIZE(INDEX)
  30. static const int SUM = Y_MAP_ARGS_WITH_LAST_N(ADD_ARG, ID_ARG, 1, 2, 3, 4 + 5);
  31. UNIT_ASSERT_VALUES_EQUAL(SUM, 1 + 2 + 3 + 4 + 5);
  32. static const char COMBINED_INDEXES[] = Y_MAP_ARGS_WITH_LAST_N(MAP_INDEX, MAP_INDEX, 1, 2, 3, 4 + 5);
  33. UNIT_ASSERT_STRINGS_EQUAL(COMBINED_INDEXES, "4321");
  34. #undef MAP_INDEX
  35. #undef ADD_ARG
  36. #undef ID_ARG
  37. }
  38. } // Y_UNIT_TEST_SUITE(TMacroVarargMapTest)
  39. Y_UNIT_TEST_SUITE(TestVaArgs) {
  40. Y_UNIT_TEST(Count) {
  41. // UNIT_ASSERT((Y_COUNT_ARGS() == 0)); // FIXME: make this case work after __VA_OPT__ (c++20)
  42. UNIT_ASSERT((Y_COUNT_ARGS(1) == 1));
  43. UNIT_ASSERT((Y_COUNT_ARGS(1, 2) == 2));
  44. UNIT_ASSERT((Y_COUNT_ARGS(1, 2, 3) == 3));
  45. UNIT_ASSERT((Y_COUNT_ARGS(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0) == 20));
  46. }
  47. Y_UNIT_TEST(GetElem) {
  48. UNIT_ASSERT((Y_GET_ARG(0, 1) == 1));
  49. UNIT_ASSERT((Y_GET_ARG(0, 0, 1, 2, 3, 4, 5) == 0));
  50. UNIT_ASSERT((Y_GET_ARG(1, 0, 1, 2, 3, 4, 5) == 1));
  51. UNIT_ASSERT((Y_GET_ARG(2, 0, 1, 2, 3, 4, 5) == 2));
  52. UNIT_ASSERT((Y_GET_ARG(3, 0, 1, 2, 3, 4, 5) == 3));
  53. UNIT_ASSERT((Y_GET_ARG(4, 0, 1, 2, 3, 4, 5) == 4));
  54. UNIT_ASSERT((Y_GET_ARG(5, 0, 1, 2, 3, 4, 5) == 5));
  55. }
  56. Y_UNIT_TEST(MapArgs) {
  57. #define MAP(x) x + /* NOLINT */
  58. // UNIT_ASSERT((Y_MAP_ARGS(MAP) 0 == 0)); // FIXME: make this case work after __VA_OPT__ (c++20)
  59. UNIT_ASSERT((Y_MAP_ARGS(MAP, 1, 2, 3, 4) 0 == 10));
  60. #undef MAP
  61. }
  62. Y_UNIT_TEST(MapArgsWithLast) {
  63. #define MAP(x) x + /* NOLINT */
  64. #define MAP_LAST(x) x
  65. UNIT_ASSERT((Y_MAP_ARGS_WITH_LAST(MAP, MAP_LAST, 1, 2, 3, 4) == 10));
  66. #undef MAP_LAST
  67. #undef MAP
  68. }
  69. Y_UNIT_TEST(AllButLast) {
  70. const char array[] = {Y_ALL_BUT_LAST(1, 2, 3, 4, 5)};
  71. UNIT_ASSERT((sizeof(array) == 4));
  72. UNIT_ASSERT((array[0] == 1));
  73. UNIT_ASSERT((array[1] == 2));
  74. UNIT_ASSERT((array[2] == 3));
  75. UNIT_ASSERT((array[3] == 4));
  76. }
  77. Y_UNIT_TEST(Last) {
  78. UNIT_ASSERT((Y_LAST(1) == 1));
  79. UNIT_ASSERT((Y_LAST(1, 2, 3) == 3));
  80. }
  81. Y_UNIT_TEST(ImplDispatcher) {
  82. #define I1(x) (x)
  83. #define I2(x, y) ((x) + (y))
  84. #define I3(x, y, z) ((x) + (y) + (z))
  85. #define I(...) Y_PASS_VA_ARGS(Y_MACRO_IMPL_DISPATCHER_3(__VA_ARGS__, I3, I2, I1)(__VA_ARGS__))
  86. UNIT_ASSERT((I(1) == 1));
  87. UNIT_ASSERT((I(1, 2) == 3));
  88. UNIT_ASSERT((I(1, 2, 3) == 6));
  89. #undef I
  90. #undef I3
  91. #undef I2
  92. #undef I1
  93. }
  94. } // Y_UNIT_TEST_SUITE(TestVaArgs)