#include "iterator/unkeyed_iterator.h" #include #include #include "xcode_gtest_helper.h" #include "iterator/end_aware_iterator.h" using iterator::end_aware_iterator; using iterator::unkeyed_iterator; using testing::Ne; TEST(UnkeyedIteratorTest, IteratorOnlyReturnsValues) { std::map map{{1, 2}, {2, 3}}; std::vector const expected{2, 3}; std::vector const result{unkeyed_iterator{map.begin()}, unkeyed_iterator{map.end()}}; EXPECT_THAT(result, expected); } TEST(UnkeyedIteratorTest, CanModifyIteratedCollectionValues) { std::map map{{1, 2}, {2, 3}}; unkeyed_iterator uit{map.begin()}; *uit = 4; EXPECT_THAT(map[1], 4); } TEST(UnkeyedIteratorTest, PreIncrementAdvancesIterator) { std::map map{{1, 2}, {2, 3}}; unkeyed_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}}; unkeyed_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}}; unkeyed_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}}; unkeyed_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(++unkeyed_iterator(map.begin()), unkeyed_iterator(++map.begin())); EXPECT_THAT(unkeyed_iterator(map.begin()), Ne(unkeyed_iterator(++map.begin()))); } TEST(UnkeyedIteratorTest, PropagatesAtEnd) { std::map map{{1, 2}, {2, 3}}; unkeyed_iterator end(end_aware_iterator(map.end(), map.end())); EXPECT_EQ(end, iterator::sentinel); } TEST(UnkeyedIteratorTest, CanPointToObject) { std::map map{{1, 2}, {2, 3}}; EXPECT_THAT(unkeyed_iterator(map.begin()).operator->(), &(map.begin()->second)); }