// Copyright 2019 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/developer/debug/zxdb/common/completion_callback.h"

#include <gtest/gtest.h>

namespace zxdb {

TEST(CompletionCallback, NoParams) {
  // Lambda that records it was called and the error it was passed.
  bool called = false;
  Err out_err;
  auto set_out = [&out_err, &called](const Err& err) {
    called = true;
    out_err = err;
  };

  // Call with an error.
  CompletionCallback<> cb_with_err(set_out);
  CompletionCallback<> call_me(std::move(cb_with_err));  // Test move ctor.
  Err with_error("message");
  call_me(with_error);
  EXPECT_TRUE(called);
  EXPECT_EQ(with_error.msg(), out_err.msg());

  // Call with no error.
  called = false;
  CompletionCallback<> cb_no_err(set_out);
  call_me = std::move(cb_no_err);  // Test move operator.
  call_me();
  EXPECT_TRUE(called);
  EXPECT_FALSE(out_err.has_error());
}

TEST(CompletionCallback, SomeParams) {
  // Lambda that records it was called and the error it was passed.
  bool called = false;
  Err out_err;
  int out_val = 99;  // Nonzero to catch default assignment to 0 below.
  auto set_out = [&out_err, &called, &out_val](const Err& err, int val) {
    called = true;
    out_err = err;
    out_val = val;
  };

  // Call with an error.
  CompletionCallback<int> cb_with_err(set_out);
  CompletionCallback<int> call_me(std::move(cb_with_err));  // Test move ctor.
  Err with_error("message");
  call_me(with_error);
  EXPECT_TRUE(called);
  EXPECT_EQ(with_error.msg(), out_err.msg());
  EXPECT_EQ(out_val, 0);

  // Call with no error.
  called = false;
  CompletionCallback<int> cb_no_err(set_out);
  call_me = std::move(cb_no_err);  // Test move operator.
  call_me(42);
  EXPECT_TRUE(called);
  EXPECT_FALSE(out_err.has_error());
  EXPECT_EQ(42, out_val);

  // Call specifying everything.
  called = false;
  CompletionCallback<int> everything = set_out;  // Assignment from lambda.
  Err with_error2("other message");
  everything(with_error2, 1000);
  EXPECT_TRUE(called);
  EXPECT_EQ(with_error2.msg(), out_err.msg());
  EXPECT_EQ(out_val, 1000);
}

}  // namespace zxdb
