zip_iterator_test.cxx 3.8 KB

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