1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 12:05:00 +00:00
serenity/Tests/LibCore/TestLibCorePromise.cpp
Ali Mohammad Pur 9f4feb7315 LibCore: Move the Promise::await() result instead of returning a ref
Returning a reference resulted in Mail's use of Promise causing a crash.
Also, awaiting an already-awaited promise is an odd thing to do anyway,
so let's just make it release the resolved/rejected value instead of
returning a reference to it.

Co-Authored-By: Valtteri Koskivuori <vkoskiv@gmail.com>
2023-07-24 16:42:15 +03:30

59 lines
1.4 KiB
C++

/*
* Copyright (c) 2023, Ali Mohammad Pur <mpfard@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibCore/EventLoop.h>
#include <LibCore/Promise.h>
#include <LibTest/TestSuite.h>
TEST_CASE(promise_await_async_event)
{
Core::EventLoop loop;
auto promise = MUST(Core::Promise<int>::try_create());
loop.deferred_invoke([=] {
promise->resolve(42);
});
auto result = promise->await();
EXPECT(!result.is_error());
EXPECT_EQ(result.value(), 42);
}
TEST_CASE(promise_await_async_event_rejection)
{
Core::EventLoop loop;
auto promise = MUST(Core::Promise<int>::try_create());
loop.deferred_invoke([=] {
promise->reject(AK::Error::from_string_literal("lol no"));
});
auto result = promise->await();
EXPECT(result.is_error());
EXPECT_EQ(result.error().string_literal(), "lol no"sv);
}
TEST_CASE(promise_chain_handlers)
{
Core::EventLoop loop;
bool resolved = false;
bool rejected = false;
NonnullRefPtr<Core::Promise<int>> promise = MUST(Core::Promise<int>::try_create())
->when_resolved([&](int&) -> ErrorOr<void> { resolved = true; return {}; })
.when_rejected([&](AK::Error const&) { rejected = true; });
loop.deferred_invoke([=] {
promise->resolve(42);
});
(void)promise->await();
EXPECT(resolved);
EXPECT(!rejected);
}