| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #include "iterator/join_iterator.hpp"
- #include <vector>
- #include <gmock/gmock.h>
- using join_iterator =
- iterator::joining_iterator<std::vector<std::vector<int>>::iterator>;
- TEST(JoinIteratorTest, FirstDereferencedElemIsTheFirstInTheChain) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
- EXPECT_THAT(*join_iterator(make_end_aware_iterator(mv)), mv[0][0]);
- }
- TEST(JoinIteratorTest, HoldsReferenceToContainedElements) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
- EXPECT_THAT(join_iterator(make_end_aware_iterator(mv)).operator->(),
- &mv[0][0]);
- }
- TEST(JoinIteratorTest, DefaultCtorIsEnd) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
- EXPECT_THAT(join_iterator(make_end_aware_iterator(mv)),
- testing::Ne(join_iterator()));
- mv.clear();
- EXPECT_THAT(join_iterator(make_end_aware_iterator(mv)), join_iterator());
- }
- // TODO: This ought to be implemented as a compiles-test
- TEST(JoinIteratorTest, CanCastCompatibleIterators) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
- join_iterator it(make_end_aware_iterator(mv));
- iterator::joining_iterator<decltype(mv)::const_iterator>{it};
- }
- TEST(JoinIteratorTest, CanAccessInternalIterator) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
- auto eai = make_end_aware_iterator(mv);
- join_iterator it(eai);
- EXPECT_THAT(it.join_iterator(), eai);
- }
- TEST(JoinIteratorTest, CanAccessChildIterator) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
- join_iterator it(make_end_aware_iterator(mv));
- EXPECT_THAT(it.element_iterator(), make_end_aware_iterator(mv[0]));
- }
- TEST(JoinIteratorTest, EmptyConstructorEqualsEnd) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
- join_iterator it({mv.end(), mv.end()}, {mv.back().end(), mv.back().end()});
- EXPECT_THAT(it, join_iterator());
- }
- TEST(JoinIteratorTest, PreIncrementAdvancesIterator) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
- join_iterator it(make_end_aware_iterator(mv));
- EXPECT_THAT(*it, 1);
- EXPECT_THAT(*++it, 2);
- EXPECT_THAT(*it, 2);
- }
- TEST(JoinIteratorTest, PostIncrementReturnsCopyOfPrev) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
- join_iterator it(make_end_aware_iterator(mv));
- EXPECT_THAT(*it, 1);
- EXPECT_THAT(*it++, 1);
- EXPECT_THAT(*it, 2);
- }
- TEST(JoinIteratorTest, MovesFromListToListWhenReachingEnd) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
- join_iterator it(make_end_aware_iterator(mv), {mv[0].end(), mv[0].end()});
- EXPECT_THAT(*++it, mv[1][0]);
- }
- TEST(JoinIteratorTest, SkipsOverEmptyElements) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {}, {4, 5, 6}};
- join_iterator it(make_end_aware_iterator(mv), {mv[0].end(), mv[0].end()});
- EXPECT_THAT(*++it, mv[2][0]);
- }
- TEST(JoinIteratorTest, IncrementEndIsNoOp) {
- std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
- join_iterator it({mv.end(), mv.end()}, {mv.back().end(), mv.back().end()});
- join_iterator const cp = it;
- ++it;
- EXPECT_THAT(it, cp);
- }
|