recursive_iterator_vector_test.cxx 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "iterator/recursive_iterator.h"
  2. #include <vector>
  3. #include <iterator/forwards.h>
  4. #include "ranges.h"
  5. #include "xcode_gtest_helper.h"
  6. using iterator::bounded;
  7. using iterator::recursive_iterator;
  8. using testing::IsEmpty;
  9. TEST(RecursiveIteratorVecTest, PreIncrementAdvancesIterator) {
  10. std::vector<std::vector<std::vector<int>>> const vec{{{1, 2}}, {{3}, {4, 5}}};
  11. auto rit = recursive_iterator(vec);
  12. EXPECT_THAT(*rit, 1);
  13. EXPECT_THAT(*++rit, 2);
  14. EXPECT_THAT(*rit, 2);
  15. }
  16. TEST(RecursiveIteratorVecTest, PostIncrementReturnsCopyOfPrev) {
  17. std::vector<std::vector<std::vector<int>>> const vec{{{1, 2}}, {{3}, {4, 5}}};
  18. auto rit = recursive_iterator(vec);
  19. EXPECT_THAT(*rit, 1);
  20. EXPECT_THAT(*rit++, 1);
  21. EXPECT_THAT(*rit, 2);
  22. }
  23. TEST(RecursiveIteratorVecTest, IterDistanceIsSumOfInnerContainerSizes) {
  24. std::vector<std::vector<std::vector<int>>> const vec{{{1, 2}}, {{3}, {4, 5}}};
  25. auto rit = recursive_iterator(vec);
  26. EXPECT_THAT(ranges::distance(rit, iterator::sentinel), 5);
  27. }
  28. TEST(RecursiveIteratorVecTest, FlattensVectorDataLikeJoinIterator) {
  29. std::vector<std::vector<std::vector<int>>> const vec{{{1, 2}}, {{3}, {4, 5}}};
  30. auto rit = recursive_iterator(vec);
  31. std::vector<int> const expected{1, 2, 3, 4, 5};
  32. EXPECT_THAT(ranges::to<std::vector<int>>(rit, iterator::sentinel), expected);
  33. }
  34. TEST(RecursiveIteratorVecTest, CanMutatePointedToData) {
  35. std::vector<std::vector<std::vector<int>>> vec{{{1, 2}}, {{3}, {4, 5}}};
  36. auto rit = recursive_iterator(vec);
  37. *rit = 6;
  38. EXPECT_THAT(vec[0][0][0], 6);
  39. }
  40. TEST(BoundedRecursiveIteratorVecTest, PreIncrementAdvancesIterator) {
  41. std::vector<std::vector<std::vector<int>>> const vec{{{1, 2}}, {{3}, {4, 5}}};
  42. auto rit = recursive_iterator(vec, bounded<2>{});
  43. EXPECT_THAT(*rit, vec[0][0]);
  44. EXPECT_THAT(*++rit, vec[1][0]);
  45. EXPECT_THAT(*rit, vec[1][0]);
  46. }
  47. TEST(BoundedRecursiveIteratorVecTest, PostIncrementReturnsCopyOfPrev) {
  48. std::vector<std::vector<std::vector<int>>> const vec{{{1, 2}}, {{3}, {4, 5}}};
  49. auto rit = recursive_iterator(vec, bounded<2>{});
  50. EXPECT_THAT(*rit, vec[0][0]);
  51. EXPECT_THAT(*rit++, vec[0][0]);
  52. EXPECT_THAT(*rit, vec[1][0]);
  53. }
  54. TEST(BoundedRecursiveIteratorVecTest, IterDistanceSumOnNLayersSize) {
  55. std::vector<std::vector<std::vector<int>>> const vec{{{1, 2}}, {{3}, {4, 5}}};
  56. auto rit = recursive_iterator(vec, bounded<2>{});
  57. EXPECT_THAT(ranges::distance(rit, iterator::sentinel), 3);
  58. }
  59. TEST(BoundedRecursiveIteratorVecTest, ElementsAreUnwrappedAsATuple) {
  60. std::vector<std::vector<std::vector<int>>> const vec{{{1, 2}}, {{3}, {4, 5}}};
  61. auto rit = recursive_iterator(vec, bounded<2>{});
  62. std::vector<std::vector<int>> const expected{{1, 2}, {3}, {4, 5}};
  63. EXPECT_THAT(
  64. ranges::to<std::vector<std::vector<int>>>(rit, iterator::sentinel),
  65. expected);
  66. }
  67. TEST(BoundedRecursiveIteratorVecTest, CanMutatePointedToData) {
  68. std::vector<std::vector<std::vector<int>>> vec{{{1, 2}}, {{3}, {4, 5}}};
  69. auto rit = recursive_iterator(vec, bounded<2>{});
  70. rit->clear();
  71. EXPECT_THAT(vec[0][0], IsEmpty());
  72. }