Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions tests/basic_context.test.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <coroutine>

#include <boost/ut.hpp>
#include <thread>

import async_context;
import test_utils;
Expand Down Expand Up @@ -32,6 +33,26 @@ boost::ut::suite<"basic_context"> basic_context = []() {
expect(that % stack_size == ctx->capacity());
};

"sync_wait --> future<int>"_test = []() {
// Setup
async::basic_context<1024> ctx;

auto future = [](async::context&) -> async::future<int> {
co_return 5;
}(ctx);

ctx->sync_wait([](async::sleep_duration p_sleep_duration) {
std::this_thread::sleep_for(p_sleep_duration);
});

// Verify
expect(that % 0 == ctx->memory_used());
expect(that % future.done());
expect(that % future.has_value());
expect(that % 5 == future.value());
expect(that % stack_size == ctx->capacity());
};

"co_await coroutine"_test = []() {
// Setup
async::basic_context<stack_size> ctx;
Expand Down Expand Up @@ -124,4 +145,48 @@ boost::ut::suite<"basic_context"> basic_context = []() {

expect(that % stack_size == ctx->capacity());
};

"co_await Xms + sync_wait"_test = []() {
// Setup
async::basic_context<stack_size> ctx;

static constexpr int return_value1 = 1413;
static constexpr int return_value2 = 4324;
static constexpr int expected_total = return_value1 + return_value2;

using namespace std::literals;
unsigned step = 0;
auto co2 = [](async::context&) -> async::future<int> {
co_await 100ms;
co_return return_value1;
};

auto co = [&step, &co2](async::context& p_ctx) -> async::future<int> {
step = 1; // skipped as the co2 will immediately start
co_await 44ms;
auto val = co_await co2(p_ctx);
co_await 50ms;
step = 2;
co_return val + return_value2;
};
std::vector<async::sleep_duration> sleep_cycles;

// Exercise
auto future = co(ctx);

ctx->sync_wait([&](async::sleep_duration p_sleep_time) {
sleep_cycles.push_back(p_sleep_time);
});

// Verify
expect(that % 0 == ctx->memory_used());
expect(that % future.done());
expect(that % future.has_value());
expect(that % 2 == step);
expect(that % expected_total == future.value());
expect(that % sleep_cycles ==
std::vector<async::sleep_duration>{ 44ms, 100ms, 50ms });

expect(that % stack_size == ctx->capacity());
};
};