join_iterator_test.cxx 3.0 KB

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