zip_iterator_test.cxx 3.4 KB

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