Files
clice/tests/unit/Async/LockTests.cpp
2025-11-30 15:21:27 +08:00

81 lines
1.6 KiB
C++

#include "Test/Test.h"
#include "Async/Async.h"
namespace clice::testing {
namespace {
TEST_SUITE(Async) {
TEST_CASE(Lock) {
async::Lock lock;
int x = 0;
auto task1 = [&]() -> async::Task<> {
auto guard = co_await lock.try_lock();
co_await async::sleep(5);
CO_ASSERT_EQ(x, 0);
co_await async::sleep(10);
CO_ASSERT_EQ(x, 0);
co_await async::sleep(5);
x = 1;
};
auto task2 = [&]() -> async::Task<> {
auto guard = co_await lock.try_lock();
co_await async::sleep(5);
CO_ASSERT_EQ(x, 1);
co_await async::sleep(5);
CO_ASSERT_EQ(x, 1);
co_await async::sleep(10);
x = 2;
};
auto task3 = [&]() -> async::Task<> {
auto guard = co_await lock.try_lock();
co_await async::sleep(10);
CO_ASSERT_EQ(x, 2);
co_await async::sleep(5);
CO_ASSERT_EQ(x, 2);
co_await async::sleep(5);
};
async::run(task1(), task2(), task3());
}
TEST_CASE(LockCancel) {
async::Lock lock;
int x = 0;
int y = 0;
auto task = [&]() -> async::Task<> {
x += 1;
auto guard = co_await lock.try_lock();
co_await async::sleep(100);
y += 1;
};
auto task1 = task();
auto task2 = task();
auto task3 = task();
auto cancel = [&task2]() -> async::Task<> {
co_await async::sleep(10);
task2.cancel();
task2.dispose();
};
task1.schedule();
task2.schedule();
task3.schedule();
async::run(cancel());
ASSERT_EQ(x, 3);
ASSERT_EQ(y, 2);
}
}; // TEST_SUITE(Async)
} // namespace
} // namespace clice::testing