Переглянути джерело

Fix const-correctness on operator!=.

Add test coverage to the rest of joining_iterator.
Sam Jaffe 5 роки тому
батько
коміт
4835c03704
2 змінених файлів з 51 додано та 1 видалено
  1. 1 1
      include/iterator/join_iterator.hpp
  2. 50 0
      test/join_iterator_test.cxx

+ 1 - 1
include/iterator/join_iterator.hpp

@@ -62,7 +62,7 @@ namespace iterator {
       return joiner_ == other.joiner_ && iterator_ == other.iterator_;
     }
 
-    bool operator!=(joining_iterator const & other) {
+    bool operator!=(joining_iterator const & other) const {
       return !(operator==(other));
     }
 

+ 50 - 0
test/join_iterator_test.cxx

@@ -12,12 +12,62 @@ TEST(JoinIteratorTest, FirstDereferencedElemIsTheFirstInTheChain) {
   EXPECT_THAT(*join_iterator(make_end_aware_iterator(mv)), mv[0][0]);
 }
 
+TEST(JoinIteratorTest, HoldsReferenceToContainedElements) {
+  std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
+  EXPECT_THAT(join_iterator(make_end_aware_iterator(mv)).operator->(),
+              &mv[0][0]);
+}
+
+TEST(JoinIteratorTest, DefaultCtorIsEnd) {
+  std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
+  EXPECT_THAT(join_iterator(make_end_aware_iterator(mv)),
+              testing::Ne(join_iterator()));
+  mv.clear();
+  EXPECT_THAT(join_iterator(make_end_aware_iterator(mv)), join_iterator());
+}
+
+// TODO: This ought to be implemented as a compiles-test
+TEST(JoinIteratorTest, CanCastCompatibleIterators) {
+  std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
+  join_iterator it(make_end_aware_iterator(mv));
+  iterator::joining_iterator<decltype(mv)::const_iterator>{it};
+}
+
+TEST(JoinIteratorTest, CanAccessInternalIterator) {
+  std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
+  auto eai = make_end_aware_iterator(mv);
+  join_iterator it(eai);
+  EXPECT_THAT(it.join_iterator(), eai);
+}
+
+TEST(JoinIteratorTest, CanAccessChildIterator) {
+  std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
+  join_iterator it(make_end_aware_iterator(mv));
+  EXPECT_THAT(it.element_iterator(), make_end_aware_iterator(mv[0]));
+}
+
 TEST(JoinIteratorTest, EmptyConstructorEqualsEnd) {
   std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
   join_iterator it({mv.end(), mv.end()}, {mv.back().end(), mv.back().end()});
   EXPECT_THAT(it, join_iterator());
 }
 
+TEST(JoinIteratorTest, PreIncrementAdvancesIterator) {
+  std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
+  join_iterator it(make_end_aware_iterator(mv));
+  EXPECT_THAT(*it, 1);
+  EXPECT_THAT(*++it, 2);
+  EXPECT_THAT(*it, 2);
+}
+
+TEST(JoinIteratorTest, PostIncrementReturnsCopyOfPrev) {
+  std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
+  join_iterator it(make_end_aware_iterator(mv));
+  EXPECT_THAT(*it, 1);
+  EXPECT_THAT(*it++, 1);
+  EXPECT_THAT(*it, 2);
+}
+
 TEST(JoinIteratorTest, MovesFromListToListWhenReachingEnd) {
   std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
   join_iterator it(make_end_aware_iterator(mv), {mv[0].end(), mv[0].end()});