end_aware_iterator_test.cxx 2.1 KB

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