zip_iterator_test.cxx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. //
  2. // zip_iterator_test.cxx
  3. // iterator-test
  4. //
  5. // Created by Sam Jaffe on 8/11/20.
  6. // Copyright © 2020 Sam Jaffe. All rights reserved.
  7. //
  8. #include "iterator/zip_iterator.h"
  9. #include <forward_list>
  10. #include <list>
  11. #include <vector>
  12. #include "xcode_gtest_helper.h"
  13. using iterator::zip_iterator;
  14. using testing::Eq;
  15. using testing::Ge;
  16. using testing::Gt;
  17. using testing::Le;
  18. using testing::Lt;
  19. using testing::Ne;
  20. using testing::StaticAssertTypeEq;
  21. TEST(ZipIteratorTest, CategoryIsMostRestrictiveOfTypes) {
  22. std::vector<int> rnd{1, 2, 3};
  23. std::vector<std::string> ss{"A", "B", "C"};
  24. std::list<int> bid{1, 2, 3};
  25. std::forward_list<int> fwd{1, 2, 3};
  26. {
  27. zip_iterator zit(rnd.begin(), ss.begin());
  28. StaticAssertTypeEq<std::iterator_traits<decltype(zit)>::iterator_category,
  29. std::random_access_iterator_tag>();
  30. }
  31. {
  32. zip_iterator zit(rnd.begin(), bid.begin());
  33. StaticAssertTypeEq<std::iterator_traits<decltype(zit)>::iterator_category,
  34. std::bidirectional_iterator_tag>();
  35. }
  36. {
  37. zip_iterator zit(rnd.begin(), fwd.begin());
  38. StaticAssertTypeEq<std::iterator_traits<decltype(zit)>::iterator_category,
  39. std::forward_iterator_tag>();
  40. }
  41. {
  42. zip_iterator zit(bid.begin(), fwd.begin());
  43. StaticAssertTypeEq<std::iterator_traits<decltype(zit)>::iterator_category,
  44. std::forward_iterator_tag>();
  45. }
  46. }
  47. // TEST(ZipIteratorTest, CannotInvokeOperatorArrow) {
  48. // std::vector<int> is{1, 2, 3};
  49. // std::vector<std::string> ss{"A", "B", "C"};
  50. // auto zit = make_zip_iterator(is.begin(), ss.begin());
  51. // StaticAssertTypeEq<decltype(zit.operator->()), void>();
  52. //}
  53. TEST(ZipIteratorTest, CanCombineParallelObjects) {
  54. std::vector<int> is{1, 2, 3};
  55. std::vector<std::string> ss{"A", "B", "C"};
  56. zip_iterator zit(is.begin(), ss.begin());
  57. EXPECT_THAT(std::get<0>(*zit), 1);
  58. EXPECT_THAT(std::get<1>(*zit), "A");
  59. }
  60. TEST(ZipIteratorTest, AdvancingMovesAllElements) {
  61. std::vector<int> is{1, 2, 3};
  62. std::vector<std::string> ss{"A", "B", "C"};
  63. zip_iterator zit(is.begin(), ss.begin());
  64. zit++;
  65. EXPECT_THAT(std::get<0>(*zit), 2);
  66. EXPECT_THAT(std::get<1>(*zit), "B");
  67. }
  68. TEST(ZipIteratorTest, CanDecrement) {
  69. std::vector<int> is{1, 2, 3};
  70. std::vector<std::string> ss{"A", "B", "C"};
  71. zip_iterator zit(is.begin(), ss.begin());
  72. ++zit;
  73. zit--;
  74. EXPECT_THAT(std::get<0>(*zit), 1);
  75. EXPECT_THAT(std::get<1>(*zit), "A");
  76. }
  77. TEST(ZipIteratorTest, CanMoveByAnyAmount) {
  78. std::vector<int> is{1, 2, 3};
  79. std::vector<std::string> ss{"A", "B", "C"};
  80. zip_iterator zit(is.begin(), ss.begin());
  81. zit = 2 + zit;
  82. EXPECT_THAT(std::get<0>(*zit), 3);
  83. EXPECT_THAT(std::get<1>(*zit), "C");
  84. zit = zit - 2;
  85. EXPECT_THAT(std::get<0>(*zit), 1);
  86. EXPECT_THAT(std::get<1>(*zit), "A");
  87. }
  88. TEST(ZipIteratorTest, CanMarkDistance) {
  89. std::vector<int> is{1, 2, 3};
  90. std::vector<std::string> ss{"A", "B", "C"};
  91. zip_iterator zit(is.begin(), ss.begin());
  92. zip_iterator zend(is.end(), ss.end());
  93. EXPECT_THAT(zend - zit, 3);
  94. }
  95. TEST(ZipIteratorTest, CanRandomAccess) {
  96. std::vector<int> is{1, 2, 3};
  97. std::vector<std::string> ss{"A", "B", "C"};
  98. zip_iterator zit(is.begin(), ss.begin());
  99. EXPECT_THAT(std::get<0>(zit[1]), 2);
  100. EXPECT_THAT(std::get<1>(zit[1]), "B");
  101. }
  102. TEST(ZipIteratorTest, CanCompareIterators) {
  103. std::vector<int> is{1, 2, 3};
  104. std::vector<std::string> ss{"A", "B", "C"};
  105. zip_iterator const zit(is.begin(), ss.begin());
  106. zip_iterator const zend(is.end(), ss.end());
  107. EXPECT_THAT(zit, Eq(zip_iterator(is.begin(), ss.begin())));
  108. EXPECT_THAT(zit, Ne(zend));
  109. EXPECT_THAT(zit, Lt(zend));
  110. EXPECT_THAT(zit, Le(zend));
  111. EXPECT_THAT(zit, Le(zit));
  112. EXPECT_THAT(zend, Gt(zit));
  113. EXPECT_THAT(zend, Ge(zit));
  114. EXPECT_THAT(zend, Ge(zend));
  115. }