#include "iterator/recursive_iterator.hpp" #include #include "xcode_gtest_helper.h" TEST(RecursiveIteratorVecTest, PreIncrementAdvancesIterator) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = make_recursive_iterator(vec); EXPECT_THAT(*rit, 1); EXPECT_THAT(*++rit, 2); EXPECT_THAT(*rit, 2); } TEST(RecursiveIteratorVecTest, PostIncrementReturnsCopyOfPrev) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = make_recursive_iterator(vec); EXPECT_THAT(*rit, 1); EXPECT_THAT(*rit++, 1); EXPECT_THAT(*rit, 2); } TEST(RecursiveIteratorVecTest, IterDistanceIsSumOfInnerContainerSizes) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = make_recursive_iterator(vec); decltype(rit) end{}; // TODO: Actually perform the summation? EXPECT_THAT(std::distance(rit, end), 5); } TEST(RecursiveIteratorVecTest, FlattensVectorDataLikeJoinIterator) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; std::vector const expected{1, 2, 3, 4, 5}; auto rit = make_recursive_iterator(vec); decltype(expected) result(rit, decltype(rit)()); EXPECT_THAT(result, expected); } TEST(RecursiveIteratorVecTest, CanMutatePointedToData) { std::vector>> vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = make_recursive_iterator(vec); *rit = 6; EXPECT_THAT(vec[0][0][0], 6); } TEST(BoundedRecursiveIteratorVecTest, PreIncrementAdvancesIterator) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = make_recursive_iterator<2>(vec); EXPECT_THAT(*rit, vec[0][0]); EXPECT_THAT(*++rit, vec[1][0]); EXPECT_THAT(*rit, vec[1][0]); } TEST(BoundedRecursiveIteratorVecTest, PostIncrementReturnsCopyOfPrev) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = make_recursive_iterator<2>(vec); EXPECT_THAT(*rit, vec[0][0]); EXPECT_THAT(*rit++, vec[0][0]); EXPECT_THAT(*rit, vec[1][0]); } TEST(BoundedRecursiveIteratorVecTest, IterDistanceSumOnNLayersSize) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = make_recursive_iterator<2>(vec); decltype(rit) end{}; EXPECT_THAT(std::distance(rit, end), 3); } TEST(BoundedRecursiveIteratorVecTest, ElementsAreUnwrappedAsATuple) { std::vector>> const vec{{{1, 2}}, {{3}, {4, 5}}}; std::vector> const expected{{1, 2}, {3}, {4, 5}}; auto rit = make_recursive_iterator<2>(vec); decltype(expected) result(rit, decltype(rit)()); EXPECT_THAT(result, expected); } TEST(BoundedRecursiveIteratorVecTest, CanMutatePointedToData) { std::vector>> vec{{{1, 2}}, {{3}, {4, 5}}}; auto rit = make_recursive_iterator<2>(vec); rit->clear(); EXPECT_THAT(vec[0][0], testing::IsEmpty()); }