recursive_iterator_accessors_test.cxx 6.0 KB

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