end_aware_iterator_test.cxx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "iterator/end_aware_iterator.hpp"
  2. #include <vector>
  3. #include "xcode_gtest_helper.h"
  4. using end_aware_iterator =
  5. ::iterator::end_aware_iterator<std::vector<int>::iterator>;
  6. TEST(EndAwareIteratorTest, IsConstructedFromInputs) {
  7. std::vector<int> v{1, 2, 3, 4, 5};
  8. auto begin = v.begin(), end = v.end();
  9. end_aware_iterator eai(begin, end);
  10. EXPECT_THAT(eai.current(), begin);
  11. EXPECT_THAT(eai.end(), end);
  12. }
  13. // TODO: This ought to be implemented as a compiles-test
  14. TEST(EndAwareIteratorTest, CanCastCompatibleIterators) {
  15. std::vector<int> v{1, 2, 3, 4, 5};
  16. end_aware_iterator eai(v.begin(), v.end());
  17. ::iterator::end_aware_iterator<std::vector<int>::const_iterator>{eai};
  18. }
  19. TEST(EndAwareIteratorTest, BeginWrapperIsEqualToBegin) {
  20. std::vector<int> v{1, 2, 3, 4, 5};
  21. EXPECT_THAT(*v.begin(), *end_aware_iterator(v.begin(), v.end()));
  22. }
  23. TEST(EndAwareIteratorTest, MutableActionsArePassthrough) {
  24. std::vector<int> v{1, 2, 3, 4, 5};
  25. *end_aware_iterator(v.begin(), v.end()) = -1;
  26. EXPECT_THAT(v[0], -1);
  27. }
  28. TEST(EndAwareIteratorTest, CanTellYouThatItsReachedEnd) {
  29. std::vector<int> v{1, 2, 3, 4, 5};
  30. end_aware_iterator it{v.end() - 1, v.end()};
  31. EXPECT_FALSE(it.at_end());
  32. ++it;
  33. EXPECT_THAT(it, end_aware_iterator(v.end(), v.end()));
  34. EXPECT_TRUE(it.at_end());
  35. }
  36. TEST(EndAwareIteratorTest, SingleArgIsEnd) {
  37. std::vector<int> v{1, 2, 3, 4, 5};
  38. EXPECT_TRUE(end_aware_iterator(v.begin()).at_end());
  39. }
  40. TEST(EndAwareIteratorTest, EmptyIteratorIsEnd) {
  41. EXPECT_TRUE(end_aware_iterator().at_end());
  42. }
  43. TEST(EndAwareIteratorTest, AllEndPointsAreEqual) {
  44. std::vector<int> v1{1, 2, 3, 4, 5};
  45. std::vector<int> v2{8, 9, 10};
  46. EXPECT_THAT(end_aware_iterator(v1.end(), v1.end()),
  47. end_aware_iterator(v2.end(), v2.end()));
  48. }
  49. TEST(EndAwareIteratorTest, PreIncrementAdvancesIterator) {
  50. std::vector<int> v{1, 2, 3, 4, 5};
  51. end_aware_iterator eai(v.begin(), v.end());
  52. EXPECT_THAT(*eai, 1);
  53. EXPECT_THAT(*++eai, 2);
  54. EXPECT_THAT(*eai, 2);
  55. }
  56. TEST(EndAwareIteratorTest, PostIncrementReturnsCopyOfPrev) {
  57. std::vector<int> v{1, 2, 3, 4, 5};
  58. end_aware_iterator eai(v.begin(), v.end());
  59. EXPECT_THAT(*eai, 1);
  60. EXPECT_THAT(*eai++, 1);
  61. EXPECT_THAT(*eai, 2);
  62. }
  63. TEST(EndAwareIteratorTest, IncrementOnEndIsUnsafe) {
  64. std::vector<int> v{1, 2, 3, 4, 5};
  65. end_aware_iterator it{v.end(), v.end()};
  66. end_aware_iterator const cp = it;
  67. ++it;
  68. EXPECT_NE(it, cp);
  69. }