#include "iterator/join_iterator.h" #include #include "xcode_gtest_helper.h" using iterator::EndAwareIterator; using iterator::JoinIterator; using testing::Not; TEST(JoinIterator, FirstDereferencedElemIsTheFirstInTheChain) { std::vector> mv{{1, 2, 3}, {4, 5, 6}}; EXPECT_THAT(*JoinIterator(mv), mv[0][0]); } TEST(JoinIterator, HoldsReferenceToContainedElements) { std::vector> mv{{1, 2, 3}, {4, 5, 6}}; EXPECT_THAT(JoinIterator(mv).operator->(), &mv[0][0]); } TEST(JoinIterator, EmptyContainerBeginIsEnd) { std::vector> mv{{1, 2, 3}, {4, 5, 6}}; JoinIterator it(mv); EXPECT_THAT(it, Not(iterator::sentinel)); mv.clear(); EXPECT_THAT(JoinIterator(mv), iterator::sentinel); } // TODO: This ought to be implemented as a compiles-test TEST(JoinIterator, CanCastCompatibleIterators) { std::vector> mv{{1, 2, 3}, {4, 5, 6}}; JoinIterator it(mv); iterator::JoinIterator{it}; } TEST(JoinIterator, CanAccessInternalIterator) { std::vector> mv{{1, 2, 3}, {4, 5, 6}}; auto eai = EndAwareIterator(mv); JoinIterator it(eai); EXPECT_THAT(it.outer_iterator(), eai); } TEST(JoinIterator, CanAccessChildIterator) { std::vector> mv{{1, 2, 3}, {4, 5, 6}}; JoinIterator it(mv); EXPECT_THAT(it.inner_iterator(), EndAwareIterator(mv[0])); } TEST(JoinIterator, PreIncrementAdvancesIterator) { std::vector> mv{{1, 2, 3}, {4, 5, 6}}; JoinIterator it(mv); EXPECT_THAT(*it, 1); EXPECT_THAT(*++it, 2); EXPECT_THAT(*it, 2); } TEST(JoinIterator, PostIncrementReturnsCopyOfPrev) { std::vector> mv{{1, 2, 3}, {4, 5, 6}}; JoinIterator it(mv); EXPECT_THAT(*it, 1); EXPECT_THAT(*it++, 1); EXPECT_THAT(*it, 2); } TEST(JoinIterator, MovesFromListToListWhenReachingEnd) { std::vector> mv{{1, 2, 3}, {4, 5, 6}}; JoinIterator it(mv); std::advance(it, 2); EXPECT_THAT(*++it, mv[1][0]); } TEST(JoinIterator, SkipsOverEmptyElements) { std::vector> mv{{1, 2, 3}, {}, {4, 5, 6}}; JoinIterator it(mv); std::advance(it, 2); EXPECT_THAT(*++it, mv[2][0]); }