// // optional_stream.t.h // optional.stream // // Created by Sam Jaffe on 1/29/17. // #include #include #include "stream/optional_stream.hpp" using ::testing::Eq; MATCHER(IsNone, "") { return !arg.has_value(); } MATCHER(NotNone, "") { return arg.has_value(); } MATCHER_P(Optional, value, "") { return arg.has_value() && *arg == value; } TEST(OptionalStreamTest, processes_real) { auto strm = stream::optional::make_stream(5); auto plus2 = [](int i) { return i+2; }; std::optional out = strm.map(plus2); EXPECT_THAT(out, NotNone()); EXPECT_THAT(*out, Eq(7)); } TEST(OptionalStreamTest, NoOpWhenUsedOnNullOpts) { auto strm = stream::optional::make_stream(); auto fail = [](int i) { throw std::runtime_error{"nullopt"}; return i; }; std::optional out; EXPECT_NO_THROW(out = strm.map(fail)); EXPECT_THAT(out, IsNone()); } TEST(OptionalStreamTest, FlatmapFunctionCanProduceNullOpt) { auto strm = stream::optional::make_stream(5); auto discard_odd = [](int i) { return i%2==0? std::optional(i) : std::nullopt; }; std::optional out; EXPECT_NO_THROW(out = strm.flatmap(discard_odd)); EXPECT_THAT(out, IsNone()); } TEST(OptionalStreamTest, FlatmapFunctionCanProduceRealValues) { auto strm = stream::optional::make_stream(6); auto discard_odd = [](int i) { return i%2==0? std::optional(i) : std::nullopt; }; std::optional out; EXPECT_NO_THROW(out = strm.flatmap(discard_odd)); EXPECT_THAT(out, NotNone()); EXPECT_THAT(out, Optional(6)); }