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