recursive_iterator_vector_test.cxx 2.9 KB

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