// // transform_test.cxx // stream-test // // Created by Sam Jaffe on 4/5/23. // #include "stream/view/transform.h" #include "stream_helpers.h" #include "stream_matchers.h" // Workaround for OSX and pointer-to-member-functions template class std::basic_string; TEST(TransformView, NotRequiredToProvideSizeOrEmpty) { Range, Sentinel> input{0, 1, 2, 3, 4}; auto range = input | views::transform([](int i) { return i; }); static_assert(!stream::detail::has_size_v); static_assert(!stream::detail::has_empty_v); } TEST(TransformView, PropagatesSize) { Range, Sentinel, Sized> input{0, 1, 2, 3, 4}; auto range = input | views::transform([](int i) { return i; }); static_assert(stream::detail::has_size_v); EXPECT_THAT(range.size(), input.size()); } TEST(TransformView, PropagatesEmpty) { Range, Sentinel, Sized> input{0, 1, 2, 3, 4}; auto range = input | views::transform([](int i) { return i; }); static_assert(stream::detail::has_empty_v); EXPECT_THAT(range.empty(), input.empty()); } TEST(TransformView, ReturnsNewElements) { std::vector const input{1, 2, 3, 4, 5}; EXPECT_THAT(input | views::transform([](int i) { return 2 * i + 1; }), RangesEq(std::vector{3, 5, 7, 9, 11})); } TEST(TransformView, CanReturnReference) { std::vector const input{1, 2, 3, 4, 5}; auto range = input | views::transform([](auto & i) -> auto & { return i; }); EXPECT_THAT(&*range.begin(), &*input.begin()); } TEST(TransformView, CanUseMemberPtr) { struct test { int val; }; std::vector input{{1}, {3}, {2}}; EXPECT_THAT(input | views::transform(&test::val), RangesEq(std::vector{1, 3, 2})); } TEST(TransformView, CanUseMemberFn) { std::vector input{"hello", "goodbye"}; EXPECT_THAT(input | views::transform(&std::string::size), RangesEq(std::vector{5, 7})); }