1
0
Fork 0
mirror of https://gitlab.com/niansa/libcrosscoro.git synced 2025-03-06 20:53:32 +01:00
libcrosscoro/test/test_when_all.cpp
Josh Baldwin c548433dd9
Correctly implement sync_wait and when_all_awaitable (#8)
See issue for more details, in general attempting to
implement a coro::thread_pool exposed that the coro::sync_wait
and coro::when_all only worked if the coroutines executed on
that same thread.  They should now possibly have the ability
to execute on another thread, to be determined in a later issue.

Fixes #7
2020-10-25 20:54:19 -06:00

86 lines
2.3 KiB
C++

#include "catch.hpp"
#include <coro/coro.hpp>
TEST_CASE("when_all_awaitable single task with tuple container")
{
auto make_task = [](uint64_t amount) -> coro::task<uint64_t> {
co_return amount;
};
auto output_tasks = coro::sync_wait(coro::when_all_awaitable(make_task(100)));
REQUIRE(std::tuple_size<decltype(output_tasks)>() == 1);
uint64_t counter{0};
std::apply(
[&counter](auto&&... tasks) -> void {
((counter += tasks.return_value()), ...);
},
output_tasks);
REQUIRE(counter == 100);
}
TEST_CASE("when_all_awaitable multiple tasks with tuple container")
{
auto make_task = [](uint64_t amount) -> coro::task<uint64_t> {
co_return amount;
};
auto output_tasks = coro::sync_wait(coro::when_all_awaitable(make_task(100), make_task(50), make_task(20)));
REQUIRE(std::tuple_size<decltype(output_tasks)>() == 3);
uint64_t counter{0};
std::apply(
[&counter](auto&&... tasks) -> void {
((counter += tasks.return_value()), ...);
},
output_tasks);
REQUIRE(counter == 170);
}
TEST_CASE("when_all_awaitable single task with vector container")
{
auto make_task = [](uint64_t amount) -> coro::task<uint64_t> {
co_return amount;
};
std::vector<coro::task<uint64_t>> input_tasks;
input_tasks.emplace_back(make_task(100));
auto output_tasks = coro::sync_wait(coro::when_all_awaitable(std::move(input_tasks)));
REQUIRE(output_tasks.size() == 1);
uint64_t counter{0};
for(const auto& task : output_tasks)
{
counter += task.return_value();
}
REQUIRE(counter == 100);
}
TEST_CASE("when_all_ready multple task withs vector container")
{
auto make_task = [](uint64_t amount) -> coro::task<uint64_t> {
co_return amount;
};
std::vector<coro::task<uint64_t>> input_tasks;
input_tasks.emplace_back(make_task(100));
input_tasks.emplace_back(make_task(200));
input_tasks.emplace_back(make_task(550));
input_tasks.emplace_back(make_task(1000));
auto output_tasks = coro::sync_wait(coro::when_all_awaitable(std::move(input_tasks)));
REQUIRE(output_tasks.size() == 4);
uint64_t counter{0};
for(const auto& task : output_tasks)
{
counter += task.return_value();
}
REQUIRE(counter == 1850);
}