|
@@ -7,6 +7,21 @@
|
|
|
using end_aware_iterator =
|
|
using end_aware_iterator =
|
|
|
::iterator::end_aware_iterator<std::vector<int>::iterator>;
|
|
::iterator::end_aware_iterator<std::vector<int>::iterator>;
|
|
|
|
|
|
|
|
|
|
+TEST(EndAwareIteratorTest, IsConstructedFromInputs) {
|
|
|
|
|
+ std::vector<int> v{1, 2, 3, 4, 5};
|
|
|
|
|
+ auto begin = v.begin(), end = v.end();
|
|
|
|
|
+ end_aware_iterator eai(begin, end);
|
|
|
|
|
+ EXPECT_THAT(eai.current(), begin);
|
|
|
|
|
+ EXPECT_THAT(eai.end(), end);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// TODO: This ought to be implemented as a compiles-test
|
|
|
|
|
+TEST(EndAwareIteratorTest, CanCastCompatibleIterators) {
|
|
|
|
|
+ std::vector<int> v{1, 2, 3, 4, 5};
|
|
|
|
|
+ end_aware_iterator eai(v.begin(), v.end());
|
|
|
|
|
+ ::iterator::end_aware_iterator<std::vector<int>::const_iterator>{eai};
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
TEST(EndAwareIteratorTest, BeginWrapperIsEqualToBegin) {
|
|
TEST(EndAwareIteratorTest, BeginWrapperIsEqualToBegin) {
|
|
|
std::vector<int> v{1, 2, 3, 4, 5};
|
|
std::vector<int> v{1, 2, 3, 4, 5};
|
|
|
EXPECT_THAT(*v.begin(), *end_aware_iterator(v.begin(), v.end()));
|
|
EXPECT_THAT(*v.begin(), *end_aware_iterator(v.begin(), v.end()));
|
|
@@ -27,6 +42,38 @@ TEST(EndAwareIteratorTest, CanTellYouThatItsReachedEnd) {
|
|
|
EXPECT_TRUE(it.done());
|
|
EXPECT_TRUE(it.done());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+TEST(EndAwareIteratorTest, SingleArgIsEnd) {
|
|
|
|
|
+ std::vector<int> v{1, 2, 3, 4, 5};
|
|
|
|
|
+ EXPECT_TRUE(end_aware_iterator(v.begin()).done());
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+TEST(EndAwareIteratorTest, EmptyIteratorIsEnd) {
|
|
|
|
|
+ EXPECT_TRUE(end_aware_iterator().done());
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+TEST(EndAwareIteratorTest, AllEndPointsAreEqual) {
|
|
|
|
|
+ std::vector<int> v1{1, 2, 3, 4, 5};
|
|
|
|
|
+ std::vector<int> v2{8, 9, 10};
|
|
|
|
|
+ EXPECT_THAT(end_aware_iterator(v1.end(), v1.end()),
|
|
|
|
|
+ end_aware_iterator(v2.end(), v2.end()));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+TEST(EndAwareIteratorTest, PreIncrementAdvancesIterator) {
|
|
|
|
|
+ std::vector<int> v{1, 2, 3, 4, 5};
|
|
|
|
|
+ end_aware_iterator eai(v.begin(), v.end());
|
|
|
|
|
+ EXPECT_THAT(*eai, 1);
|
|
|
|
|
+ EXPECT_THAT(*++eai, 2);
|
|
|
|
|
+ EXPECT_THAT(*eai, 2);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+TEST(EndAwareIteratorTest, PostIncrementReturnsCopyOfPrev) {
|
|
|
|
|
+ std::vector<int> v{1, 2, 3, 4, 5};
|
|
|
|
|
+ end_aware_iterator eai(v.begin(), v.end());
|
|
|
|
|
+ EXPECT_THAT(*eai, 1);
|
|
|
|
|
+ EXPECT_THAT(*eai++, 1);
|
|
|
|
|
+ EXPECT_THAT(*eai, 2);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
TEST(EndAwareIteratorTest, IncrementOnEndIsNoOp) {
|
|
TEST(EndAwareIteratorTest, IncrementOnEndIsNoOp) {
|
|
|
std::vector<int> v{1, 2, 3, 4, 5};
|
|
std::vector<int> v{1, 2, 3, 4, 5};
|
|
|
end_aware_iterator it{v.end(), v.end()};
|
|
end_aware_iterator it{v.end(), v.end()};
|