recursive_iterator_map_test.cxx 3.8 KB

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