zip_iterator_test.cxx 3.7 KB

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