zip_iterator_test.cxx 3.6 KB

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