#include "iterator/end_aware_iterator.h" #include #include #include "xcode_gtest_helper.h" using iterator::end_aware_iterator; TEST(EndAwareIterator, IStreamIterator) { std::stringstream ss{"0 1 2 3"}; end_aware_iterator 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}; end_aware_iterator eai(v.begin(), v.end()); end_aware_iterator::const_iterator>{eai}; } TEST(EndAwareIterator, BeginWrapperIsEqualToBegin) { std::vector v{1, 2, 3, 4, 5}; EXPECT_EQ(*v.begin(), *end_aware_iterator(v.begin(), v.end())); } TEST(EndAwareIterator, MutableActionsArePassthrough) { std::vector v{1, 2, 3, 4, 5}; *end_aware_iterator(v.begin(), v.end()) = -1; EXPECT_EQ(v[0], -1); } TEST(EndAwareIterator, 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_EQ(it, end_aware_iterator(v.end(), v.end())); EXPECT_TRUE(it.at_end()); } TEST(EndAwareIterator, EmptyIteratorIsEnd) { EXPECT_TRUE(end_aware_iterator::iterator>().at_end()); } TEST(EndAwareIterator, PreIncrementAdvancesIterator) { std::vector v{1, 2, 3, 4, 5}; end_aware_iterator eai(v.begin(), v.end()); EXPECT_EQ(*eai, 1); EXPECT_EQ(*++eai, 2); EXPECT_EQ(*eai, 2); } TEST(EndAwareIterator, PostIncrementReturnsCopyOfPrev) { std::vector v{1, 2, 3, 4, 5}; end_aware_iterator eai(v.begin(), v.end()); EXPECT_EQ(*eai, 1); EXPECT_EQ(*eai++, 1); EXPECT_EQ(*eai, 2); } TEST(EndAwareIterator, CanIterateWithSentinel) { std::vector v{1, 2, 3, 4, 5}; size_t count{0}; for (end_aware_iterator it(v); it != iterator::sentinel; ++it) { ++count; } EXPECT_EQ(count, 5); }