enumerate_iterator_test.cxx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #include "iterator/enumerate_iterator.h"
  2. #include <map>
  3. #include <vector>
  4. #include "iterator/end_aware_iterator.h"
  5. #include "ranges.h"
  6. #include "xcode_gtest_helper.h"
  7. using iterator::EndAwareIterator;
  8. using iterator::EnumerateIterator;
  9. using testing::Ge;
  10. using testing::Gt;
  11. using testing::Le;
  12. using testing::Lt;
  13. using testing::Ne;
  14. // TODO: This ought to be implemented as a compiles-test
  15. TEST(EnumerateIteartor, CanCastCompatibleIterators) {
  16. std::vector<int> v{1, 2, 3, 4, 5};
  17. EnumerateIterator eai(v.begin());
  18. EnumerateIterator<std::vector<int>::const_iterator>{eai};
  19. }
  20. TEST(EnumerateIteartor, CanLieAboutIndex) {
  21. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  22. EnumerateIterator it(vec.begin(), 3);
  23. EXPECT_THAT(it->first, 3);
  24. }
  25. TEST(EnumerateIteartor, FakeIndexDoesntEffectEqualityCheck) {
  26. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  27. EXPECT_THAT(EnumerateIterator(vec.begin()),
  28. EnumerateIterator(vec.begin(), 3));
  29. EXPECT_THAT(EnumerateIterator(vec.begin()) + 3,
  30. Ne(EnumerateIterator(vec.begin(), 3)));
  31. }
  32. TEST(EnumerateIteartor, DoesNotTrackByIndex) {
  33. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  34. EnumerateIterator end(vec.end());
  35. EXPECT_THAT(decltype(end){}, Ne(end));
  36. }
  37. TEST(EnumerateIteartor, IteratorPropagatesAtEnd) {
  38. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  39. EnumerateIterator end(EndAwareIterator(vec.end(), vec.end()));
  40. EXPECT_THAT(end, iterator::sentinel);
  41. }
  42. TEST(EnumerateIteartor, CanCompareIteratorOrder) {
  43. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  44. EnumerateIterator const begin(vec.begin());
  45. EnumerateIterator const it = begin + 3;
  46. EXPECT_THAT(begin, Lt(it));
  47. EXPECT_THAT(begin, Le(it));
  48. EXPECT_THAT(it, Le(it));
  49. EXPECT_THAT(it, Gt(begin));
  50. EXPECT_THAT(it, Ge(begin));
  51. EXPECT_THAT(it, Ge(it));
  52. }
  53. TEST(EnumerateIteartor, PreIncrementAdvancesIterator) {
  54. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  55. EnumerateIterator it(vec.begin() + 1);
  56. EXPECT_THAT(it->second, 3);
  57. EXPECT_THAT((++it)->second, 2);
  58. EXPECT_THAT(it->second, 2);
  59. }
  60. TEST(EnumerateIteartor, PostIncrementReturnsCopyOfPrev) {
  61. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  62. EnumerateIterator it(vec.begin() + 1);
  63. EXPECT_THAT(it->second, 3);
  64. EXPECT_THAT((it++)->second, 3);
  65. EXPECT_THAT(it->second, 2);
  66. }
  67. TEST(EnumerateIteartor, PreDecrementAdvancesIterator) {
  68. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  69. EnumerateIterator it(vec.begin() + 1);
  70. EXPECT_THAT(it->second, 3);
  71. EXPECT_THAT((--it)->second, 5);
  72. EXPECT_THAT(it->second, 5);
  73. }
  74. TEST(EnumerateIteartor, PostDecrementReturnsCopyOfPrev) {
  75. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  76. EnumerateIterator it(vec.begin() + 1);
  77. EXPECT_THAT(it->second, 3);
  78. EXPECT_THAT((it--)->second, 3);
  79. EXPECT_THAT(it->second, 5);
  80. }
  81. TEST(EnumerateIteartor, CanWalkNStepsForward) {
  82. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  83. EnumerateIterator const begin(vec.begin());
  84. EnumerateIterator it = begin;
  85. it += 4;
  86. EXPECT_THAT(ranges::distance(begin, it), 4);
  87. }
  88. TEST(EnumerateIteartor, CanWalkNStepsBackwards) {
  89. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  90. EnumerateIterator const end(vec.end());
  91. EnumerateIterator it = end;
  92. it -= 4;
  93. EXPECT_THAT(ranges::distance(it, end), 4);
  94. }
  95. TEST(EnumerateIteartor, RandomAccessIsPassthrough) {
  96. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  97. EXPECT_THAT(EnumerateIterator(vec.begin()) + 4,
  98. EnumerateIterator(vec.begin() + 4));
  99. EXPECT_THAT(EnumerateIterator(vec.end()) - 4,
  100. EnumerateIterator(vec.end() - 4));
  101. }
  102. TEST(EnumerateIteartor, TreatsVectorIteratorAsPairIdxValue) {
  103. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  104. std::vector<std::pair<int, int>> const expected{
  105. {0, 5}, {1, 3}, {2, 2}, {3, 8}, {4, 9}, {5, 11}, {6, 2}, {7, 4}};
  106. std::vector<std::pair<int, int>> const result(EnumerateIterator(vec.begin()),
  107. EnumerateIterator(vec.end()));
  108. EXPECT_THAT(result, expected);
  109. }
  110. TEST(EnumerateIteartor, TreatsVectorIteratorAsMapIdxToValue) {
  111. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  112. std::map<int, int> const expected{{0, 5}, {1, 3}, {2, 2}, {3, 8},
  113. {4, 9}, {5, 11}, {6, 2}, {7, 4}};
  114. std::map<int, int> const result(EnumerateIterator(vec.begin()),
  115. EnumerateIterator(vec.end()));
  116. EXPECT_THAT(result, expected);
  117. }
  118. TEST(EnumerateIteartor, CanMutatePointedToData) {
  119. std::vector<int> vec{5, 3, 2, 8, 9, 11, 2, 4};
  120. EnumerateIterator(vec.begin() + 4, 4)->second = -1;
  121. EXPECT_THAT(vec[4], -1);
  122. }