optional_stream_test.cxx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //
  2. // optional_stream.t.h
  3. // optional.stream
  4. //
  5. // Created by Sam Jaffe on 1/29/17.
  6. //
  7. #include <gmock/gmock.h>
  8. #include <gtest/gtest.h>
  9. #include "stream/optional_stream.hpp"
  10. using ::testing::Eq;
  11. MATCHER(Absent, "") {
  12. return !arg.has_value();
  13. }
  14. MATCHER(Present, "") {
  15. return arg.has_value();
  16. }
  17. MATCHER_P(OptionalIs, value, "") {
  18. return arg.has_value() && *arg == value;
  19. }
  20. TEST(OptionalStreamTest, processes_real) {
  21. auto strm = stream::optional::make_stream(5);
  22. auto plus2 = [](int i) { return i+2; };
  23. std::optional<int> out = strm.map(plus2);
  24. EXPECT_THAT(out, Present());
  25. EXPECT_THAT(*out, Eq(7));
  26. }
  27. TEST(OptionalStreamTest, NoOpWhenUsedOnNullOpts) {
  28. auto strm = stream::optional::make_stream<int>();
  29. auto fail = [](int i) { throw std::runtime_error{"nullopt"}; return i; };
  30. std::optional<int> out;
  31. EXPECT_NO_THROW(out = strm.map(fail));
  32. EXPECT_THAT(out, Absent());
  33. }
  34. TEST(OptionalStreamTest, FlatmapFunctionCanProduceNullOpt) {
  35. auto strm = stream::optional::make_stream(5);
  36. auto discard_odd = [](int i) {
  37. return i%2==0? std::optional<int>(i) : std::nullopt;
  38. };
  39. std::optional<int> out;
  40. EXPECT_NO_THROW(out = strm.flatmap(discard_odd));
  41. EXPECT_THAT(out, Absent());
  42. }
  43. TEST(OptionalStreamTest, FlatmapFunctionCanProduceRealValues) {
  44. auto strm = stream::optional::make_stream(6);
  45. auto discard_odd = [](int i) {
  46. return i%2==0? std::optional<int>(i) : std::nullopt;
  47. };
  48. std::optional<int> out;
  49. EXPECT_NO_THROW(out = strm.flatmap(discard_odd));
  50. EXPECT_THAT(out, Present());
  51. EXPECT_THAT(out, OptionalIs(6));
  52. }