indexed_iterator_test.cxx 4.4 KB

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