#include "iterator/unkeyed_iterator.hpp" #include #include #include #include "iterator/end_aware_iterator.hpp" using value_iterator = iterator::unkeyed_iterator::iterator>; TEST(UnkeyedIteratorTest, IteratorOnlyReturnsValues) { std::map map{{1, 2}, {2, 3}}; std::vector const expected{2, 3}; std::vector const result{value_iterator{map.begin()}, value_iterator{map.end()}}; EXPECT_THAT(result, expected); } TEST(UnkeyedIteratorTest, CanModifyIteratedCollectionValues) { std::map map{{1, 2}, {2, 3}}; value_iterator uit{map.begin()}; *uit = 4; EXPECT_THAT(map[1], 4); } TEST(UnkeyedIteratorTest, PreIncrementAdvancesIterator) { std::map map{{1, 2}, {2, 3}}; value_iterator it(map.begin()); EXPECT_THAT(*it, 2); EXPECT_THAT(*++it, 3); EXPECT_THAT(*it, 3); } TEST(UnkeyedIteratorTest, PostIncrementReturnsCopyOfPrev) { std::map map{{1, 2}, {2, 3}}; value_iterator it(map.begin()); EXPECT_THAT(*it, 2); EXPECT_THAT(*it++, 2); EXPECT_THAT(*it, 3); } TEST(UnkeyedIteratorTest, PreDecrementAdvancesIterator) { std::map map{{1, 2}, {2, 3}}; value_iterator it(++map.begin()); EXPECT_THAT(*it, 3); EXPECT_THAT(*--it, 2); EXPECT_THAT(*it, 2); } TEST(UnkeyedIteratorTest, PostDecrementReturnsCopyOfPrev) { std::map map{{1, 2}, {2, 3}}; value_iterator it(++map.begin()); EXPECT_THAT(*it, 3); EXPECT_THAT(*it--, 3); EXPECT_THAT(*it, 2); } TEST(UnkeyedIteratorTest, EqualityIsPassthrough) { std::map map{{1, 2}, {2, 3}}; EXPECT_THAT(++value_iterator(map.begin()), value_iterator(++map.begin())); EXPECT_THAT(value_iterator(map.begin()), testing::Ne(value_iterator(++map.begin()))); } TEST(UnkeyedIteratorTest, IffBaseIteratorEmptyIsEndThenEmptyIsEnd) { std::map map{{1, 2}, {2, 3}}; EXPECT_THAT(value_iterator(), testing::Ne(value_iterator(map.end()))); iterator::end_aware_iterator end(map.end()); EXPECT_THAT(iterator::unkeyed_iterator(), iterator::unkeyed_iterator(end)); } TEST(UnkeyedIteratorTest, CanPointToObject) { std::map map{{1, 2}, {2, 3}}; EXPECT_THAT(value_iterator(map.begin()).operator->(), &(map.begin()->second)); }