| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #include "iterator/recursive_iterator.h"
- #include <map>
- #include <tuple>
- #include <vector>
- #include "ranges.h"
- #include "xcode_gtest_helper.h"
- using testing::IsEmpty;
- TEST(RecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
- std::map<int, std::map<int, std::map<int, int>>> 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<int, std::map<int, std::map<int, int>>> 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<int, std::map<int, std::map<int, int>>> 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<int, std::map<int, std::map<int, int>>> const map{
- {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
- std::vector<std::tuple<int, int, int, int>> 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<std::vector<std::tuple<int, int, int, int>>>(
- rit, iterator::sentinel)),
- expected);
- }
- TEST(RecursiveIteratorMapTest, CanMutatePointedToData) {
- std::map<int, std::map<int, std::map<int, int>>> 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<int, std::map<int, std::map<int, int>>> 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<int, std::map<int, std::map<int, int>>> 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<int, std::map<int, std::map<int, int>>> 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<int, std::map<int, std::map<int, int>>> const map{
- {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
- std::vector<std::tuple<int, int, std::map<int, int>>> 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<std::vector<std::tuple<int, int, std::map<int, int>>>>(
- rit, iterator::sentinel)),
- expected);
- }
- TEST(BoundedRecursiveIteratorMapTest, CanMutatePointedToData) {
- std::map<int, std::map<int, std::map<int, int>>> 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());
- }
|