blob: dd7d3f3213465288c63f62586486e43dd4b9b393 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <lib/fit/promise.h>
#include <unittest/unittest.h>
#include "unittest_utils.h"
namespace {
class fake_context : public fit::context {
public:
fit::executor* executor() const override {
ASSERT_CRITICAL(false);
}
fit::suspended_task suspend_task() override {
ASSERT_CRITICAL(false);
}
};
bool empty_task() {
BEGIN_TEST;
fake_context context;
{
fit::pending_task empty;
EXPECT_FALSE(empty);
EXPECT_FALSE(empty.take_promise());
}
{
fit::pending_task empty(fit::promise<>(nullptr));
EXPECT_FALSE(empty);
EXPECT_FALSE(empty.take_promise());
}
{
fit::pending_task empty(fit::promise<double, int>(nullptr));
EXPECT_FALSE(empty);
EXPECT_FALSE(empty.take_promise());
}
END_TEST;
}
bool non_empty_task() {
BEGIN_TEST;
fake_context context;
{
uint64_t run_count = 0;
fit::pending_task task(fit::make_promise([&]() -> fit::result<> {
if (++run_count == 3)
return fit::ok();
return fit::pending();
}));
EXPECT_TRUE(task);
EXPECT_FALSE(task(context));
EXPECT_EQ(1, run_count);
EXPECT_TRUE(task);
EXPECT_FALSE(task(context));
EXPECT_EQ(2, run_count);
EXPECT_TRUE(task);
EXPECT_TRUE(task(context));
EXPECT_EQ(3, run_count);
EXPECT_FALSE(task);
EXPECT_FALSE(task.take_promise());
}
{
uint64_t run_count = 0;
fit::pending_task task(fit::make_promise([&]() -> fit::result<int> {
if (++run_count == 2)
return fit::ok(0);
return fit::pending();
}));
EXPECT_TRUE(task);
fit::pending_task task_move(std::move(task));
EXPECT_TRUE(task_move);
EXPECT_FALSE(task);
fit::pending_task task_movemove;
task_movemove = std::move(task_move);
EXPECT_TRUE(task_movemove);
EXPECT_FALSE(task_move);
fit::promise<> promise = task_movemove.take_promise();
EXPECT_TRUE(promise);
EXPECT_EQ(fit::result_state::pending, promise(context).state());
EXPECT_EQ(1, run_count);
EXPECT_EQ(fit::result_state::ok, promise(context).state());
EXPECT_EQ(2, run_count);
EXPECT_FALSE(promise);
}
END_TEST;
}
} // namespace
BEGIN_TEST_CASE(pending_task_tests)
RUN_TEST(empty_task)
RUN_TEST(non_empty_task)
END_TEST_CASE(pending_task_tests)