indexed_iterator_test.cxx 4.3 KB

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