recursive_iterator_map_test.cxx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "iterator/recursive_iterator.h"
  2. #include <map>
  3. #include <ranges>
  4. #include <tuple>
  5. #include <vector>
  6. #include "ranges.h"
  7. #include "xcode_gtest_helper.h"
  8. using testing::IsEmpty;
  9. TEST(RecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
  10. std::map<int, std::map<int, std::map<int, int>>> const map{
  11. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  12. auto rit = make_recursive_iterator(map);
  13. EXPECT_EQ(std::get<3>(*rit), 1);
  14. EXPECT_EQ(std::get<3>(*++rit), 2);
  15. EXPECT_EQ(std::get<3>(*rit), 2);
  16. }
  17. TEST(RecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
  18. std::map<int, std::map<int, std::map<int, int>>> const map{
  19. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  20. auto rit = make_recursive_iterator(map);
  21. EXPECT_EQ(std::get<3>(*rit), 1);
  22. EXPECT_EQ(std::get<3>(*rit++), 1);
  23. EXPECT_EQ(std::get<3>(*rit), 2);
  24. }
  25. TEST(RecursiveIteratorMapTest, IterDistanceIsSumOfInnerContainerSizes) {
  26. std::map<int, std::map<int, std::map<int, int>>> const map{
  27. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  28. auto rit = make_recursive_iterator(map);
  29. EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 4);
  30. }
  31. TEST(RecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) {
  32. std::map<int, std::map<int, std::map<int, int>>> const map{
  33. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  34. std::vector<std::tuple<int, int, int, int>> const expected{
  35. {1, 1, 1, 1}, {2, 2, 2, 2}, {2, 3, 3, 3}, {2, 3, 4, 4}};
  36. auto rit = make_recursive_iterator(map);
  37. EXPECT_EQ((ranges::to<std::vector<std::tuple<int, int, int, int>>>(
  38. rit, iterator::sentinel)),
  39. expected);
  40. }
  41. TEST(RecursiveIteratorMapTest, CanMutatePointedToData) {
  42. std::map<int, std::map<int, std::map<int, int>>> map{
  43. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  44. auto rit = make_recursive_iterator(map);
  45. std::get<3>(*rit) = 4;
  46. EXPECT_EQ(map[1][1][1], 4);
  47. }
  48. TEST(BoundRecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
  49. std::map<int, std::map<int, std::map<int, int>>> map{
  50. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  51. auto rit = make_recursive_iterator<2>(map);
  52. EXPECT_EQ(std::get<2>(*rit), map[1][1]);
  53. EXPECT_EQ(std::get<2>(*++rit), map[2][2]);
  54. EXPECT_EQ(std::get<2>(*rit), map[2][2]);
  55. }
  56. TEST(BoundRecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
  57. std::map<int, std::map<int, std::map<int, int>>> map{
  58. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  59. auto rit = make_recursive_iterator<2>(map);
  60. EXPECT_EQ(std::get<2>(*rit), map[1][1]);
  61. EXPECT_EQ(std::get<2>(*rit++), map[1][1]);
  62. EXPECT_EQ(std::get<2>(*rit), map[2][2]);
  63. }
  64. TEST(BoundRecursiveIteratorMapTest, IterDistanceSumOnNLayersSize) {
  65. std::map<int, std::map<int, std::map<int, int>>> const map{
  66. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  67. auto rit = make_recursive_iterator<2>(map);
  68. EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 3);
  69. }
  70. TEST(BoundRecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) {
  71. std::map<int, std::map<int, std::map<int, int>>> const map{
  72. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  73. std::vector<std::tuple<int, int, std::map<int, int>>> const expected{
  74. {1, 1, {{1, 1}}}, {2, 2, {{2, 2}}}, {2, 3, {{3, 3}, {4, 4}}}};
  75. EXPECT_THAT(map | iterator::views::recursive_n<2> |
  76. std::ranges::to<std::vector>(),
  77. testing::ElementsAreArray(expected));
  78. }
  79. TEST(BoundedRecursiveIteratorMapTest, CanMutatePointedToData) {
  80. std::map<int, std::map<int, std::map<int, int>>> map{
  81. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  82. auto rit = make_recursive_iterator<2>(map);
  83. std::get<2>(*rit).clear();
  84. EXPECT_THAT(map[1][1], IsEmpty());
  85. }