|
|
@@ -5,24 +5,51 @@
|
|
|
|
|
|
#include <gmock/gmock.h>
|
|
|
|
|
|
+// TODO: std::string should not be unwrapped
|
|
|
+TEST(RecursiveIteratorTest, CanArrowMultiVector) {
|
|
|
+ std::vector<std::vector<int>> obj{{{0, 1}}, {{2, 3}}};
|
|
|
+ auto rit = make_recursive_iterator(obj);
|
|
|
+ testing::StaticAssertTypeEq<decltype(rit.operator->()), int *>();
|
|
|
+ EXPECT_THAT(rit.operator->(), &obj[0][0]);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(RecursiveIteratorTest, CannotArrowMap) {
|
|
|
+ std::map<int, std::vector<int>> obj{{1, {{0, 1}}}, {2, {{2, 3}}}};
|
|
|
+ auto rit = make_recursive_iterator(obj);
|
|
|
+ testing::StaticAssertTypeEq<decltype(rit.operator->()), void>();
|
|
|
+}
|
|
|
+
|
|
|
+TEST(RecursiveIteratorTest, CanAccessOuterterator) {
|
|
|
+ std::map<int, std::vector<int>> obj{{1, {{0, 1}}}, {2, {{2, 3}}}};
|
|
|
+ auto rit = make_recursive_iterator(obj);
|
|
|
+ auto inner = iterator::end_aware_iterator<decltype(obj)::iterator>(rit);
|
|
|
+ EXPECT_THAT(&std::get<0>(*rit), &(inner->first));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(RecursiveIteratorTest, CanAccessInnerIterator) {
|
|
|
+ std::map<int, std::vector<int>> obj{{1, {{0, 1}}}, {2, {{2, 3}}}};
|
|
|
+ auto rit = make_recursive_iterator(obj);
|
|
|
+ auto inner = iterator::end_aware_iterator<std::vector<int>::iterator>(rit);
|
|
|
+ EXPECT_THAT(&std::get<1>(*rit), &*inner);
|
|
|
+}
|
|
|
+
|
|
|
TEST(RecursiveIteratorTest, CanStdGetToAllLayersOfInternalIteration) {
|
|
|
std::map<int, std::vector<std::map<int, int>>> obj{
|
|
|
{1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
|
|
|
{2, {{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
|
};
|
|
|
auto rit = make_recursive_iterator(obj);
|
|
|
- EXPECT_TRUE((testing::StaticAssertTypeEq<
|
|
|
- decltype(std::get<0>(rit)),
|
|
|
- iterator::end_aware_iterator<decltype(obj)::iterator>>()));
|
|
|
- EXPECT_TRUE(
|
|
|
- (testing::StaticAssertTypeEq<decltype(std::get<1>(rit)),
|
|
|
- iterator::end_aware_iterator<std::vector<
|
|
|
- std::map<int, int>>::iterator>>()));
|
|
|
- EXPECT_TRUE((testing::StaticAssertTypeEq<
|
|
|
- decltype(std::get<2>(rit)),
|
|
|
- iterator::end_aware_iterator<std::map<int, int>::iterator>>()));
|
|
|
- EXPECT_TRUE((testing::StaticAssertTypeEq<
|
|
|
- decltype(*rit), std::tuple<int const &, int const &, int &>>()));
|
|
|
+ testing::StaticAssertTypeEq<
|
|
|
+ decltype(std::get<0>(rit)),
|
|
|
+ iterator::end_aware_iterator<decltype(obj)::iterator>>();
|
|
|
+ testing::StaticAssertTypeEq<decltype(std::get<1>(rit)),
|
|
|
+ iterator::end_aware_iterator<
|
|
|
+ std::vector<std::map<int, int>>::iterator>>();
|
|
|
+ testing::StaticAssertTypeEq<
|
|
|
+ decltype(std::get<2>(rit)),
|
|
|
+ iterator::end_aware_iterator<std::map<int, int>::iterator>>();
|
|
|
+ testing::StaticAssertTypeEq<decltype(*rit),
|
|
|
+ std::tuple<int const &, int const &, int &>>();
|
|
|
}
|
|
|
|
|
|
TEST(RecursiveIteratorTest, CanAccessInternalIteratorsWithGet) {
|
|
|
@@ -64,16 +91,14 @@ TEST(BoundedRecursiveIteratorTest, CanStdGetToNLayersOfInternalIteration) {
|
|
|
{2, {{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
|
};
|
|
|
auto rit = make_recursive_iterator<2>(obj);
|
|
|
- EXPECT_TRUE((testing::StaticAssertTypeEq<
|
|
|
- decltype(std::get<0>(rit)),
|
|
|
- iterator::end_aware_iterator<decltype(obj)::iterator>>()));
|
|
|
- EXPECT_TRUE(
|
|
|
- (testing::StaticAssertTypeEq<decltype(std::get<1>(rit)),
|
|
|
- iterator::end_aware_iterator<std::vector<
|
|
|
- std::map<int, int>>::iterator>>()));
|
|
|
- EXPECT_TRUE(
|
|
|
- (testing::StaticAssertTypeEq<
|
|
|
- decltype(*rit), std::tuple<int const &, std::map<int, int> &>>()));
|
|
|
+ testing::StaticAssertTypeEq<
|
|
|
+ decltype(std::get<0>(rit)),
|
|
|
+ iterator::end_aware_iterator<decltype(obj)::iterator>>();
|
|
|
+ testing::StaticAssertTypeEq<decltype(std::get<1>(rit)),
|
|
|
+ iterator::end_aware_iterator<
|
|
|
+ std::vector<std::map<int, int>>::iterator>>();
|
|
|
+ testing::StaticAssertTypeEq<decltype(*rit),
|
|
|
+ std::tuple<int const &, std::map<int, int> &>>();
|
|
|
}
|
|
|
|
|
|
TEST(BoundedRecursiveIteratorTest, CanAccessInternalIteratorsWithGet) {
|
|
|
@@ -108,6 +133,15 @@ TEST(BoundedRecursiveIteratorTest, EmptyCtorIsEnd) {
|
|
|
EXPECT_THAT(rit, decltype(rit)());
|
|
|
}
|
|
|
|
|
|
+TEST(BoundedRecursiveIteratorTest, CanFetchInnerCollections) {
|
|
|
+ std::vector<std::vector<std::map<int, int>>> obj{
|
|
|
+ {{{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
|
|
|
+ {{{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
|
+ };
|
|
|
+ auto rit = make_recursive_iterator<2>(obj);
|
|
|
+ EXPECT_THAT(*rit, obj[0][0]);
|
|
|
+}
|
|
|
+
|
|
|
// TEST(RecursiveIteratorTest, CanConstructInPlaceFromIterators) {
|
|
|
// std::map<int, std::vector<std::map<int, int>>> const obj{
|
|
|
// {1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}};
|