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