|
@@ -1,36 +1,38 @@
|
|
|
-#include "iterator/recursive_iterator.hpp"
|
|
|
|
|
|
|
+#include "iterator/recursive_iterator.h"
|
|
|
|
|
|
|
|
#include <map>
|
|
#include <map>
|
|
|
#include <tuple>
|
|
#include <tuple>
|
|
|
#include <vector>
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
+#include "ranges.h"
|
|
|
#include "xcode_gtest_helper.h"
|
|
#include "xcode_gtest_helper.h"
|
|
|
|
|
|
|
|
|
|
+using testing::IsEmpty;
|
|
|
|
|
+
|
|
|
TEST(RecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
|
|
TEST(RecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
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}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
auto rit = make_recursive_iterator(map);
|
|
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);
|
|
|
|
|
|
|
+ EXPECT_EQ(std::get<3>(*rit), 1);
|
|
|
|
|
+ EXPECT_EQ(std::get<3>(*++rit), 2);
|
|
|
|
|
+ EXPECT_EQ(std::get<3>(*rit), 2);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(RecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
|
|
TEST(RecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
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}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
auto rit = make_recursive_iterator(map);
|
|
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);
|
|
|
|
|
|
|
+ EXPECT_EQ(std::get<3>(*rit), 1);
|
|
|
|
|
+ EXPECT_EQ(std::get<3>(*rit++), 1);
|
|
|
|
|
+ EXPECT_EQ(std::get<3>(*rit), 2);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(RecursiveIteratorMapTest, IterDistanceIsSumOfInnerContainerSizes) {
|
|
TEST(RecursiveIteratorMapTest, IterDistanceIsSumOfInnerContainerSizes) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
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}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
auto rit = make_recursive_iterator(map);
|
|
auto rit = make_recursive_iterator(map);
|
|
|
- decltype(rit) end{};
|
|
|
|
|
- // TODO: Actually perform the summation?
|
|
|
|
|
- EXPECT_THAT(std::distance(rit, end), 4);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 4);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(RecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) {
|
|
TEST(RecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) {
|
|
@@ -39,8 +41,10 @@ TEST(RecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) {
|
|
|
std::vector<std::tuple<int, int, int, int>> const expected{
|
|
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}};
|
|
{1, 1, 1, 1}, {2, 2, 2, 2}, {2, 3, 3, 3}, {2, 3, 4, 4}};
|
|
|
auto rit = make_recursive_iterator(map);
|
|
auto rit = make_recursive_iterator(map);
|
|
|
- decltype(expected) result(rit, decltype(rit)());
|
|
|
|
|
- EXPECT_THAT(result, expected);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ EXPECT_EQ((ranges::to<std::vector<std::tuple<int, int, int, int>>>(
|
|
|
|
|
+ rit, iterator::sentinel)),
|
|
|
|
|
+ expected);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(RecursiveIteratorMapTest, CanMutatePointedToData) {
|
|
TEST(RecursiveIteratorMapTest, CanMutatePointedToData) {
|
|
@@ -48,34 +52,33 @@ TEST(RecursiveIteratorMapTest, CanMutatePointedToData) {
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
auto rit = make_recursive_iterator(map);
|
|
auto rit = make_recursive_iterator(map);
|
|
|
std::get<3>(*rit) = 4;
|
|
std::get<3>(*rit) = 4;
|
|
|
- EXPECT_THAT(map[1][1][1], 4);
|
|
|
|
|
|
|
+ EXPECT_EQ(map[1][1][1], 4);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(BoundRecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
|
|
TEST(BoundRecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
auto rit = make_recursive_iterator<2>(map);
|
|
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]);
|
|
|
|
|
|
|
+ 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) {
|
|
TEST(BoundRecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
auto rit = make_recursive_iterator<2>(map);
|
|
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]);
|
|
|
|
|
|
|
+ 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) {
|
|
TEST(BoundRecursiveIteratorMapTest, IterDistanceSumOnNLayersSize) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
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}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
auto rit = make_recursive_iterator<2>(map);
|
|
auto rit = make_recursive_iterator<2>(map);
|
|
|
- decltype(rit) end{};
|
|
|
|
|
|
|
|
|
|
- EXPECT_THAT(std::distance(rit, end), 3);
|
|
|
|
|
|
|
+ EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 3);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(BoundRecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) {
|
|
TEST(BoundRecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) {
|
|
@@ -84,8 +87,10 @@ TEST(BoundRecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) {
|
|
|
std::vector<std::tuple<int, int, std::map<int, int>>> const expected{
|
|
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}}}};
|
|
{1, 1, {{1, 1}}}, {2, 2, {{2, 2}}}, {2, 3, {{3, 3}, {4, 4}}}};
|
|
|
auto rit = make_recursive_iterator<2>(map);
|
|
auto rit = make_recursive_iterator<2>(map);
|
|
|
- decltype(expected) result(rit, decltype(rit)());
|
|
|
|
|
- EXPECT_THAT(result, expected);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ EXPECT_EQ((ranges::to<std::vector<std::tuple<int, int, std::map<int, int>>>>(
|
|
|
|
|
+ rit, iterator::sentinel)),
|
|
|
|
|
+ expected);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(BoundedRecursiveIteratorMapTest, CanMutatePointedToData) {
|
|
TEST(BoundedRecursiveIteratorMapTest, CanMutatePointedToData) {
|
|
@@ -93,5 +98,5 @@ TEST(BoundedRecursiveIteratorMapTest, CanMutatePointedToData) {
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
auto rit = make_recursive_iterator<2>(map);
|
|
auto rit = make_recursive_iterator<2>(map);
|
|
|
std::get<2>(*rit).clear();
|
|
std::get<2>(*rit).clear();
|
|
|
- EXPECT_THAT(map[1][1], testing::IsEmpty());
|
|
|
|
|
|
|
+ EXPECT_THAT(map[1][1], IsEmpty());
|
|
|
}
|
|
}
|