recursive_iterator_map_test.cxx 3.8 KB

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