iterator_range_ut.cpp 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "iterator_range.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. #include <util/generic/algorithm.h>
  4. #include <util/generic/vector.h>
  5. Y_UNIT_TEST_SUITE(IteratorRange) {
  6. Y_UNIT_TEST(DefaultConstructor) {
  7. TIteratorRange<int*> range;
  8. UNIT_ASSERT(range.empty());
  9. }
  10. Y_UNIT_TEST(DefaultConstructorSentinel) {
  11. TIteratorRange<int*, void*> range;
  12. UNIT_ASSERT(range.empty());
  13. }
  14. Y_UNIT_TEST(RangeBasedForLoop) {
  15. // compileability test
  16. for (int i : TIteratorRange<int*>()) {
  17. Y_UNUSED(i);
  18. }
  19. }
  20. Y_UNIT_TEST(RangeBasedForLoopSentinel) {
  21. // compileability test
  22. for (int i : TIteratorRange<int*, void*>()) {
  23. Y_UNUSED(i);
  24. }
  25. }
  26. Y_UNIT_TEST(Works) {
  27. const int values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  28. auto range = MakeIteratorRange(values, values + Y_ARRAY_SIZE(values));
  29. UNIT_ASSERT_VALUES_EQUAL(range.size(), Y_ARRAY_SIZE(values));
  30. UNIT_ASSERT(Equal(range.begin(), range.end(), values));
  31. UNIT_ASSERT(!range.empty());
  32. }
  33. Y_UNIT_TEST(WorksSentinel) {
  34. struct TRangeSentinel {
  35. };
  36. struct TEnumerator {
  37. ui32 operator*() const {
  38. return Cur;
  39. }
  40. void operator++() {
  41. ++Cur;
  42. }
  43. bool operator!=(const TRangeSentinel&) const {
  44. return Cur < End;
  45. }
  46. ui32 Cur;
  47. ui32 End;
  48. };
  49. auto range = MakeIteratorRange(TEnumerator{0, 10}, TRangeSentinel{});
  50. UNIT_ASSERT(!range.empty());
  51. ui32 i = 0;
  52. for (auto j : range) {
  53. UNIT_ASSERT_VALUES_EQUAL(j, i++);
  54. }
  55. UNIT_ASSERT_VALUES_EQUAL(i, 10);
  56. }
  57. Y_UNIT_TEST(OperatorsAndReferences) {
  58. TVector<size_t> values{1, 2, 3, 4, 5};
  59. auto range = MakeIteratorRange(values.begin(), values.end());
  60. UNIT_ASSERT_VALUES_EQUAL(range[2], 3);
  61. UNIT_ASSERT_VALUES_EQUAL(range[range[2]], 4);
  62. *values.begin() = 100500;
  63. UNIT_ASSERT_VALUES_EQUAL(range[0], 100500);
  64. range[0] = 100501;
  65. UNIT_ASSERT_VALUES_EQUAL(range[0], 100501);
  66. TVector<bool> valuesBool{false, true, false, false, false, false, true};
  67. auto rangeBVector = MakeIteratorRange(valuesBool.begin(), valuesBool.end());
  68. UNIT_ASSERT_VALUES_EQUAL(rangeBVector[1], true);
  69. rangeBVector[0] = true;
  70. valuesBool.back() = false;
  71. UNIT_ASSERT_VALUES_EQUAL(rangeBVector[0], true);
  72. UNIT_ASSERT_VALUES_EQUAL(rangeBVector[2], false);
  73. UNIT_ASSERT_VALUES_EQUAL(rangeBVector[6], false);
  74. }
  75. Y_UNIT_TEST(CanUseInAlgorithms) {
  76. const int values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  77. auto range = MakeIteratorRange(values, values + Y_ARRAY_SIZE(values));
  78. // more like compileability test
  79. // we should be able to use TIteratorRange as a container parameter for standard algorithms
  80. UNIT_ASSERT(AllOf(range, [](int x) { return x > 0; }));
  81. }
  82. } // Y_UNIT_TEST_SUITE(IteratorRange)