join_iterator_test.cxx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "iterator/join_iterator.h"
  2. #include <vector>
  3. #include "xcode_gtest_helper.h"
  4. using iterator::end_aware_iterator;
  5. using iterator::joining_iterator;
  6. TEST(JoinIteratorTest, FirstDereferencedElemIsTheFirstInTheChain) {
  7. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  8. EXPECT_EQ(*joining_iterator(mv), mv[0][0]);
  9. }
  10. TEST(JoinIteratorTest, HoldsReferenceToContainedElements) {
  11. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  12. EXPECT_EQ(joining_iterator(mv).operator->(), &mv[0][0]);
  13. }
  14. TEST(JoinIteratorTest, EmptyContainerBeginIsEnd) {
  15. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  16. joining_iterator it(mv);
  17. EXPECT_NE(it, iterator::sentinel);
  18. mv.clear();
  19. EXPECT_EQ(joining_iterator(mv), iterator::sentinel);
  20. }
  21. // TODO: This ought to be implemented as a compiles-test
  22. TEST(JoinIteratorTest, CanCastCompatibleIterators) {
  23. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  24. joining_iterator it(mv);
  25. iterator::joining_iterator<decltype(mv)::const_iterator>{it};
  26. }
  27. TEST(JoinIteratorTest, CanAccessInternalIterator) {
  28. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  29. auto eai = end_aware_iterator(mv);
  30. joining_iterator it(eai);
  31. EXPECT_EQ(it.outer_iterator(), eai);
  32. }
  33. TEST(JoinIteratorTest, CanAccessChildIterator) {
  34. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  35. joining_iterator it(mv);
  36. EXPECT_EQ(it.inner_iterator(), end_aware_iterator(mv[0]));
  37. }
  38. TEST(JoinIteratorTest, PreIncrementAdvancesIterator) {
  39. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  40. joining_iterator it(mv);
  41. EXPECT_EQ(*it, 1);
  42. EXPECT_EQ(*++it, 2);
  43. EXPECT_EQ(*it, 2);
  44. }
  45. TEST(JoinIteratorTest, PostIncrementReturnsCopyOfPrev) {
  46. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  47. joining_iterator it(mv);
  48. EXPECT_EQ(*it, 1);
  49. EXPECT_EQ(*it++, 1);
  50. EXPECT_EQ(*it, 2);
  51. }
  52. TEST(JoinIteratorTest, MovesFromListToListWhenReachingEnd) {
  53. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  54. joining_iterator it(mv);
  55. std::advance(it, 2);
  56. EXPECT_EQ(*++it, mv[1][0]);
  57. }
  58. TEST(JoinIteratorTest, SkipsOverEmptyElements) {
  59. std::vector<std::vector<int>> mv{{1, 2, 3}, {}, {4, 5, 6}};
  60. joining_iterator it(mv);
  61. std::advance(it, 2);
  62. EXPECT_EQ(*++it, mv[2][0]);
  63. }