#include "iterator/end_aware_iterator.h" #include #include #include "xcode_gtest_helper.h" using iterator::EndAwareIterator; TEST(EndAwareIterator, IStreamIterator) { std::stringstream ss{"0 1 2 3"}; EndAwareIterator eai{std::istream_iterator(ss), std::istream_iterator()}; EXPECT_TRUE(iterator::single_pass); } // TODO: This ought to be implemented as a compiles-test TEST(EndAwareIterator, CanCastCompatibleIterators) { std::vector v{1, 2, 3, 4, 5}; EndAwareIterator eai(v.begin(), v.end()); EndAwareIterator::const_iterator>{eai}; } TEST(EndAwareIterator, BeginWrapperIsEqualToBegin) { std::vector v{1, 2, 3, 4, 5}; EXPECT_THAT(*v.begin(), *EndAwareIterator(v.begin(), v.end())); } TEST(EndAwareIterator, MutableActionsArePassthrough) { std::vector v{1, 2, 3, 4, 5}; *EndAwareIterator(v.begin(), v.end()) = -1; EXPECT_THAT(v[0], -1); } TEST(EndAwareIterator, CanTellYouThatItsReachedEnd) { std::vector v{1, 2, 3, 4, 5}; EndAwareIterator it{v.end() - 1, v.end()}; EXPECT_FALSE(it.at_end()); ++it; EXPECT_THAT(it, EndAwareIterator(v.end(), v.end())); EXPECT_TRUE(it.at_end()); } TEST(EndAwareIterator, EmptyIteratorIsEnd) { EXPECT_TRUE(EndAwareIterator::iterator>().at_end()); } TEST(EndAwareIterator, PreIncrementAdvancesIterator) { std::vector v{1, 2, 3, 4, 5}; EndAwareIterator eai(v.begin(), v.end()); EXPECT_THAT(*eai, 1); EXPECT_THAT(*++eai, 2); EXPECT_THAT(*eai, 2); } TEST(EndAwareIterator, PostIncrementReturnsCopyOfPrev) { std::vector v{1, 2, 3, 4, 5}; EndAwareIterator eai(v.begin(), v.end()); EXPECT_THAT(*eai, 1); EXPECT_THAT(*eai++, 1); EXPECT_THAT(*eai, 2); } TEST(EndAwareIterator, CanIterateWithSentinel) { std::vector v{1, 2, 3, 4, 5}; size_t count{0}; for (EndAwareIterator it(v); it != iterator::sentinel; ++it) { ++count; } EXPECT_THAT(count, 5); }