diff --git a/src/rpp/rpp/observables.hpp b/src/rpp/rpp/observables.hpp index 301821257..279cb5d45 100644 --- a/src/rpp/rpp/observables.hpp +++ b/src/rpp/rpp/observables.hpp @@ -23,4 +23,5 @@ #include #include #include +#include #include diff --git a/src/rpp/rpp/observables/observable.hpp b/src/rpp/rpp/observables/observable.hpp index 42b0d9d78..20b373fc1 100644 --- a/src/rpp/rpp/observables/observable.hpp +++ b/src/rpp/rpp/observables/observable.hpp @@ -37,7 +37,8 @@ namespace rpp class observable { public: - using value_type = Type; + using value_type = Type; + using strategy_type = Strategy; using expected_disposable_strategy = rpp::details::observables::deduce_disposable_strategy_t; diff --git a/src/tests/rpp/test_observables.cpp b/src/tests/rpp/test_observables.cpp index 6cf1b8bb2..349747ecb 100644 --- a/src/tests/rpp/test_observables.cpp +++ b/src/tests/rpp/test_observables.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include "rpp/disposables/fwd.hpp" #include "rpp/operators/fwd.hpp" @@ -241,3 +242,23 @@ TEST_CASE("create observable works properly as observable") CHECK(pipe_operator_observer.get_on_completed_count() == pipe_function_observer.get_on_completed_count()); } } + +TEMPLATE_TEST_CASE( + "observable has type traits defined", + "", + rpp::empty_observable, + rpp::dynamic_observable, + rpp::blocking_observable>, + rpp::connectable_observable, rpp::subjects::replay_subject>, + rpp::grouped_observable>) +{ + SECTION("value_type defined") + { + CONSTEVAL_CHECK(requires { typename TestType::value_type; }); + CONSTEVAL_CHECK(std::is_same_v); + } + SECTION("strategy_type defined") + { + CONSTEVAL_CHECK(requires { typename TestType::strategy_type; }); + } +}