common_test.cxx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //
  2. // common_test.cxx
  3. // stream-test
  4. //
  5. // Created by Sam Jaffe on 4/2/23.
  6. //
  7. #include "stream/view/common.h"
  8. #include <iterator/facade.h>
  9. #include <iterator/sentinel.h>
  10. #include "stream_test.h"
  11. using testing::StaticAssertTypeEq;
  12. struct SizedIterator : iterator::facade<SizedIterator> {
  13. private:
  14. // Default constructed SizedIterator should not be a vaguely valid state.
  15. size_t i_{~0ul};
  16. size_t n_{~0ul};
  17. public:
  18. SizedIterator() = default;
  19. SizedIterator(size_t i, size_t n) : i_(i), n_(n) {}
  20. size_t dereference() const { return i_; }
  21. void advance(std::ptrdiff_t off) { i_ += off; }
  22. // Bad detection requires us to provide this...
  23. // TODO: See if I can use one of these tests to why...
  24. bool equal_to(SizedIterator const & other) const { return other.i_ == i_; }
  25. std::ptrdiff_t distance_to(SizedIterator const & other) const {
  26. return other.i_ - i_;
  27. }
  28. bool at_end() const { return i_ >= n_; }
  29. };
  30. MAKE_ITERATOR_FACADE_TYPEDEFS(SizedIterator);
  31. struct SentinelRange {
  32. private:
  33. size_t size_;
  34. public:
  35. SentinelRange(size_t size = 0) : size_(size) {}
  36. SizedIterator begin() const { return {0, size_}; }
  37. auto end() const { return iterator::sentinel; }
  38. bool empty() const { return size_ == 0; }
  39. size_t size() const { return size_; }
  40. };
  41. TEST(CommonView, CoercesSentinelIntoCommon) {
  42. SentinelRange input(10);
  43. auto range = input | views::common();
  44. StaticAssertTypeEq<decltype(range.begin()), decltype(range.end())>();
  45. }
  46. TEST(CommonView, IteratesThroughSameValues) {
  47. SentinelRange input(10);
  48. auto range = input | views::common();
  49. EXPECT_THAT(range, RangesEq(input));
  50. }
  51. TEST(CommonView, PropagatesSize) {
  52. SentinelRange input(10);
  53. auto range = input | views::common();
  54. static_assert(stream::detail::has_size_v<decltype(range)>);
  55. EXPECT_THAT(range.size(), input.size());
  56. }
  57. TEST(CommonView, PropagatesEmpty) {
  58. SentinelRange input(10);
  59. auto range = input | views::common();
  60. static_assert(stream::detail::has_empty_v<decltype(range)>);
  61. EXPECT_THAT(range.empty(), input.empty());
  62. }
  63. TEST(CommonView, PassesNonSentinelTypes) {
  64. std::vector<size_t> input(10);
  65. auto range = input | views::common();
  66. StaticAssertTypeEq<decltype(input), decltype(range)>();
  67. }