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