join_iterator_test.cxx 2.2 KB

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