recursive_iterator_map_test.cxx 3.9 KB

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