recursive_iterator_accessors_test.cxx 2.1 KB

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