
// 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 "peridot/bin/agents/clipboard/clipboard_impl.h"

#include <string>

#include "peridot/lib/testing/test_with_ledger.h"
#include "trace/internal/event_common.h"

namespace modular {

class ClipboardImplTest : public testing::TestWithLedger {
 public:
  ClipboardImplTest() = default;

  void SetUp() override {
    TestWithLedger::SetUp();

    clipboard_ = std::make_unique<ClipboardImpl>(ledger_client());
  }

  void TearDown() override {
    clipboard_.reset();

    TestWithLedger::TearDown();
  }

 protected:
  void Push(const std::string& text) { clipboard_->Push(text); }

  void Peek(fuchsia::modular::Clipboard::PeekCallback callback) {
    clipboard_->Peek(std::move(callback));
  }

  std::unique_ptr<ClipboardImpl> clipboard_;
};

namespace {

TEST_F(ClipboardImplTest, FirstPeek) {
  bool callback_called = false;
  Peek([&callback_called](const fidl::StringPtr& text) {
    EXPECT_EQ("", text);
    callback_called = true;
  });

  RunLoopWithTimeoutOrUntil([&callback_called] { return callback_called; });
}

TEST_F(ClipboardImplTest, PushAndPeek) {
  bool callback_called = false;
  std::string expected_value = "a test string";
  Push(expected_value);
  Peek([&callback_called, expected_value](const fidl::StringPtr& text) {
    EXPECT_EQ(expected_value, text);
    callback_called = true;
  });

  RunLoopWithTimeoutOrUntil([&callback_called] { return callback_called; });
}

TEST_F(ClipboardImplTest, PushAndPeekTwice) {
  int callback_called = 0;
  std::string expected_value = "a test string";
  Push(expected_value);
  Peek([&callback_called, expected_value](const fidl::StringPtr& text) {
    EXPECT_EQ(expected_value, text);
    callback_called++;
  });
  Peek([&callback_called, expected_value](const fidl::StringPtr& text) {
    EXPECT_EQ(expected_value, text);
    callback_called++;
  });

  RunLoopWithTimeoutOrUntil(
      [&callback_called] { return callback_called == 2; });
}

}  // namespace
}  // namespace modular
