| // Copyright 2017 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 "src/lib/callback/scoped_callback.h" | |
| #include <gtest/gtest.h> | |
| #include "src/lib/fxl/macros.h" | |
| namespace callback { | |
| namespace { | |
| class Witness { | |
| public: | |
| explicit Witness(bool* value) : value_(value) {} | |
| explicit operator bool() const { return *value_; } | |
| private: | |
| bool* value_; | |
| }; | |
| TEST(ScopedCallback, Witness) { | |
| bool witness_value = true; | |
| const Witness witness(&witness_value); | |
| bool called = false; | |
| auto call = [&called] { called = true; }; | |
| // Witness is true at creation, true at execution. | |
| { | |
| witness_value = true; | |
| called = false; | |
| auto callback = callback::MakeScoped(witness, call); | |
| witness_value = true; | |
| callback(); | |
| EXPECT_TRUE(called); | |
| } | |
| // Witness is true at creation, false at execution. | |
| { | |
| witness_value = true; | |
| called = false; | |
| auto callback = callback::MakeScoped(witness, call); | |
| witness_value = false; | |
| callback(); | |
| EXPECT_FALSE(called); | |
| } | |
| // Witness is false at creation, true at execution. | |
| { | |
| witness_value = false; | |
| called = false; | |
| auto callback = callback::MakeScoped(witness, call); | |
| witness_value = true; | |
| callback(); | |
| EXPECT_TRUE(called); | |
| } | |
| // Witness is false at creation, false at execution. | |
| { | |
| witness_value = false; | |
| called = false; | |
| auto callback = callback::MakeScoped(witness, call); | |
| witness_value = false; | |
| callback(); | |
| EXPECT_FALSE(called); | |
| } | |
| } | |
| } // namespace | |
| } // namespace callback |