diff options
Diffstat (limited to 'nihil.core/monad.test.cc')
| -rw-r--r-- | nihil.core/monad.test.cc | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/nihil.core/monad.test.cc b/nihil.core/monad.test.cc new file mode 100644 index 0000000..e5003ac --- /dev/null +++ b/nihil.core/monad.test.cc @@ -0,0 +1,65 @@ +// This source code is released into the public domain. + +#include <catch2/catch_test_macros.hpp> + +import nihil.std; +import nihil.core; + +namespace { +TEST_CASE("monad: co_await std::optional<> with value", "[nihil]") +{ + auto get_value = [] -> std::optional<int> { + return 42; + }; + + auto try_get_value = [&get_value] -> std::optional<int> { + co_return co_await get_value(); + }; + + auto o = try_get_value(); + REQUIRE(o == 42); +} + +TEST_CASE("monad: co_await std::optional<> without value", "[nihil]") +{ + auto get_value = [] -> std::optional<int> { + return {}; + }; + + auto try_get_value = [&get_value] -> std::optional<int> { + co_return co_await get_value(); + }; + + auto o = try_get_value(); + REQUIRE(!o.has_value()); +} + +TEST_CASE("monad: co_await std::expected<> with value", "[nihil]") +{ + auto get_value = [] -> std::expected<int, std::string> { + return 42; + }; + + auto try_get_value = [&get_value] -> std::expected<int, std::string> { + co_return co_await get_value(); + }; + + auto o = try_get_value(); + REQUIRE(o == 42); +} + +TEST_CASE("monad: co_await std::expected<> with error", "[nihil]") +{ + auto get_value = [] -> std::expected<int, std::string> { + return std::unexpected("error"); + }; + + auto try_get_value = [&get_value] -> std::expected<int, std::string> { + co_return co_await get_value(); + }; + + auto o = try_get_value(); + REQUIRE(!o); + REQUIRE(o.error() == "error"); +} +} // anonymous namespace |
