diff --git a/src/tests/rpp/test_observers.cpp b/src/tests/rpp/test_observers.cpp index e632d58b4..253686c50 100644 --- a/src/tests/rpp/test_observers.cpp +++ b/src/tests/rpp/test_observers.cpp @@ -12,6 +12,7 @@ #include #include "rpp/disposables/fwd.hpp" +#include "rpp_trompeloil.hpp" #include #include @@ -293,3 +294,25 @@ TEST_CASE("set_upstream disposing when empty base disposable") SUBCASE("dynamic observer") test_observer(std::move(original_observer).as_dynamic()); } + +TEST_CASE("on_error if exception during on_next") +{ + auto observer = mock_observer{}; + + trompeloeil::sequence s; + SUBCASE("as rvalue") + { + REQUIRE_CALL(*observer, on_next_rvalue(1)).SIDE_EFFECT({ throw std::runtime_error{""}; }).IN_SEQUENCE(s); + REQUIRE_CALL(*observer, on_error(trompeloeil::_)).IN_SEQUENCE(s); + + rpp::observer>{observer}.on_next(1); + } + SUBCASE("as lvalue") + { + REQUIRE_CALL(*observer, on_next_lvalue(1)).SIDE_EFFECT({ throw std::runtime_error{""}; }).IN_SEQUENCE(s); + REQUIRE_CALL(*observer, on_error(trompeloeil::_)).IN_SEQUENCE(s); + + int v{1}; + rpp::observer>{observer}.on_next(v); + } +} diff --git a/src/tests/utils/rpp_trompeloil.hpp b/src/tests/utils/rpp_trompeloil.hpp index 910e277be..578e21fa4 100644 --- a/src/tests/utils/rpp_trompeloil.hpp +++ b/src/tests/utils/rpp_trompeloil.hpp @@ -28,12 +28,12 @@ class mock_observer impl_t& operator*() const noexcept { return *m_impl; } - void on_next(const T& v) const noexcept + void on_next(const T& v) const { m_impl->on_next_lvalue(v); } - void on_next(T&& v) const noexcept + void on_next(T&& v) const { m_impl->on_next_rvalue(std::move(v)); }