recursive_iterator_accessors_test.cxx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "iterator/recursive_iterator.hpp"
  2. #include <map>
  3. #include <vector>
  4. #include <gmock/gmock.h>
  5. TEST(RecursiveIteratorTest, CanStdGetToAllLayersOfInternalIteration) {
  6. std::map<int, std::vector<std::map<int, int>>> obj{
  7. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  8. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  9. };
  10. auto rit = make_recursive_iterator(obj);
  11. EXPECT_TRUE((testing::StaticAssertTypeEq<decltype(std::get<0>(rit)),
  12. iterator::end_aware_iterator<std::map<int, std::vector<std::map<int, int>>>::iterator>>()));
  13. EXPECT_TRUE((testing::StaticAssertTypeEq<decltype(std::get<1>(rit)),
  14. iterator::end_aware_iterator<std::vector<std::map<int, int>>::iterator>>()));
  15. EXPECT_TRUE((testing::StaticAssertTypeEq<decltype(std::get<2>(rit)),
  16. iterator::end_aware_iterator<std::map<int, int>::iterator>>()));
  17. }
  18. TEST(RecursiveIteratorTest, CanConstructInPlaceFromIterators) {
  19. std::map<int, std::vector<std::map<int, int>>> const obj{
  20. {1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}
  21. };
  22. auto const it = make_end_aware_iterator(obj.begin(), obj.end());
  23. auto const it_1 = ++make_end_aware_iterator(it->second);
  24. auto const it_2 = make_end_aware_iterator(*it_1);
  25. // Note that this carries the weakness of non bounds-checking that our
  26. // iterators are all sitting on the same hierarchy...
  27. EXPECT_NO_THROW(make_recursive_iterator(it, it_1, it_2));
  28. }
  29. TEST(RecursiveIteratorTest, InternalIteratorsFromStdGetMatchCtorArgs) {
  30. std::map<int, std::vector<std::map<int, int>>> const obj{
  31. {1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}
  32. };
  33. auto const it = make_end_aware_iterator(obj.begin(), obj.end());
  34. auto const it_1 = ++make_end_aware_iterator(it->second);
  35. auto const it_2 = make_end_aware_iterator(*it_1);
  36. iterator::recursive_iterator<decltype(obj.cbegin())> rit{
  37. iterator::in_place,
  38. it, it_1, it_2
  39. };
  40. EXPECT_THAT(std::get<0>(rit), it);
  41. EXPECT_THAT(std::get<1>(rit), it_1);
  42. EXPECT_THAT(std::get<2>(rit), it_2);
  43. }