// 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 #include #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(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 { 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)