#include "iterator/recursive_iterator.h" #include #include #include "ranges.h" #include "xcode_gtest_helper.h" using iterator::bounded; using iterator::RecursiveIterator; using testing::ElementsAreArray; using testing::IsEmpty; TEST(RecursiveIterator_VecVec, PreIncrementAdvancesIterator) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = RecursiveIterator(vec); EXPECT_THAT(*rit, 1); EXPECT_THAT(*++rit, 2); EXPECT_THAT(*rit, 2); } TEST(RecursiveIterator_VecVec, PostIncrementReturnsCopyOfPrev) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = RecursiveIterator(vec); EXPECT_THAT(*rit, 1); EXPECT_THAT(*rit++, 1); EXPECT_THAT(*rit, 2); } TEST(RecursiveIterator_VecVec, IterDistanceIsSumOfInnerContainerSizes) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = RecursiveIterator(vec); EXPECT_THAT(ranges::distance(rit, iterator::sentinel), 5); } TEST(RecursiveIterator_VecVec, FlattensVectorDataLikeJoinIterator) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; std::vector const expected{1, 2, 3, 4, 5}; EXPECT_THAT(vec | views::recursive | ranges::to(), ElementsAreArray(expected)); } TEST(RecursiveIterator_VecVec, CanMutatePointedToData) { std::vector>> vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = RecursiveIterator(vec); *rit = 6; EXPECT_THAT(vec[0][0][0], 6); } TEST(RecursiveIterator_Vec_Bounded, PreIncrementAdvancesIterator) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = RecursiveIterator(vec, bounded<2>{}); EXPECT_THAT(*rit, vec[0][0]); EXPECT_THAT(*++rit, vec[1][0]); EXPECT_THAT(*rit, vec[1][0]); } TEST(RecursiveIterator_Vec_Bounded, PostIncrementReturnsCopyOfPrev) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = RecursiveIterator(vec, bounded<2>{}); EXPECT_THAT(*rit, vec[0][0]); EXPECT_THAT(*rit++, vec[0][0]); EXPECT_THAT(*rit, vec[1][0]); } TEST(RecursiveIterator_Vec_Bounded, IterDistanceSumOnNLayersSize) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = RecursiveIterator(vec, bounded<2>{}); EXPECT_THAT(ranges::distance(rit, iterator::sentinel), 3); } TEST(RecursiveIterator_Vec_Bounded, ElementsAreUnwrappedAsATuple) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; std::vector> const expected{{1, 2}, {3}, {4, 5}}; EXPECT_THAT(vec | views::recursive_n<2> | ranges::to(), ElementsAreArray(expected)); } TEST(RecursiveIterator_Vec_Bounded, CanMutatePointedToData) { std::vector>> vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = RecursiveIterator(vec, bounded<2>{}); rit->clear(); EXPECT_THAT(vec[0][0], IsEmpty()); }