transform_test.cxx 2.0 KB

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