Files
clice/tests/unit/Async/Task.cpp
2025-08-19 14:28:12 +08:00

130 lines
2.6 KiB
C++

#include "Test/Test.h"
#include "Async/Async.h"
#include "Async/ThreadPool.h"
namespace clice::testing {
namespace {
suite<"Async"> suite = [] {
test("Run") = [] {
async::run();
};
test("TaskSchedule") = [] {
auto task_gen = []() -> async::Task<int> {
co_return 1;
};
auto task = task_gen();
task.schedule();
async::run();
expect(that % task.done());
expect(that % task.result() == 1);
};
test("TaskDispose") = [] {
static int x = 1;
struct X {
~X() {
x += 1;
}
};
auto my_task = [&]() -> async::Task<> {
X x;
co_await async::sleep(300);
};
auto task = my_task();
task.schedule();
task.dispose();
async::run();
expect(that % x == 2);
auto main = [&]() -> async::Task<> {
auto task = my_task();
task.schedule();
co_await async::sleep(100);
task.cancel();
task.dispose();
};
async::run(main());
expect(that % x == 3);
};
test("TaskCancel") = [] {
int x = 1;
auto task1 = [&]() -> async::Task<> {
x = 2;
co_await async::sleep(300);
x = 3;
};
auto main = [&]() -> async::Task<> {
auto task = task1();
task.schedule();
co_await async::sleep(100);
task.cancel();
task.dispose();
};
async::run(main());
expect(that % x == 2);
};
test("TaskCancelRecursively") = [] {
int x = 0;
int y = 0;
int z = 0;
auto task1 = [&]() -> async::Task<> {
x = 1;
co_await async::sleep(300);
std::println("Task1 done");
x = 2;
};
auto task2 = [&]() -> async::Task<> {
auto task = task1();
y = 1;
co_await task;
y = 2;
};
auto task3 = [&]() -> async::Task<> {
auto task = task2();
z = 1;
co_await task;
z = 2;
};
auto main = [&]() -> async::Task<> {
auto task = task3();
task.schedule();
co_await async::sleep(100);
task.cancel();
task.dispose();
};
async::run(main());
/// All tasks should be cancelled recursively.
expect(that % x == 1);
expect(that % y == 1);
expect(that % z == 1);
};
};
} // namespace
} // namespace clice::testing