#include "iterator/recursive_iterator.hpp" #include #include #include TEST(RecursiveIteratorTest, CanStdGetToAllLayersOfInternalIteration) { std::map>> 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(rit)), iterator::end_aware_iterator>>::iterator>>())); EXPECT_TRUE((testing::StaticAssertTypeEq(rit)), iterator::end_aware_iterator>::iterator>>())); EXPECT_TRUE((testing::StaticAssertTypeEq(rit)), iterator::end_aware_iterator::iterator>>())); } TEST(RecursiveIteratorTest, CanConstructInPlaceFromIterators) { std::map>> const obj{ {1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}} }; auto const it = make_end_aware_iterator(obj.begin(), obj.end()); auto const it_1 = ++make_end_aware_iterator(it->second); auto const it_2 = make_end_aware_iterator(*it_1); // Note that this carries the weakness of non bounds-checking that our // iterators are all sitting on the same hierarchy... EXPECT_NO_THROW(make_recursive_iterator(it, it_1, it_2)); } TEST(RecursiveIteratorTest, InternalIteratorsFromStdGetMatchCtorArgs) { std::map>> const obj{ {1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}} }; auto const it = make_end_aware_iterator(obj.begin(), obj.end()); auto const it_1 = ++make_end_aware_iterator(it->second); auto const it_2 = make_end_aware_iterator(*it_1); iterator::recursive_iterator rit{ iterator::in_place, it, it_1, it_2 }; EXPECT_THAT(std::get<0>(rit), it); EXPECT_THAT(std::get<1>(rit), it_1); EXPECT_THAT(std::get<2>(rit), it_2); }