end_aware_iterator_test.cxx 2.0 KB

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