join_iterator_test.cxx 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "iterator/join_iterator.hpp"
  2. #include <vector>
  3. #include <gmock/gmock.h>
  4. using join_iterator =
  5. iterator::joining_iterator<std::vector<std::vector<int>>::iterator>;
  6. TEST(JoinIteratorTest, FirstDereferencedElemIsTheFirstInTheChain) {
  7. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  8. EXPECT_THAT(*join_iterator(make_end_aware_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_THAT(join_iterator(make_end_aware_iterator(mv)).operator->(),
  13. &mv[0][0]);
  14. }
  15. TEST(JoinIteratorTest, DefaultCtorIsEnd) {
  16. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  17. EXPECT_THAT(join_iterator(make_end_aware_iterator(mv)),
  18. testing::Ne(join_iterator()));
  19. mv.clear();
  20. EXPECT_THAT(join_iterator(make_end_aware_iterator(mv)), join_iterator());
  21. }
  22. // TODO: This ought to be implemented as a compiles-test
  23. TEST(JoinIteratorTest, CanCastCompatibleIterators) {
  24. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  25. join_iterator it(make_end_aware_iterator(mv));
  26. iterator::joining_iterator<decltype(mv)::const_iterator>{it};
  27. }
  28. TEST(JoinIteratorTest, CanAccessInternalIterator) {
  29. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  30. auto eai = make_end_aware_iterator(mv);
  31. join_iterator it(eai);
  32. EXPECT_THAT(it.join_iterator(), eai);
  33. }
  34. TEST(JoinIteratorTest, CanAccessChildIterator) {
  35. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  36. join_iterator it(make_end_aware_iterator(mv));
  37. EXPECT_THAT(it.element_iterator(), make_end_aware_iterator(mv[0]));
  38. }
  39. TEST(JoinIteratorTest, EmptyConstructorEqualsEnd) {
  40. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  41. join_iterator it({mv.end(), mv.end()}, {mv.back().end(), mv.back().end()});
  42. EXPECT_THAT(it, join_iterator());
  43. }
  44. TEST(JoinIteratorTest, PreIncrementAdvancesIterator) {
  45. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  46. join_iterator it(make_end_aware_iterator(mv));
  47. EXPECT_THAT(*it, 1);
  48. EXPECT_THAT(*++it, 2);
  49. EXPECT_THAT(*it, 2);
  50. }
  51. TEST(JoinIteratorTest, PostIncrementReturnsCopyOfPrev) {
  52. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  53. join_iterator it(make_end_aware_iterator(mv));
  54. EXPECT_THAT(*it, 1);
  55. EXPECT_THAT(*it++, 1);
  56. EXPECT_THAT(*it, 2);
  57. }
  58. TEST(JoinIteratorTest, MovesFromListToListWhenReachingEnd) {
  59. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  60. join_iterator it(make_end_aware_iterator(mv), {mv[0].end(), mv[0].end()});
  61. EXPECT_THAT(*++it, mv[1][0]);
  62. }
  63. TEST(JoinIteratorTest, SkipsOverEmptyElements) {
  64. std::vector<std::vector<int>> mv{{1, 2, 3}, {}, {4, 5, 6}};
  65. join_iterator it(make_end_aware_iterator(mv), {mv[0].end(), mv[0].end()});
  66. EXPECT_THAT(*++it, mv[2][0]);
  67. }
  68. TEST(JoinIteratorTest, IncrementEndIsNoOp) {
  69. std::vector<std::vector<int>> mv{{1, 2, 3}, {4, 5, 6}};
  70. join_iterator it({mv.end(), mv.end()}, {mv.back().end(), mv.back().end()});
  71. join_iterator const cp = it;
  72. ++it;
  73. EXPECT_THAT(it, cp);
  74. }