16#if defined(LIBCOPP_MACRO_ENABLE_STD_COROUTINE) && LIBCOPP_MACRO_ENABLE_STD_COROUTINE
18using generator_future_int_type = copp::generator_future<int>;
19using generator_future_void_type = copp::generator_future<void>;
21using generator_future_int_lightweight_type = copp::generator_lightweight_future<int>;
22using generator_future_void_lightweight_type = copp::generator_lightweight_future<void>;
24using generator_future_int_channel_type = copp::generator_channel_future<int, copp::promise_error_transform<int>>;
27std::list<generator_future_int_type::context_pointer_type> g_pending_int_contexts;
28std::list<generator_future_void_type::context_pointer_type> g_pending_void_contexts;
29std::list<generator_future_int_lightweight_type::context_pointer_type> g_pending_int_lightweight_contexts;
30std::list<generator_future_void_lightweight_type::context_pointer_type> g_pending_void_lightweight_contexts;
31std::list<generator_future_int_channel_type::context_pointer_type> g_pending_int_channel_contexts;
32size_t g_resume_generator_count = 0;
33size_t g_suspend_generator_count = 0;
35size_t resume_pending_contexts(std::list<int> values,
int max_count = 32767) {
37 while (max_count > 0 && (!g_pending_int_contexts.empty() || !g_pending_void_contexts.empty() ||
38 !g_pending_int_lightweight_contexts.empty() ||
39 !g_pending_void_lightweight_contexts.empty() || !g_pending_int_channel_contexts.empty())) {
41 if (!g_pending_int_contexts.empty()) {
42 auto ctx = *g_pending_int_contexts.begin();
43 g_pending_int_contexts.pop_front();
45 if (!values.empty()) {
46 int val = values.front();
54 }
else if (!g_pending_void_contexts.empty()) {
55 auto ctx = *g_pending_void_contexts.begin();
56 g_pending_void_contexts.pop_front();
60 }
else if (!g_pending_int_lightweight_contexts.empty()) {
61 auto ctx = *g_pending_int_lightweight_contexts.begin();
62 g_pending_int_lightweight_contexts.pop_front();
64 if (!values.empty()) {
65 int val = values.front();
73 }
else if (!g_pending_void_lightweight_contexts.empty()) {
74 auto ctx = *g_pending_void_lightweight_contexts.begin();
75 g_pending_void_lightweight_contexts.pop_front();
79 }
else if (!g_pending_int_channel_contexts.empty()) {
80 auto ctx = *g_pending_int_channel_contexts.begin();
81 g_pending_int_channel_contexts.pop_front();
83 if (!values.empty()) {
84 int val = values.front();
100static copp::callable_future<int> callable_func_await_int() {
101 generator_future_int_type gen_left_value{
102 [](generator_future_int_type::context_pointer_type ctx) {
103 ++g_suspend_generator_count;
104 g_pending_int_contexts.push_back(ctx);
106 [](
const generator_future_int_type::context_type &) { ++g_resume_generator_count; }};
111 CASE_EXPECT_TRUE(gen_left_value.get_status() == copp::promise_status::kRunning);
112 int x1 =
co_await gen_left_value;
115 CASE_EXPECT_TRUE(gen_left_value.get_status() == copp::promise_status::kDone);
121 int x2 =
co_await generator_future_int_type{
122 [](generator_future_int_type::context_pointer_type ctx) {
123 ++g_suspend_generator_count;
124 g_pending_int_contexts.push_back(ctx);
126 [](
const generator_future_int_type::context_type &) { ++g_resume_generator_count; }};
128 generator_future_void_type gen_left_void{
129 [](generator_future_void_type::context_pointer_type ctx) {
130 ++g_suspend_generator_count;
131 g_pending_void_contexts.push_back(ctx);
133 [](
const generator_future_void_type::context_type &) { ++g_resume_generator_count; }};
138 CASE_EXPECT_TRUE(gen_left_void.get_status() == copp::promise_status::kRunning);
139 co_await gen_left_void;
142 CASE_EXPECT_TRUE(gen_left_void.get_status() == copp::promise_status::kDone);
145 co_await gen_left_void;
148 co_await generator_future_void_type{
149 [](generator_future_void_type::context_pointer_type ctx) {
150 ++g_suspend_generator_count;
151 g_pending_void_contexts.push_back(ctx);
153 [](
const generator_future_void_type::context_type &) { ++g_resume_generator_count; }};
158CASE_TEST(generator_promise, basic_int_generator) {
159 size_t old_resume_generator_count = g_resume_generator_count;
160 size_t old_suspend_generator_count = g_suspend_generator_count;
162 copp::callable_future<int>
f = callable_func_await_int();
164 CASE_EXPECT_NE(
static_cast<int>(copp::promise_status::kDone),
static_cast<int>(
f.get_status()));
167 resume_pending_contexts({13100, 13});
172 CASE_EXPECT_EQ(old_resume_generator_count + 4, g_resume_generator_count);
173 CASE_EXPECT_EQ(old_suspend_generator_count + 4, g_suspend_generator_count);
176static copp::callable_future<int> callable_func_await_int_lightweight() {
177 generator_future_int_lightweight_type gen_left_value{
178 [](generator_future_int_lightweight_type::context_pointer_type ctx) {
179 ++g_suspend_generator_count;
180 g_pending_int_lightweight_contexts.push_back(ctx);
182 [](
const generator_future_int_lightweight_type::context_type &) { ++g_resume_generator_count; }};
187 CASE_EXPECT_TRUE(gen_left_value.get_status() == copp::promise_status::kRunning);
188 int x1 =
co_await gen_left_value;
191 CASE_EXPECT_TRUE(gen_left_value.get_status() == copp::promise_status::kDone);
197 int x2 =
co_await generator_future_int_lightweight_type{
198 [](generator_future_int_lightweight_type::context_pointer_type ctx) {
199 ++g_suspend_generator_count;
200 g_pending_int_lightweight_contexts.push_back(ctx);
202 [](
const generator_future_int_lightweight_type::context_type &) { ++g_resume_generator_count; }};
204 generator_future_void_lightweight_type gen_left_void{
205 [](generator_future_void_lightweight_type::context_pointer_type ctx) {
206 ++g_suspend_generator_count;
207 g_pending_void_lightweight_contexts.push_back(ctx);
209 [](
const generator_future_void_lightweight_type::context_type &) { ++g_resume_generator_count; }};
214 CASE_EXPECT_TRUE(gen_left_void.get_status() == copp::promise_status::kRunning);
215 co_await gen_left_void;
218 CASE_EXPECT_TRUE(gen_left_void.get_status() == copp::promise_status::kDone);
221 co_await gen_left_void;
224 co_await generator_future_void_lightweight_type{
225 [](generator_future_void_lightweight_type::context_pointer_type ctx) {
226 ++g_suspend_generator_count;
227 g_pending_void_lightweight_contexts.push_back(ctx);
229 [](
const generator_future_void_lightweight_type::context_type &) { ++g_resume_generator_count; }};
234CASE_TEST(generator_promise, lightweight_int_generator) {
235 size_t old_resume_generator_count = g_resume_generator_count;
236 size_t old_suspend_generator_count = g_suspend_generator_count;
238 copp::callable_future<int>
f = callable_func_await_int_lightweight();
240 CASE_EXPECT_NE(
static_cast<int>(copp::promise_status::kDone),
static_cast<int>(
f.get_status()));
243 resume_pending_contexts({13107, 15});
248 CASE_EXPECT_EQ(old_resume_generator_count + 4, g_resume_generator_count);
249 CASE_EXPECT_EQ(old_suspend_generator_count + 4, g_suspend_generator_count);
252template <
class TVALUE,
class TERROR_TRANSFORM>
253static copp::generator_channel_receiver<TVALUE, TERROR_TRANSFORM> callable_func_await_int_channel_pick_reciever(
254 std::pair<copp::generator_channel_receiver<TVALUE, TERROR_TRANSFORM>,
255 copp::generator_channel_sender<TVALUE, TERROR_TRANSFORM>> &&input) {
256 g_pending_int_channel_contexts.emplace_back(std::move(input.second));
257 return std::move(input.first);
260static copp::callable_future<int> callable_func_await_int_channel() {
261 auto gen_left_value = callable_func_await_int_channel_pick_reciever(copp::make_channel<int>());
266 CASE_EXPECT_TRUE(gen_left_value.get_status() == copp::promise_status::kRunning);
267 int x1 =
co_await gen_left_value;
270 CASE_EXPECT_TRUE(gen_left_value.get_status() == copp::promise_status::kDone);
276 int x2 =
co_await callable_func_await_int_channel_pick_reciever(copp::make_channel<int>());
281CASE_TEST(generator_promise, channel_int_generator) {
282 copp::callable_future<int>
f = callable_func_await_int_channel();
284 CASE_EXPECT_NE(
static_cast<int>(copp::promise_status::kDone),
static_cast<int>(
f.get_status()));
287 resume_pending_contexts({13101, 15});
293static copp::callable_future<int> callable_func_await_int_killed() {
294 generator_future_int_type gen_left_value{[](generator_future_int_type::context_pointer_type ctx) {
295 ++g_suspend_generator_count;
296 g_pending_int_contexts.push_back(ctx);
298 [](
const generator_future_int_type::context_type &ctx) {
301 ++g_resume_generator_count;
307 CASE_EXPECT_TRUE(gen_left_value.get_status() == copp::promise_status::kRunning);
308 int x1 =
co_await gen_left_value;
311 CASE_EXPECT_TRUE(gen_left_value.get_status() == copp::promise_status::kRunning);
313 auto current_callable_status =
co_yield copp::callable_future<int>::yield_status();
317 co_await gen_left_value;
319 generator_future_void_type gen_left_void{[](generator_future_void_type::context_pointer_type ctx) {
320 ++g_suspend_generator_count;
321 g_pending_void_contexts.push_back(ctx);
323 [](
const generator_future_void_type::context_type &ctx) {
326 ++g_resume_generator_count;
332 CASE_EXPECT_TRUE(gen_left_void.get_status() == copp::promise_status::kRunning);
333 co_await gen_left_void;
336 CASE_EXPECT_TRUE(gen_left_void.get_status() == copp::promise_status::kRunning);
341static copp::callable_future<void> callable_func_await_void_killed() {
342 generator_future_void_type gen_left_void{[](generator_future_void_type::context_pointer_type ctx) {
343 ++g_suspend_generator_count;
344 g_pending_void_contexts.push_back(ctx);
346 [](
const generator_future_void_type::context_type &ctx) {
349 ++g_resume_generator_count;
355 CASE_EXPECT_TRUE(gen_left_void.get_status() == copp::promise_status::kRunning);
356 co_await gen_left_void;
359 CASE_EXPECT_TRUE(gen_left_void.get_status() == copp::promise_status::kRunning);
362 co_await gen_left_void;
364 generator_future_int_type gen_left_value{[](generator_future_int_type::context_pointer_type ctx) {
365 ++g_suspend_generator_count;
366 g_pending_int_contexts.push_back(ctx);
368 [](
const generator_future_int_type::context_type &ctx) {
371 ++g_resume_generator_count;
377 CASE_EXPECT_TRUE(gen_left_value.get_status() == copp::promise_status::kRunning);
378 co_await gen_left_value;
381 CASE_EXPECT_TRUE(gen_left_value.get_status() == copp::promise_status::kRunning);
383 auto current_callable_status =
co_yield copp::callable_future<int>::yield_status();
389CASE_TEST(generator_promise, caller_killed) {
391 size_t old_resume_generator_count = g_resume_generator_count;
392 size_t old_suspend_generator_count = g_suspend_generator_count;
394 copp::callable_future<int>
f = callable_func_await_int_killed();
397 f.kill(copp::promise_status::kKilled,
true);
400 CASE_EXPECT_EQ(old_resume_generator_count + 1, g_resume_generator_count);
401 CASE_EXPECT_EQ(old_suspend_generator_count + 1, g_suspend_generator_count);
405 size_t old_resume_generator_count = g_resume_generator_count;
406 size_t old_suspend_generator_count = g_suspend_generator_count;
408 copp::callable_future<void>
f = callable_func_await_void_killed();
411 f.kill(copp::promise_status::kKilled,
true);
414 CASE_EXPECT_EQ(old_resume_generator_count + 1, g_resume_generator_count);
415 CASE_EXPECT_EQ(old_suspend_generator_count + 1, g_suspend_generator_count);
418 resume_pending_contexts({});
421static copp::callable_future<int> callable_func_await_int_killed_by_destroy_generator(
422 std::unique_ptr<generator_future_int_type> &gen_left_value) {
423 gen_left_value.reset(
new generator_future_int_type(
424 [](generator_future_int_type::context_pointer_type) {
425 ++g_suspend_generator_count;
429 [](
const generator_future_int_type::context_type &ctx) {
431 CASE_EXPECT_EQ(*ctx.data(), -
static_cast<int>(copp::promise_status::kKilled));
432 ++g_resume_generator_count;
438 CASE_EXPECT_TRUE(gen_left_value->get_status() == copp::promise_status::kRunning);
439 int x1 =
co_await *gen_left_value;
442 CASE_EXPECT_EQ(x1, -
static_cast<int>(copp::promise_status::kKilled));
447CASE_TEST(generator_promise, caller_killed_by_destroy_generator) {
448 std::unique_ptr<generator_future_int_type> gen_left_value;
450 size_t old_resume_generator_count = g_resume_generator_count;
451 size_t old_suspend_generator_count = g_suspend_generator_count;
453 copp::callable_future<int>
f = callable_func_await_int_killed_by_destroy_generator(gen_left_value);
456 gen_left_value.reset();
459 CASE_EXPECT_EQ(old_resume_generator_count + 1, g_resume_generator_count);
460 CASE_EXPECT_EQ(old_suspend_generator_count + 1, g_suspend_generator_count);
463static copp::callable_future<int> callable_func_await_int_killed_by_destroy_generator_in_callback(
464 std::unique_ptr<generator_future_int_type> &gen_left_value) {
465 gen_left_value.reset(
new generator_future_int_type(
466 [&gen_left_value](generator_future_int_type::context_pointer_type) {
467 ++g_suspend_generator_count;
471 gen_left_value.reset();
473 [](
const generator_future_int_type::context_type &ctx) {
475 CASE_EXPECT_EQ(*ctx.data(), -
static_cast<int>(copp::promise_status::kKilled));
476 ++g_resume_generator_count;
482 CASE_EXPECT_TRUE(gen_left_value->get_status() == copp::promise_status::kRunning);
483 int x1 =
co_await *gen_left_value;
486 CASE_EXPECT_EQ(x1, -
static_cast<int>(copp::promise_status::kKilled));
491CASE_TEST(generator_promise, caller_killed_by_destroy_generator_in_callback) {
492 std::unique_ptr<generator_future_int_type> gen_left_value;
494 size_t old_resume_generator_count = g_resume_generator_count;
495 size_t old_suspend_generator_count = g_suspend_generator_count;
497 copp::callable_future<int>
f = callable_func_await_int_killed_by_destroy_generator_in_callback(gen_left_value);
502 CASE_EXPECT_EQ(old_resume_generator_count + 1, g_resume_generator_count);
503 CASE_EXPECT_EQ(old_suspend_generator_count + 1, g_suspend_generator_count);
506class test_context_transform_error_code_type {
510 test_context_transform_error_code_type() : code(0) {}
511 test_context_transform_error_code_type(
int c) : code(c) {}
512 test_context_transform_error_code_type(
const test_context_transform_error_code_type &) =
default;
513 test_context_transform_error_code_type &operator=(
const test_context_transform_error_code_type &) =
default;
514 test_context_transform_error_code_type(test_context_transform_error_code_type &&) =
default;
515 test_context_transform_error_code_type &operator=(test_context_transform_error_code_type &&) =
default;
516 ~test_context_transform_error_code_type() {}
519LIBCOPP_COPP_NAMESPACE_BEGIN
521struct promise_error_transform<test_context_transform_error_code_type> {
522 using type = test_context_transform_error_code_type;
523 type operator()(promise_status in)
const {
524 if (in == promise_status::kTimeout) {
525 return test_context_transform_error_code_type{-500};
527 return test_context_transform_error_code_type{
static_cast<int>(in)};
530LIBCOPP_COPP_NAMESPACE_END
533using test_context_transform_error_code_generator = copp::generator_future<test_context_transform_error_code_type>;
534std::list<test_context_transform_error_code_generator::context_pointer_type>
535 g_test_context_transform_error_code_generator_executor;
537static copp::callable_future<int> test_context_transform_error_code_generator_l2() {
538 auto result =
co_await test_context_transform_error_code_generator{
539 [](test_context_transform_error_code_generator::context_pointer_type ctx) {
540 g_test_context_transform_error_code_generator_executor.emplace_back(std::move(ctx));
542 co_return result.code;
545static copp::callable_future<void> test_context_transform_error_code_generator_l1() {
546 auto result =
co_await test_context_transform_error_code_generator_l2();
552CASE_TEST(generator_promise, transform_error_code) {
553 auto f2 = test_context_transform_error_code_generator_l1();
554 f2.kill(copp::promise_status::kTimeout,
true);
556 g_test_context_transform_error_code_generator_executor.clear();
559static copp::callable_future<int> callable_func_multiple_await_int(generator_future_int_type &shared_generator) {
560 auto result =
co_await shared_generator;
564CASE_TEST(generator_promise, miltiple_wait_int_generator) {
565 size_t old_resume_generator_count = g_resume_generator_count;
566 size_t old_suspend_generator_count = g_suspend_generator_count;
568 generator_future_int_type int_generator{
569 [](generator_future_int_type::context_pointer_type ctx) {
570 ++g_suspend_generator_count;
571 if (g_pending_int_contexts.end() ==
572 std::find(g_pending_int_contexts.begin(), g_pending_int_contexts.end(), ctx)) {
573 g_pending_int_contexts.push_back(ctx);
576 [](
const generator_future_int_type::context_type &) { ++g_resume_generator_count; }};
578 copp::callable_future<int> f1 = callable_func_multiple_await_int(int_generator);
579 copp::callable_future<int> f2 = callable_func_multiple_await_int(int_generator);
581 CASE_EXPECT_NE(
static_cast<int>(copp::promise_status::kDone),
static_cast<int>(f1.get_status()));
583 CASE_EXPECT_NE(
static_cast<int>(copp::promise_status::kDone),
static_cast<int>(f2.get_status()));
593 CASE_EXPECT_EQ(old_resume_generator_count + 2, g_resume_generator_count);
594 CASE_EXPECT_EQ(old_suspend_generator_count + 2, g_suspend_generator_count);
597static copp::callable_future<int> callable_func_resume_when_suspend() {
598 auto result =
co_await generator_future_int_type{
599 [](generator_future_int_type::context_pointer_type ctx) {
600 ++g_suspend_generator_count;
603 [](
const generator_future_int_type::context_type &) { ++g_resume_generator_count; }};
607CASE_TEST(generator_promise, resume_when_suspend) {
608 size_t old_resume_generator_count = g_resume_generator_count;
609 size_t old_suspend_generator_count = g_suspend_generator_count;
611 copp::callable_future<int> f1 = callable_func_resume_when_suspend();
613 CASE_EXPECT_EQ(
static_cast<int>(copp::promise_status::kDone),
static_cast<int>(f1.get_status()));
617 CASE_EXPECT_EQ(old_resume_generator_count + 1, g_resume_generator_count);
618 CASE_EXPECT_EQ(old_suspend_generator_count + 1, g_suspend_generator_count);
621static copp::callable_future<int> callable_func_some_generator_in_container(
size_t expect_ready_count,
622 copp::promise_status expect_status) {
623 size_t old_resume_generator_count = g_resume_generator_count;
624 size_t old_suspend_generator_count = g_suspend_generator_count;
626 size_t resume_ready_count = 0;
627 auto suspend_callback = [](generator_future_int_type::context_pointer_type ctx) {
628 ++g_suspend_generator_count;
629 g_pending_int_contexts.push_back(ctx);
631 auto resume_callback = [&resume_ready_count](
const generator_future_int_type::context_type &ctx) {
632 ++g_resume_generator_count;
633 if (ctx.is_ready()) {
634 ++resume_ready_count;
638 std::vector<generator_future_int_type> generators;
639 generators.push_back(generator_future_int_type(suspend_callback, resume_callback));
640 generators.push_back(generator_future_int_type(suspend_callback, resume_callback));
641 generators.push_back(generator_future_int_type(suspend_callback, resume_callback));
643 copp::some_ready<generator_future_int_type>::type readys;
644 auto some_result =
co_await copp::some(readys, 2, generators);
645 CASE_EXPECT_EQ(
static_cast<int>(expect_status),
static_cast<int>(some_result));
648 for (
auto &ready_generator : readys) {
649 result += *ready_generator->get_context()->data();
652 CASE_EXPECT_EQ(old_resume_generator_count + 3, g_resume_generator_count);
653 CASE_EXPECT_EQ(old_suspend_generator_count + 3, g_suspend_generator_count);
657 some_result =
co_await copp::some(readys, 2, generators);
658 CASE_EXPECT_EQ(
static_cast<int>(expect_status),
static_cast<int>(some_result));
661 if (expect_status > copp::promise_status::kDone) {
662 CASE_EXPECT_EQ(old_resume_generator_count + 6 - resume_ready_count, g_resume_generator_count);
663 CASE_EXPECT_EQ(old_suspend_generator_count + 6 - resume_ready_count, g_suspend_generator_count);
666 CASE_EXPECT_EQ(old_resume_generator_count + 3, g_resume_generator_count);
667 CASE_EXPECT_EQ(old_suspend_generator_count + 3, g_suspend_generator_count);
674CASE_TEST(generator_promise, finish_some_in_container) {
675 auto f = callable_func_some_generator_in_container(2, copp::promise_status::kDone);
680 resume_pending_contexts({471}, 1);
682 resume_pending_contexts({473}, 1);
687 resume_pending_contexts({});
690CASE_TEST(generator_promise, kill_some_in_container) {
691 auto f = callable_func_some_generator_in_container(0, copp::promise_status::kKilled);
701 resume_pending_contexts({});
704static copp::callable_future<int> callable_func_some_generator_in_initialize_list(
size_t expect_ready_count,
705 copp::promise_status expect_status) {
706 size_t old_resume_generator_count = g_resume_generator_count;
707 size_t old_suspend_generator_count = g_suspend_generator_count;
709 size_t resume_ready_count = 0;
710 auto suspend_callback = [](generator_future_int_type::context_pointer_type ctx) {
711 ++g_suspend_generator_count;
712 g_pending_int_contexts.push_back(ctx);
714 auto resume_callback = [&resume_ready_count](
const generator_future_int_type::context_type &ctx) {
715 ++g_resume_generator_count;
716 if (ctx.is_ready()) {
717 ++resume_ready_count;
721 generator_future_int_type gen1{suspend_callback, resume_callback};
722 generator_future_int_type gen2{suspend_callback, resume_callback};
723 generator_future_int_type gen3{suspend_callback, resume_callback};
725 copp::some_ready<generator_future_int_type>::type readys;
726 std::array<std::reference_wrapper<generator_future_int_type>, 3> pending = {gen1, gen2, gen3};
727 auto some_result =
co_await copp::some(readys, 2, copp::gsl::make_span(pending));
728 CASE_EXPECT_EQ(
static_cast<int>(expect_status),
static_cast<int>(some_result));
731 for (
auto &ready_generator : readys) {
732 result += *ready_generator->get_context()->data();
735 CASE_EXPECT_EQ(old_resume_generator_count + 3, g_resume_generator_count);
736 CASE_EXPECT_EQ(old_suspend_generator_count + 3, g_suspend_generator_count);
742CASE_TEST(generator_promise, finish_some_in_initialize_list) {
743 auto f = callable_func_some_generator_in_initialize_list(2, copp::promise_status::kDone);
748 resume_pending_contexts({471}, 1);
750 resume_pending_contexts({473}, 1);
755 resume_pending_contexts({});
758static copp::callable_future<int> callable_func_any_generator_in_container(
size_t expect_ready_count,
759 copp::promise_status expect_status) {
760 size_t old_resume_generator_count = g_resume_generator_count;
761 size_t old_suspend_generator_count = g_suspend_generator_count;
763 size_t resume_ready_count = 0;
764 auto suspend_callback = [](generator_future_int_type::context_pointer_type ctx) {
765 ++g_suspend_generator_count;
766 g_pending_int_contexts.push_back(ctx);
768 auto resume_callback = [&resume_ready_count](
const generator_future_int_type::context_type &ctx) {
769 ++g_resume_generator_count;
770 if (ctx.is_ready()) {
771 ++resume_ready_count;
775 std::vector<generator_future_int_type> generators;
776 generators.push_back(generator_future_int_type(suspend_callback, resume_callback));
777 generators.push_back(generator_future_int_type(suspend_callback, resume_callback));
778 generators.push_back(generator_future_int_type(suspend_callback, resume_callback));
780 copp::any_ready<generator_future_int_type>::type readys;
781 auto any_result =
co_await copp::any(readys, generators);
782 CASE_EXPECT_EQ(
static_cast<int>(expect_status),
static_cast<int>(any_result));
785 for (
auto &ready_generator : readys) {
786 result += *ready_generator->get_context()->data();
789 CASE_EXPECT_EQ(old_resume_generator_count + 3, g_resume_generator_count);
790 CASE_EXPECT_EQ(old_suspend_generator_count + 3, g_suspend_generator_count);
794 std::vector<copp::gsl::not_null<generator_future_int_type *>> generators_not_null_type;
795 for (
auto &generator : generators) {
796 generators_not_null_type.push_back(copp::gsl::make_not_null(&generator));
798 any_result =
co_await copp::any(readys, generators_not_null_type);
799 CASE_EXPECT_EQ(
static_cast<int>(expect_status),
static_cast<int>(any_result));
802 if (expect_status > copp::promise_status::kDone) {
803 CASE_EXPECT_EQ(old_resume_generator_count + 6 - resume_ready_count, g_resume_generator_count);
804 CASE_EXPECT_EQ(old_suspend_generator_count + 6 - resume_ready_count, g_suspend_generator_count);
807 CASE_EXPECT_EQ(old_resume_generator_count + 3, g_resume_generator_count);
808 CASE_EXPECT_EQ(old_suspend_generator_count + 3, g_suspend_generator_count);
815CASE_TEST(generator_promise, finish_any_in_container) {
816 auto f = callable_func_any_generator_in_container(1, copp::promise_status::kDone);
821 resume_pending_contexts({671}, 1);
826 resume_pending_contexts({});
829static copp::callable_future<int> callable_func_all_generator_in_container(
size_t expect_ready_count,
830 copp::promise_status expect_status) {
831 size_t old_resume_generator_count = g_resume_generator_count;
832 size_t old_suspend_generator_count = g_suspend_generator_count;
834 size_t resume_ready_count = 0;
835 auto suspend_callback = [](generator_future_int_type::context_pointer_type ctx) {
836 ++g_suspend_generator_count;
837 g_pending_int_contexts.push_back(ctx);
839 auto resume_callback = [&resume_ready_count](
const generator_future_int_type::context_type &ctx) {
840 ++g_resume_generator_count;
841 if (ctx.is_ready()) {
842 ++resume_ready_count;
846 std::vector<generator_future_int_type> generators;
847 generators.push_back(generator_future_int_type(suspend_callback, resume_callback));
848 generators.push_back(generator_future_int_type(suspend_callback, resume_callback));
849 generators.push_back(generator_future_int_type(suspend_callback, resume_callback));
851 copp::all_ready<generator_future_int_type>::type readys;
852 auto all_result =
co_await copp::all(readys, generators);
853 CASE_EXPECT_EQ(
static_cast<int>(expect_status),
static_cast<int>(all_result));
856 for (
auto &ready_generator : readys) {
857 result += *ready_generator->get_context()->data();
860 CASE_EXPECT_EQ(old_resume_generator_count + 3, g_resume_generator_count);
861 CASE_EXPECT_EQ(old_suspend_generator_count + 3, g_suspend_generator_count);
865 all_result =
co_await copp::all(readys, generators);
866 CASE_EXPECT_EQ(
static_cast<int>(expect_status),
static_cast<int>(all_result));
869 if (expect_status > copp::promise_status::kDone) {
870 CASE_EXPECT_EQ(old_resume_generator_count + 6 - resume_ready_count, g_resume_generator_count);
871 CASE_EXPECT_EQ(old_suspend_generator_count + 6 - resume_ready_count, g_suspend_generator_count);
874 CASE_EXPECT_EQ(old_resume_generator_count + 3, g_resume_generator_count);
875 CASE_EXPECT_EQ(old_suspend_generator_count + 3, g_suspend_generator_count);
882CASE_TEST(generator_promise, finish_all_in_container) {
883 auto f = callable_func_all_generator_in_container(3, copp::promise_status::kDone);
888 resume_pending_contexts({671}, 1);
891 resume_pending_contexts({791, 793}, 2);
896 resume_pending_contexts({});
#define CASE_EXPECT_FALSE(c)
#define CASE_EXPECT_EQ(l, r)
#define CASE_EXPECT_NE(l, r)
#define CASE_TEST(test_name, case_name)
#define CASE_EXPECT_TRUE(c)