// // stream_td.hpp // stream // // Created by Sam Jaffe on 1/28/17. // #include "xcode_gtest_helper.h" #include #include #include #include "stream/streams.hpp" using ::testing::ElementsAre; using ::testing::ElementsAreArray; using ::testing::Eq; namespace views = stream::views; namespace ranges = stream::ranges; TEST(StreamTest, CanBuildFromSingleElement) { int value = 11; auto even = [](int i) { return i % 2 == 0; }; auto s = views::single(value) | views::filter(even); EXPECT_THAT(ranges::size(s), 0); } TEST(StreamTest, CanBuildFromIterators) { std::vector input{1, 2, 3, 4, 5}; std::vector expected{5, 7}; auto fmap = [](int i) { return 2 * i + 1; }; auto out = ranges::subrange(input.begin() + 1, input.begin() + 3) | views::transform(fmap) | ranges::to_vector(); EXPECT_THAT(out, Eq(expected)); } TEST(StreamTest, CanDereferenceElements) { int val = 5; std::vector input{&val}; auto data = input | views::deref() | ranges::to_vector(); EXPECT_THAT(data.front(), Eq(val)); } TEST(StreamTest, CanForEachConsume) { int hits = 0; std::vector input{1, 2, 3, 4, 5}; ranges::for_each(views::all(input), [&hits](int) { ++hits; }); EXPECT_THAT(hits, Eq(5)); } // // TEST(StreamTest, CastStreamToParentType) { // struct base { // char cat[4] = "cat"; // }; // struct test : base { // test(int v) : val(v) {} // int val; // }; // std::vector input{{1}, {3}, {2}}; // // auto addressof_void = [](auto const & p) { return (void *)&p; }; // // auto strm = stream::of(input).cast(); // auto first = stream::of(input).map(addressof_void).collect(); // auto second = strm.map(addressof_void).collect(); // // EXPECT_THAT(first, second); //}