end_aware_iterator_test.cxx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "iterator/end_aware_iterator.h"
  2. #include <iostream>
  3. #include <vector>
  4. #include "xcode_gtest_helper.h"
  5. using iterator::end_aware_iterator;
  6. TEST(EndAwareIterator, IStreamIterator) {
  7. std::stringstream ss{"0 1 2 3"};
  8. end_aware_iterator eai{std::istream_iterator<int>(ss), std::istream_iterator<int>()};
  9. EXPECT_TRUE(iterator::single_pass<decltype(eai)>);
  10. }
  11. // TODO: This ought to be implemented as a compiles-test
  12. TEST(EndAwareIterator, CanCastCompatibleIterators) {
  13. std::vector<int> v{1, 2, 3, 4, 5};
  14. end_aware_iterator eai(v.begin(), v.end());
  15. end_aware_iterator<std::vector<int>::const_iterator>{eai};
  16. }
  17. TEST(EndAwareIterator, BeginWrapperIsEqualToBegin) {
  18. std::vector<int> v{1, 2, 3, 4, 5};
  19. EXPECT_EQ(*v.begin(), *end_aware_iterator(v.begin(), v.end()));
  20. }
  21. TEST(EndAwareIterator, MutableActionsArePassthrough) {
  22. std::vector<int> v{1, 2, 3, 4, 5};
  23. *end_aware_iterator(v.begin(), v.end()) = -1;
  24. EXPECT_EQ(v[0], -1);
  25. }
  26. TEST(EndAwareIterator, CanTellYouThatItsReachedEnd) {
  27. std::vector<int> v{1, 2, 3, 4, 5};
  28. end_aware_iterator it{v.end() - 1, v.end()};
  29. EXPECT_FALSE(it.at_end());
  30. ++it;
  31. EXPECT_EQ(it, end_aware_iterator(v.end(), v.end()));
  32. EXPECT_TRUE(it.at_end());
  33. }
  34. TEST(EndAwareIterator, EmptyIteratorIsEnd) {
  35. EXPECT_TRUE(end_aware_iterator<std::vector<int>::iterator>().at_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, CanIterateWithSentinel) {
  52. std::vector<int> v{1, 2, 3, 4, 5};
  53. size_t count{0};
  54. for (end_aware_iterator it(v); it != iterator::sentinel; ++it) {
  55. ++count;
  56. }
  57. EXPECT_EQ(count, 5);
  58. }