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