transform_test.cxx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. //
  2. // transform_test.cxx
  3. // stream-test
  4. //
  5. // Created by Sam Jaffe on 4/5/23.
  6. //
  7. #include "stream/view/transform.h"
  8. #include "stream_helpers.h"
  9. #include "stream_matchers.h"
  10. // Workaround for OSX and pointer-to-member-functions
  11. template class std::basic_string<char>;
  12. TEST(TransformView, NotRequiredToProvideSizeOrEmpty) {
  13. Range<std::vector<int>, Sentinel> input{0, 1, 2, 3, 4};
  14. auto range = input | views::transform([](int i) { return i; });
  15. static_assert(!stream::detail::has_size_v<decltype(range)>);
  16. static_assert(!stream::detail::has_empty_v<decltype(range)>);
  17. }
  18. TEST(TransformView, PropagatesSize) {
  19. Range<std::vector<int>, Sentinel, Sized> input{0, 1, 2, 3, 4};
  20. auto range = input | views::transform([](int i) { return i; });
  21. static_assert(stream::detail::has_size_v<decltype(range)>);
  22. EXPECT_THAT(range.size(), input.size());
  23. }
  24. TEST(TransformView, PropagatesEmpty) {
  25. Range<std::vector<int>, Sentinel, Sized> input{0, 1, 2, 3, 4};
  26. auto range = input | views::transform([](int i) { return i; });
  27. static_assert(stream::detail::has_empty_v<decltype(range)>);
  28. EXPECT_THAT(range.empty(), input.empty());
  29. }
  30. TEST(TransformView, ReturnsNewElements) {
  31. std::vector<int> const input{1, 2, 3, 4, 5};
  32. EXPECT_THAT(input | views::transform([](int i) { return 2 * i + 1; }),
  33. RangesEq(std::vector{3, 5, 7, 9, 11}));
  34. }
  35. TEST(TransformView, CanReturnReference) {
  36. std::vector<int> const input{1, 2, 3, 4, 5};
  37. auto range = input | views::transform([](auto & i) -> auto & { return i; });
  38. EXPECT_THAT(&*range.begin(), &*input.begin());
  39. }
  40. TEST(TransformView, CanUseMemberPtr) {
  41. struct test {
  42. int val;
  43. };
  44. std::vector<test> input{{1}, {3}, {2}};
  45. EXPECT_THAT(input | views::transform(&test::val),
  46. RangesEq(std::vector{1, 3, 2}));
  47. }
  48. TEST(TransformView, CanUseMemberFn) {
  49. std::vector<std::string> input{"hello", "goodbye"};
  50. EXPECT_THAT(input | views::transform(&std::string::size),
  51. RangesEq(std::vector{5, 7}));
  52. }