recursive_iterator_accessors_test.cxx 5.8 KB

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