end_aware_iterator_test.cxx 2.0 KB

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