recursive_iterator_map_test.cxx 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "iterator/recursive_iterator.hpp"
  2. #include <map>
  3. #include <tuple>
  4. #include <vector>
  5. #include "xcode_gtest_helper.h"
  6. TEST(RecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
  7. std::map<int, std::map<int, std::map<int, int>>> const map{
  8. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  9. auto rit = make_recursive_iterator(map);
  10. EXPECT_THAT(std::get<3>(*rit), 1);
  11. EXPECT_THAT(std::get<3>(*++rit), 2);
  12. EXPECT_THAT(std::get<3>(*rit), 2);
  13. }
  14. TEST(RecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
  15. std::map<int, std::map<int, std::map<int, int>>> const map{
  16. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  17. auto rit = make_recursive_iterator(map);
  18. EXPECT_THAT(std::get<3>(*rit), 1);
  19. EXPECT_THAT(std::get<3>(*rit++), 1);
  20. EXPECT_THAT(std::get<3>(*rit), 2);
  21. }
  22. TEST(RecursiveIteratorMapTest, IterDistanceIsSumOfInnerContainerSizes) {
  23. std::map<int, std::map<int, std::map<int, int>>> const map{
  24. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  25. auto rit = make_recursive_iterator(map);
  26. decltype(rit) end{};
  27. // TODO: Actually perform the summation?
  28. EXPECT_THAT(std::distance(rit, end), 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. decltype(expected) result(rit, decltype(rit)());
  37. EXPECT_THAT(result, expected);
  38. }
  39. TEST(RecursiveIteratorMapTest, CanMutatePointedToData) {
  40. std::map<int, std::map<int, std::map<int, int>>> map{
  41. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  42. auto rit = make_recursive_iterator(map);
  43. std::get<3>(*rit) = 4;
  44. EXPECT_THAT(map[1][1][1], 4);
  45. }
  46. TEST(BoundRecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
  47. std::map<int, std::map<int, std::map<int, int>>> map{
  48. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  49. auto rit = make_recursive_iterator<2>(map);
  50. EXPECT_THAT(std::get<2>(*rit), map[1][1]);
  51. EXPECT_THAT(std::get<2>(*++rit), map[2][2]);
  52. EXPECT_THAT(std::get<2>(*rit), map[2][2]);
  53. }
  54. TEST(BoundRecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
  55. std::map<int, std::map<int, std::map<int, int>>> map{
  56. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  57. auto rit = make_recursive_iterator<2>(map);
  58. EXPECT_THAT(std::get<2>(*rit), map[1][1]);
  59. EXPECT_THAT(std::get<2>(*rit++), map[1][1]);
  60. EXPECT_THAT(std::get<2>(*rit), map[2][2]);
  61. }
  62. TEST(BoundRecursiveIteratorMapTest, IterDistanceSumOnNLayersSize) {
  63. std::map<int, std::map<int, std::map<int, int>>> const map{
  64. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  65. auto rit = make_recursive_iterator<2>(map);
  66. decltype(rit) end{};
  67. EXPECT_THAT(std::distance(rit, end), 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. decltype(expected) result(rit, decltype(rit)());
  76. EXPECT_THAT(result, expected);
  77. }
  78. TEST(BoundedRecursiveIteratorMapTest, CanMutatePointedToData) {
  79. std::map<int, std::map<int, std::map<int, int>>> map{
  80. {1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
  81. auto rit = make_recursive_iterator<2>(map);
  82. std::get<2>(*rit).clear();
  83. EXPECT_THAT(map[1][1], testing::IsEmpty());
  84. }