| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- //
- // zip_iterator_test.cxx
- // iterator-test
- //
- // Created by Sam Jaffe on 8/11/20.
- // Copyright © 2020 Sam Jaffe. All rights reserved.
- //
- #include "iterator/zip_iterator.h"
- #include <forward_list>
- #include <list>
- #include <vector>
- #include "xcode_gtest_helper.h"
- using iterator::ZipIterator;
- using testing::Eq;
- using testing::Ge;
- using testing::Gt;
- using testing::Le;
- using testing::Lt;
- using testing::Ne;
- using testing::StaticAssertTypeEq;
- TEST(ZipIterator, CategoryIsMostRestrictiveOfTypes) {
- std::vector<int> rnd{1, 2, 3};
- std::vector<std::string> ss{"A", "B", "C"};
- std::list<int> bid{1, 2, 3};
- std::forward_list<int> fwd{1, 2, 3};
- {
- ZipIterator zit(rnd.begin(), ss.begin());
- StaticAssertTypeEq<std::iterator_traits<decltype(zit)>::iterator_category,
- std::random_access_iterator_tag>();
- }
- {
- ZipIterator zit(rnd.begin(), bid.begin());
- StaticAssertTypeEq<std::iterator_traits<decltype(zit)>::iterator_category,
- std::bidirectional_iterator_tag>();
- }
- {
- ZipIterator zit(rnd.begin(), fwd.begin());
- StaticAssertTypeEq<std::iterator_traits<decltype(zit)>::iterator_category,
- std::forward_iterator_tag>();
- }
- {
- ZipIterator zit(bid.begin(), fwd.begin());
- StaticAssertTypeEq<std::iterator_traits<decltype(zit)>::iterator_category,
- std::forward_iterator_tag>();
- }
- }
- TEST(ZipIterator, CanCombineParallelObjects) {
- std::vector<int> is{1, 2, 3};
- std::vector<std::string> ss{"A", "B", "C"};
- ZipIterator zit(is.begin(), ss.begin());
- EXPECT_THAT(std::get<0>(*zit), 1);
- EXPECT_THAT(std::get<1>(*zit), "A");
- }
- TEST(ZipIterator, AdvancingMovesAllElements) {
- std::vector<int> is{1, 2, 3};
- std::vector<std::string> ss{"A", "B", "C"};
- ZipIterator zit(is.begin(), ss.begin());
- zit++;
- EXPECT_THAT(std::get<0>(*zit), 2);
- EXPECT_THAT(std::get<1>(*zit), "B");
- }
- TEST(ZipIterator, CanDecrement) {
- std::vector<int> is{1, 2, 3};
- std::vector<std::string> ss{"A", "B", "C"};
- ZipIterator zit(is.begin(), ss.begin());
- ++zit;
- zit--;
- EXPECT_THAT(std::get<0>(*zit), 1);
- EXPECT_THAT(std::get<1>(*zit), "A");
- }
- TEST(ZipIterator, CanMoveByAnyAmount) {
- std::vector<int> is{1, 2, 3};
- std::vector<std::string> ss{"A", "B", "C"};
- ZipIterator zit(is.begin(), ss.begin());
- zit = 2 + zit;
- EXPECT_THAT(std::get<0>(*zit), 3);
- EXPECT_THAT(std::get<1>(*zit), "C");
- zit = zit - 2;
- EXPECT_THAT(std::get<0>(*zit), 1);
- EXPECT_THAT(std::get<1>(*zit), "A");
- }
- TEST(ZipIterator, CanMarkDistance) {
- std::vector<int> is{1, 2, 3};
- std::vector<std::string> ss{"A", "B", "C"};
- ZipIterator zit(is.begin(), ss.begin());
- ZipIterator zend(is.end(), ss.end());
- EXPECT_THAT(zend - zit, 3);
- }
- TEST(ZipIterator, CanRandomAccess) {
- std::vector<int> is{1, 2, 3};
- std::vector<std::string> ss{"A", "B", "C"};
- ZipIterator zit(is.begin(), ss.begin());
- EXPECT_THAT(std::get<0>(zit[1]), 2);
- EXPECT_THAT(std::get<1>(zit[1]), "B");
- }
- TEST(ZipIterator, CanCompareIterators) {
- std::vector<int> is{1, 2, 3};
- std::vector<std::string> ss{"A", "B", "C"};
- ZipIterator const zit(is.begin(), ss.begin());
- ZipIterator const zend(is.end(), ss.end());
- EXPECT_THAT(zit, Eq(ZipIterator(is.begin(), ss.begin())));
- EXPECT_THAT(zit, Ne(zend));
- EXPECT_THAT(zit, Lt(zend));
- EXPECT_THAT(zit, Le(zend));
- EXPECT_THAT(zit, Le(zit));
- EXPECT_THAT(zend, Gt(zit));
- EXPECT_THAT(zend, Ge(zit));
- EXPECT_THAT(zend, Ge(zend));
- }
|