| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- #include "iterator/recursive_iterator.hpp"
- #include <map>
- #include <vector>
- #include <gmock/gmock.h>
- 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<std::map<int, std::vector<std::map<int, int>>>::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>>()));
- }
- TEST(RecursiveIteratorTest, CanConstructInPlaceFromIterators) {
- std::map<int, std::vector<std::map<int, int>>> 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<int, std::vector<std::map<int, int>>> 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<decltype(obj.cbegin())> 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);
- }
|