recursive_iterator_accessors_test.cxx 6.0 KB

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