| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #include "iterator/recursive_iterator.hpp"
- #include <map>
- #include <tuple>
- #include <vector>
- #include <gmock/gmock.h>
- 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_THAT(std::get<3>(*rit), 1);
- EXPECT_THAT(std::get<3>(*++rit), 2);
- EXPECT_THAT(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_THAT(std::get<3>(*rit), 1);
- EXPECT_THAT(std::get<3>(*rit++), 1);
- EXPECT_THAT(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);
- decltype(rit) end{};
- // TODO: Actually perform the summation?
- EXPECT_THAT(std::distance(rit, end), 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);
- decltype(expected) result(rit, decltype(rit)());
- EXPECT_THAT(result, 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_THAT(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_THAT(std::get<2>(*rit), map[1][1]);
- EXPECT_THAT(std::get<2>(*++rit), map[2][2]);
- EXPECT_THAT(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_THAT(std::get<2>(*rit), map[1][1]);
- EXPECT_THAT(std::get<2>(*rit++), map[1][1]);
- EXPECT_THAT(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);
- decltype(rit) end{};
- EXPECT_THAT(std::distance(rit, end), 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);
- decltype(expected) result(rit, decltype(rit)());
- EXPECT_THAT(result, 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], testing::IsEmpty());
- }
|