recursive_iterator_accessors_test.cxx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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<
  12. decltype(std::get<0>(rit)),
  13. iterator::end_aware_iterator<decltype(obj)::iterator>>()));
  14. EXPECT_TRUE(
  15. (testing::StaticAssertTypeEq<decltype(std::get<1>(rit)),
  16. iterator::end_aware_iterator<std::vector<
  17. std::map<int, int>>::iterator>>()));
  18. EXPECT_TRUE((testing::StaticAssertTypeEq<
  19. decltype(std::get<2>(rit)),
  20. iterator::end_aware_iterator<std::map<int, int>::iterator>>()));
  21. EXPECT_TRUE((testing::StaticAssertTypeEq<
  22. decltype(*rit), std::tuple<int const &, int const &, int &>>()));
  23. }
  24. TEST(RecursiveIteratorTest, CanAccessInternalIteratorsWithGet) {
  25. std::map<int, std::vector<std::map<int, int>>> obj{
  26. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  27. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  28. };
  29. auto rit = make_recursive_iterator(obj);
  30. EXPECT_THAT(std::get<0>(rit), make_end_aware_iterator(obj));
  31. EXPECT_THAT(std::get<1>(rit), make_end_aware_iterator(obj[1]));
  32. EXPECT_THAT(std::get<2>(rit), make_end_aware_iterator(obj[1][0]));
  33. }
  34. // TODO: This ought to be implemented as a compiles-test
  35. TEST(RecursiveIteratorTest, CanCastCompatibleIterators) {
  36. std::map<int, std::vector<std::map<int, int>>> obj{
  37. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  38. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  39. };
  40. auto rit = make_recursive_iterator(obj);
  41. iterator::recursive_iterator<decltype(obj)::const_iterator> cit(rit);
  42. }
  43. TEST(RecursiveIteratorTest, EmptyCtorIsEnd) {
  44. std::map<int, std::vector<std::map<int, int>>> obj{
  45. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  46. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  47. };
  48. auto rit = make_recursive_iterator(obj);
  49. EXPECT_THAT(rit, testing::Ne(decltype(rit)()));
  50. EXPECT_THAT(std::distance(rit, decltype(rit)()), 4);
  51. std::advance(rit, 4);
  52. EXPECT_THAT(rit, decltype(rit)());
  53. }
  54. TEST(BoundedRecursiveIteratorTest, CanStdGetToNLayersOfInternalIteration) {
  55. std::map<int, std::vector<std::map<int, int>>> obj{
  56. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  57. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  58. };
  59. auto rit = make_recursive_iterator<2>(obj);
  60. EXPECT_TRUE((testing::StaticAssertTypeEq<
  61. decltype(std::get<0>(rit)),
  62. iterator::end_aware_iterator<decltype(obj)::iterator>>()));
  63. EXPECT_TRUE(
  64. (testing::StaticAssertTypeEq<decltype(std::get<1>(rit)),
  65. iterator::end_aware_iterator<std::vector<
  66. std::map<int, int>>::iterator>>()));
  67. EXPECT_TRUE(
  68. (testing::StaticAssertTypeEq<
  69. decltype(*rit), std::tuple<int const &, std::map<int, int> &>>()));
  70. }
  71. TEST(BoundedRecursiveIteratorTest, CanAccessInternalIteratorsWithGet) {
  72. std::map<int, std::vector<std::map<int, int>>> obj{
  73. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  74. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  75. };
  76. auto rit = make_recursive_iterator<2>(obj);
  77. EXPECT_THAT(std::get<0>(rit), make_end_aware_iterator(obj));
  78. EXPECT_THAT(std::get<1>(rit), make_end_aware_iterator(obj[1]));
  79. }
  80. // TODO: This ought to be implemented as a compiles-test
  81. TEST(BoundedRecursiveIteratorTest, CanCastCompatibleIterators) {
  82. std::map<int, std::vector<std::map<int, int>>> obj{
  83. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  84. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  85. };
  86. auto rit = make_recursive_iterator<2>(obj);
  87. iterator::recursive_iterator_n<decltype(obj)::const_iterator, 2> cit(rit);
  88. }
  89. TEST(BoundedRecursiveIteratorTest, EmptyCtorIsEnd) {
  90. std::map<int, std::vector<std::map<int, int>>> obj{
  91. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  92. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  93. };
  94. auto rit = make_recursive_iterator<2>(obj);
  95. EXPECT_THAT(rit, testing::Ne(decltype(rit)()));
  96. EXPECT_THAT(std::distance(rit, decltype(rit)()), 3);
  97. std::advance(rit, 3);
  98. EXPECT_THAT(rit, decltype(rit)());
  99. }
  100. // TEST(RecursiveIteratorTest, CanConstructInPlaceFromIterators) {
  101. // std::map<int, std::vector<std::map<int, int>>> const obj{
  102. // {1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}};
  103. // auto const it = make_end_aware_iterator(obj.begin(), obj.end());
  104. // auto const it_1 = ++make_end_aware_iterator(it->second);
  105. // auto const it_2 = make_end_aware_iterator(*it_1);
  106. // // Note that this carries the weakness of non bounds-checking that our
  107. // // iterators are all sitting on the same hierarchy...
  108. // EXPECT_NO_THROW(make_recursive_iterator(it, it_1, it_2));
  109. //}
  110. //
  111. // TEST(RecursiveIteratorTest, InternalIteratorsFromStdGetMatchCtorArgs) {
  112. // std::map<int, std::vector<std::map<int, int>>> const obj{
  113. // {1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}};
  114. // auto const it = make_end_aware_iterator(obj.begin(), obj.end());
  115. // auto const it_1 = ++make_end_aware_iterator(it->second);
  116. // auto const it_2 = make_end_aware_iterator(*it_1);
  117. // iterator::recursive_iterator<decltype(obj.cbegin())> rit{iterator::in_place,
  118. // it, it_1, it_2};
  119. // EXPECT_THAT(std::get<0>(rit), it);
  120. // EXPECT_THAT(std::get<1>(rit), it_1);
  121. // EXPECT_THAT(std::get<2>(rit), it_2);
  122. //}