recursive_iterator_accessors_test.cxx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include "iterator/recursive_iterator.h"
  2. #include <map>
  3. #include <string>
  4. #include <tuple>
  5. #include <vector>
  6. #include "ranges.h"
  7. #include "xcode_gtest_helper.h"
  8. using iterator::bounded;
  9. using iterator::end_aware_iterator;
  10. using iterator::recursive_iterator;
  11. using testing::StaticAssertTypeEq;
  12. TEST(RecursiveIteratorTest, DoesNotUnwrapString) {
  13. std::vector<std::string> obj{"A", "B", "C", "D"};
  14. auto rit = recursive_iterator(obj);
  15. StaticAssertTypeEq<decltype(rit.operator->()), std::string *>();
  16. }
  17. TEST(RecursiveIteratorTest, CanArrowMultiVector) {
  18. std::vector<std::vector<int>> obj{{{0, 1}}, {{2, 3}}};
  19. auto rit = recursive_iterator(obj);
  20. StaticAssertTypeEq<decltype(rit.operator->()), int *>();
  21. EXPECT_EQ(rit.operator->(), &obj[0][0]);
  22. }
  23. // TEST(RecursiveIteratorTest, CannotArrowMap) {
  24. // std::map<int, std::vector<int>> obj{{1, {{0, 1}}}, {2, {{2, 3}}}};
  25. // auto rit = recursive_iterator(obj);
  26. // StaticAssertTypeEq<decltype(rit.operator->()), void>();
  27. //}
  28. TEST(RecursiveIteratorTest, CanAccessOuterterator) {
  29. std::map<int, std::vector<int>> obj{{1, {{0, 1}}}, {2, {{2, 3}}}};
  30. auto rit = recursive_iterator(obj);
  31. end_aware_iterator<decltype(obj)::iterator> inner = rit;
  32. EXPECT_EQ(&std::get<0>(*rit), &(inner->first));
  33. }
  34. TEST(RecursiveIteratorTest, CanAccessInnerIterator) {
  35. std::map<int, std::vector<int>> obj{{1, {{0, 1}}}, {2, {{2, 3}}}};
  36. auto rit = recursive_iterator(obj);
  37. end_aware_iterator<std::vector<int>::iterator> inner = rit;
  38. EXPECT_EQ(&std::get<1>(*rit), &*inner);
  39. }
  40. TEST(RecursiveIteratorTest, CanStdGetToAllLayersOfInternalIteration) {
  41. std::map<int, std::vector<std::map<int, int>>> obj{
  42. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  43. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  44. };
  45. auto rit = recursive_iterator(obj);
  46. using mvm_iterator = std::map<int, std::vector<std::map<int, int>>>::iterator;
  47. StaticAssertTypeEq<decltype(std::get<0>(rit)),
  48. end_aware_iterator<mvm_iterator>>();
  49. using vm_iterator = std::vector<std::map<int, int>>::iterator;
  50. StaticAssertTypeEq<decltype(std::get<1>(rit)),
  51. end_aware_iterator<vm_iterator>>();
  52. using m_iterator = std::map<int, int>::iterator;
  53. StaticAssertTypeEq<decltype(std::get<2>(rit)),
  54. end_aware_iterator<m_iterator>>();
  55. using tup_i_i_i = std::tuple<int const &, int const &, int &>;
  56. StaticAssertTypeEq<decltype(*rit), tup_i_i_i>();
  57. }
  58. TEST(RecursiveIteratorTest, CanAccessInternalIteratorsWithGet) {
  59. std::map<int, std::vector<std::map<int, int>>> obj{
  60. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  61. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  62. };
  63. auto rit = recursive_iterator(obj);
  64. EXPECT_EQ(std::get<0>(rit), end_aware_iterator(obj));
  65. EXPECT_EQ(std::get<1>(rit), end_aware_iterator(obj[1]));
  66. EXPECT_EQ(std::get<2>(rit), end_aware_iterator(obj[1][0]));
  67. }
  68. // TODO: This ought to be implemented as a compiles-test
  69. TEST(RecursiveIteratorTest, CanCastCompatibleIterators) {
  70. std::map<int, std::vector<std::map<int, int>>> obj{
  71. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  72. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  73. };
  74. auto rit = recursive_iterator(obj);
  75. iterator::recursive_iterator<decltype(obj)::const_iterator> cit(rit);
  76. }
  77. TEST(RecursiveIteratorTest, EmptyCtorIsEnd) {
  78. std::map<int, std::vector<std::map<int, int>>> obj{
  79. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  80. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  81. };
  82. auto rit = recursive_iterator(obj);
  83. EXPECT_NE(rit, iterator::sentinel);
  84. EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 4);
  85. std::advance(rit, 4);
  86. EXPECT_EQ(rit, iterator::sentinel);
  87. }
  88. TEST(BoundedRecursiveIteratorTest, CanStdGetToNLayersOfInternalIteration) {
  89. std::map<int, std::vector<std::map<int, int>>> obj{
  90. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  91. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  92. };
  93. auto rit = recursive_iterator(obj, bounded<2>{});
  94. using mvm_iterator = std::map<int, std::vector<std::map<int, int>>>::iterator;
  95. StaticAssertTypeEq<decltype(std::get<0>(rit)),
  96. end_aware_iterator<mvm_iterator>>();
  97. using vm_iterator = std::vector<std::map<int, int>>::iterator;
  98. StaticAssertTypeEq<decltype(std::get<1>(rit)),
  99. end_aware_iterator<vm_iterator>>();
  100. using tup_i_mii = std::tuple<int const &, std::map<int, int> &>;
  101. StaticAssertTypeEq<decltype(*rit), tup_i_mii>();
  102. }
  103. TEST(BoundedRecursiveIteratorTest, CanAccessInternalIteratorsWithGet) {
  104. std::map<int, std::vector<std::map<int, int>>> obj{
  105. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  106. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  107. };
  108. auto rit = recursive_iterator(obj, bounded<2>{});
  109. EXPECT_EQ(std::get<0>(rit), end_aware_iterator(obj));
  110. EXPECT_EQ(std::get<1>(rit), end_aware_iterator(obj[1]));
  111. }
  112. // TODO: This ought to be implemented as a compiles-test
  113. TEST(BoundedRecursiveIteratorTest, CanCastCompatibleIterators) {
  114. std::map<int, std::vector<std::map<int, int>>> obj{
  115. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  116. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  117. };
  118. auto rit = recursive_iterator(obj, bounded<2>{});
  119. iterator::recursive_iterator_n<decltype(obj)::const_iterator, 2> cit(rit);
  120. }
  121. TEST(BoundedRecursiveIteratorTest, EmptyCtorIsEnd) {
  122. std::map<int, std::vector<std::map<int, int>>> obj{
  123. {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  124. {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
  125. };
  126. auto rit = recursive_iterator(obj, bounded<3>{});
  127. EXPECT_NE(rit, iterator::sentinel);
  128. EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 4);
  129. std::advance(rit, 4);
  130. EXPECT_EQ(rit, iterator::sentinel);
  131. }
  132. TEST(BoundedRecursiveIteratorTest, CanFetchInnerCollections) {
  133. std::vector<std::vector<std::map<int, int>>> obj{
  134. {{{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
  135. {{{{3, 3}, {4, 4}}}} // 1 2-element map
  136. };
  137. auto rit = recursive_iterator(obj, bounded<2>{});
  138. EXPECT_EQ(*rit, obj[0][0]);
  139. }