#include "iterator/recursive_iterator.h" #include #include #include #include "ranges.h" #include "xcode_gtest_helper.h" using testing::IsEmpty; TEST(RecursiveIteratorMapTest, PreIncrementAdvancesIterator) { std::map>> const map{ {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}}; auto rit = make_recursive_iterator(map); EXPECT_EQ(std::get<3>(*rit), 1); EXPECT_EQ(std::get<3>(*++rit), 2); EXPECT_EQ(std::get<3>(*rit), 2); } TEST(RecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) { std::map>> const map{ {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}}; auto rit = make_recursive_iterator(map); EXPECT_EQ(std::get<3>(*rit), 1); EXPECT_EQ(std::get<3>(*rit++), 1); EXPECT_EQ(std::get<3>(*rit), 2); } TEST(RecursiveIteratorMapTest, IterDistanceIsSumOfInnerContainerSizes) { std::map>> const map{ {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}}; auto rit = make_recursive_iterator(map); EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 4); } TEST(RecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) { std::map>> const map{ {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}}; std::vector> const expected{ {1, 1, 1, 1}, {2, 2, 2, 2}, {2, 3, 3, 3}, {2, 3, 4, 4}}; auto rit = make_recursive_iterator(map); EXPECT_EQ((ranges::to>>( rit, iterator::sentinel)), expected); } TEST(RecursiveIteratorMapTest, CanMutatePointedToData) { std::map>> map{ {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}}; auto rit = make_recursive_iterator(map); std::get<3>(*rit) = 4; EXPECT_EQ(map[1][1][1], 4); } TEST(BoundRecursiveIteratorMapTest, PreIncrementAdvancesIterator) { std::map>> map{ {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}}; auto rit = make_recursive_iterator<2>(map); EXPECT_EQ(std::get<2>(*rit), map[1][1]); EXPECT_EQ(std::get<2>(*++rit), map[2][2]); EXPECT_EQ(std::get<2>(*rit), map[2][2]); } TEST(BoundRecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) { std::map>> map{ {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}}; auto rit = make_recursive_iterator<2>(map); EXPECT_EQ(std::get<2>(*rit), map[1][1]); EXPECT_EQ(std::get<2>(*rit++), map[1][1]); EXPECT_EQ(std::get<2>(*rit), map[2][2]); } TEST(BoundRecursiveIteratorMapTest, IterDistanceSumOnNLayersSize) { std::map>> const map{ {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}}; auto rit = make_recursive_iterator<2>(map); EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 3); } TEST(BoundRecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) { std::map>> const map{ {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}}; std::vector>> const expected{ {1, 1, {{1, 1}}}, {2, 2, {{2, 2}}}, {2, 3, {{3, 3}, {4, 4}}}}; auto rit = make_recursive_iterator<2>(map); EXPECT_EQ((ranges::to>>>( rit, iterator::sentinel)), expected); } TEST(BoundedRecursiveIteratorMapTest, CanMutatePointedToData) { std::map>> map{ {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}}; auto rit = make_recursive_iterator<2>(map); std::get<2>(*rit).clear(); EXPECT_THAT(map[1][1], IsEmpty()); }