#include "iterator/end_aware_iterator.hpp" #include #include "xcode_gtest_helper.h" using end_aware_iterator = ::iterator::end_aware_iterator::iterator>; TEST(EndAwareIteratorTest, IsConstructedFromInputs) { std::vector v{1, 2, 3, 4, 5}; auto begin = v.begin(), end = v.end(); end_aware_iterator eai(begin, end); EXPECT_THAT(eai.current(), begin); EXPECT_THAT(eai.end(), end); } // TODO: This ought to be implemented as a compiles-test TEST(EndAwareIteratorTest, CanCastCompatibleIterators) { std::vector v{1, 2, 3, 4, 5}; end_aware_iterator eai(v.begin(), v.end()); ::iterator::end_aware_iterator::const_iterator>{eai}; } TEST(EndAwareIteratorTest, BeginWrapperIsEqualToBegin) { std::vector v{1, 2, 3, 4, 5}; EXPECT_THAT(*v.begin(), *end_aware_iterator(v.begin(), v.end())); } TEST(EndAwareIteratorTest, MutableActionsArePassthrough) { std::vector v{1, 2, 3, 4, 5}; *end_aware_iterator(v.begin(), v.end()) = -1; EXPECT_THAT(v[0], -1); } TEST(EndAwareIteratorTest, CanTellYouThatItsReachedEnd) { std::vector v{1, 2, 3, 4, 5}; end_aware_iterator it{v.end() - 1, v.end()}; EXPECT_FALSE(it.at_end()); ++it; EXPECT_THAT(it, end_aware_iterator(v.end(), v.end())); EXPECT_TRUE(it.at_end()); } TEST(EndAwareIteratorTest, SingleArgIsEnd) { std::vector v{1, 2, 3, 4, 5}; EXPECT_TRUE(end_aware_iterator(v.begin()).at_end()); } TEST(EndAwareIteratorTest, EmptyIteratorIsEnd) { EXPECT_TRUE(end_aware_iterator().at_end()); } TEST(EndAwareIteratorTest, AllEndPointsAreEqual) { std::vector v1{1, 2, 3, 4, 5}; std::vector v2{8, 9, 10}; EXPECT_THAT(end_aware_iterator(v1.end(), v1.end()), end_aware_iterator(v2.end(), v2.end())); } TEST(EndAwareIteratorTest, PreIncrementAdvancesIterator) { std::vector v{1, 2, 3, 4, 5}; end_aware_iterator eai(v.begin(), v.end()); EXPECT_THAT(*eai, 1); EXPECT_THAT(*++eai, 2); EXPECT_THAT(*eai, 2); } TEST(EndAwareIteratorTest, PostIncrementReturnsCopyOfPrev) { std::vector v{1, 2, 3, 4, 5}; end_aware_iterator eai(v.begin(), v.end()); EXPECT_THAT(*eai, 1); EXPECT_THAT(*eai++, 1); EXPECT_THAT(*eai, 2); } TEST(EndAwareIteratorTest, IncrementOnEndIsUnsafe) { std::vector v{1, 2, 3, 4, 5}; end_aware_iterator it{v.end(), v.end()}; end_aware_iterator const cp = it; ++it; EXPECT_NE(it, cp); }