#include "iterator/join_iterator.hpp" #include #include using join_iterator = iterator::joining_iterator>::iterator>; TEST(JoinIteratorTest, FirstDereferencedElemIsTheFirstInTheChain) { std::vector> mv{{1, 2, 3}, {4, 5, 6}}; EXPECT_THAT(*join_iterator(make_end_aware_iterator(mv)), mv[0][0]); } TEST(JoinIteratorTest, HoldsReferenceToContainedElements) { std::vector> 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> 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> mv{{1, 2, 3}, {4, 5, 6}}; join_iterator it(make_end_aware_iterator(mv)); iterator::joining_iterator{it}; } TEST(JoinIteratorTest, CanAccessInternalIterator) { std::vector> 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> 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> 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> 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> 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> 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> 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> 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); }