| // 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) |