1#include "gtest/gtest.h"
8#include "exec/static_thread_pool.hpp"
29 return stdexec::forwarding_query(stdexec::get_start_scheduler);
38TEST(get_start_scheduler, sync_wait) {
41 auto sndr_read_env_start_sch = stdexec::read_env(stdexec::get_start_scheduler) | stdexec::let_value([&](
auto schd) {
42 static_assert(std::same_as<
decltype(schd), stdexec::run_loop::scheduler>);
46 stdexec::sync_wait(std::move(sndr_read_env_start_sch));
48 ASSERT_EQ(tid, std::this_thread::get_id());
56 auto sndr_read_env_delegation_sch = stdexec::read_env(stdexec::get_delegation_scheduler)
57 | stdexec::let_value([&](
auto schd) {
58 static_assert(std::same_as<
decltype(schd), stdexec::run_loop::scheduler>);
62 stdexec::sync_wait(std::move(sndr_read_env_delegation_sch));
64 ASSERT_EQ(tid, std::this_thread::get_id());
77TEST(get_start_scheduler, let_value) {
78 std::thread::id pool_tid, tid;
80 experimental::execution::static_thread_pool pool{1};
82 auto sndr = stdexec::schedule(pool.get_scheduler()) |
THEN_STORE_THREAD_ID(&pool_tid) | stdexec::let_value([&]() {
83 return stdexec::read_env(stdexec::get_start_scheduler) | stdexec::let_value([&](
auto schd) {
84 static_assert(std::same_as<
decltype(schd),
decltype(pool.get_scheduler())>);
89 stdexec::sync_wait(std::move(sndr));
91 ASSERT_EQ(tid, pool_tid);
92 ASSERT_NE(tid, std::this_thread::get_id());
99TEST(get_start_scheduler, continues_on) {
100 std::thread::id pool_tid, tid;
102 experimental::execution::static_thread_pool pool{1};
107 static_assert(std::same_as<
108 stdexec::__completion_scheduler_of_t<
109 stdexec::set_value_t,
111 stdexec::prop<stdexec::get_start_scheduler_t, stdexec::run_loop::scheduler>
113 decltype(pool.get_scheduler())
116 stdexec::sync_wait(std::move(sndr));
118 ASSERT_EQ(tid, pool_tid);
119 ASSERT_NE(tid, std::this_thread::get_id());
128TEST(get_start_scheduler, continues_on_error_completion) {
129 experimental::execution::static_thread_pool pool{1};
130 std::thread::id pool_tid, tid;
133 | stdexec::then([]() {
throw std::runtime_error{
"error"}; })
134 | stdexec::continues_on(stdexec::inline_scheduler{});
136 static_assert(std::same_as<
137 stdexec::__completion_scheduler_of_t<
138 stdexec::set_error_t,
140 stdexec::prop<stdexec::get_start_scheduler_t, stdexec::run_loop::scheduler>
142 decltype(pool.get_scheduler())
145 auto sndr_with_upon_error = std::move(sndr)
148 static_assert(stdexec::__never_sends<
149 stdexec::set_error_t,
150 decltype(sndr_with_upon_error),
151 stdexec::prop<stdexec::get_start_scheduler_t, stdexec::run_loop::scheduler>
154 static_assert(std::same_as<
155 stdexec::__completion_scheduler_of_t<
156 stdexec::set_value_t,
157 decltype(sndr_with_upon_error),
158 stdexec::prop<stdexec::get_start_scheduler_t, stdexec::run_loop::scheduler>
160 decltype(pool.get_scheduler())
163 stdexec::sync_wait(std::move(sndr_with_upon_error));
165 ASSERT_EQ(tid, pool_tid);
166 ASSERT_NE(tid, std::this_thread::get_id());
#define KOKKOS_EXECUTION_STDEXEC_PRAGMA_DIAGNOSTIC_IGNORED
Basic list of ignored diagnostics when including anything from stdexec.
consteval bool test_is_forwarding_query()
#define THEN_STORE_THREAD_ID(__id__)
Add a stdexec::then calling Tests::Utils::Functors::StoreThreadID. // NOLINTNEXTLINE(cppcoreguideline...
#define UPON_ERROR_STORE_THREAD_ID(__id__)
Add a stdexec::upon_error calling Tests::Utils::Functors::StoreThreadID. // NOLINTNEXTLINE(cppcoregui...