recursive_iterator_mixed_container_test.cxx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "iterator/recursive_iterator.h"
  2. #include <map>
  3. #include <vector>
  4. #include "ranges.h"
  5. #include "xcode_gtest_helper.h"
  6. using iterator::RecursiveIterator;
  7. using testing::ElementsAreArray;
  8. TEST(RecursiveIterator_MapVector, IterDistanceIsSumOfInnerContainerSizes) {
  9. std::map<int, std::vector<int>> const obj{{1, {1, 2}}, {2, {3, 4, 5}}};
  10. auto rit = RecursiveIterator(obj);
  11. EXPECT_THAT(ranges::distance(rit, iterator::sentinel), 5);
  12. }
  13. TEST(RecursiveIterator_MapVector, ElementsAreUnwrappedAsATuple) {
  14. std::map<int, std::vector<int>> const obj{{1, {1, 2}}, {2, {3, 4, 5}}};
  15. std::vector<std::tuple<int, int>> const expected{
  16. {1, 1}, {1, 2}, {2, 3}, {2, 4}, {2, 5}};
  17. EXPECT_THAT(obj | views::recursive | ranges::to<std::vector>(),
  18. ElementsAreArray(expected));
  19. }
  20. TEST(RecursiveIterator_MapVector, CanMutatePointedToData) {
  21. std::map<int, std::vector<int>> obj{{1, {1, 2}}, {2, {3, 4, 5}}};
  22. auto rit = RecursiveIterator(obj);
  23. std::get<1>(*rit) = 6;
  24. EXPECT_THAT(obj[1][0], 6);
  25. }
  26. TEST(RecursiveIterator_MapMapVector, CanMutatePointedToData) {
  27. std::map<int, std::map<int, std::vector<int>>> obj{{1, {{1, {1, 2}}}},
  28. {2, {{1, {3, 4, 5}}}}};
  29. auto rit = RecursiveIterator(obj);
  30. std::get<2>(*rit) = 6;
  31. EXPECT_THAT(obj[1][1][0], 6);
  32. }
  33. TEST(RecursiveIterator_VectorMap, IterDistanceIsSumOfInnerContainerSizes) {
  34. std::vector<std::map<int, int>> const obj{{{1, 1}, {2, 2}},
  35. {{3, 3}, {4, 4}, {5, 5}}};
  36. auto rit = RecursiveIterator(obj);
  37. EXPECT_THAT(ranges::distance(rit, iterator::sentinel), 5);
  38. }
  39. TEST(RecursiveIterator_VectorMap, ElementsAreUnwrappedAsATuple) {
  40. std::vector<std::map<int, int>> const obj{{{1, 1}, {2, 2}},
  41. {{3, 3}, {4, 4}, {5, 5}}};
  42. std::vector<std::pair<int, int>> const expected{
  43. {1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}};
  44. EXPECT_THAT(obj | views::recursive | ranges::to<std::vector>(),
  45. ElementsAreArray(expected));
  46. }
  47. TEST(RecursiveIterator_VectorMap, CanMutatePointedToData) {
  48. std::vector<std::map<int, int>> obj{{{1, 1}, {2, 2}},
  49. {{3, 3}, {4, 4}, {5, 5}}};
  50. auto rit = RecursiveIterator(obj);
  51. std::get<1>(*rit) = 6;
  52. EXPECT_THAT(obj[0][1], 6);
  53. }
  54. TEST(RecursiveIterator_MapVectorMap, IterDistanceIsSumOfInnerContainerSizes) {
  55. std::map<int, std::vector<std::map<int, int>>> const obj{
  56. {1, {{{1, 1}, {2, 2}}}}};
  57. std::vector<std::tuple<int, int, int>> const expected{{1, 1, 1}, {1, 2, 2}};
  58. auto rit = RecursiveIterator(obj);
  59. EXPECT_THAT(ranges::distance(rit, iterator::sentinel), expected.size());
  60. }
  61. TEST(RecursiveIterator_MapVectorMap, ElementsAreUnwrappedAsATuple) {
  62. std::map<int, std::vector<std::map<int, int>>> const obj{
  63. {1, {{{1, 1}, {2, 2}}}}};
  64. std::vector<std::tuple<int, int, int>> const expected{{1, 1, 1}, {1, 2, 2}};
  65. EXPECT_THAT(obj | views::recursive | ranges::to<std::vector>(),
  66. ElementsAreArray(expected));
  67. }
  68. TEST(RecursiveIterator_MapVectorMap, CanMutatePointedToData) {
  69. std::map<int, std::vector<std::map<int, int>>> obj{{1, {{{1, 1}, {2, 2}}}}};
  70. auto rit = RecursiveIterator(obj);
  71. std::get<2>(*rit) = 4;
  72. EXPECT_THAT(obj[1][0][1], 4);
  73. }
  74. TEST(RecursiveIterator_VecMapVec, IterDistanceIsSumOfInnerContainerSizes) {
  75. std::vector<std::map<int, std::vector<int>>> const obj{
  76. {{1, {1, 2}}, {2, {3, 4, 5}}}, {{1, {3, 4}}}};
  77. auto rit = RecursiveIterator(obj);
  78. EXPECT_THAT(ranges::distance(rit, iterator::sentinel), 7);
  79. }
  80. TEST(RecursiveIterator_VecMapVec, ElementsAreUnwrappedAsATuple) {
  81. std::vector<std::map<int, std::vector<int>>> const obj{
  82. {{1, {1, 2}}, {2, {3, 4, 5}}}, {{1, {3, 4}}}};
  83. std::vector<std::tuple<int, int>> const expected{
  84. {1, 1}, {1, 2}, {2, 3}, {2, 4}, {2, 5}, {1, 3}, {1, 4}};
  85. EXPECT_THAT(obj | views::recursive | ranges::to<std::vector>(),
  86. ElementsAreArray(expected));
  87. }
  88. TEST(RecursiveIterator_VecMapVec, CanMutatePointedToData) {
  89. std::vector<std::map<int, std::vector<int>>> obj{
  90. {{1, {1, 2}}, {2, {3, 4, 5}}}, {{1, {3, 4}}}};
  91. auto rit = RecursiveIterator(obj);
  92. std::get<1>(*rit) = 6;
  93. EXPECT_THAT(obj[0][1][0], 6);
  94. }