// Copyright 2015 The Chromium 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 "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/application/application_test_base.h"
#include "mojo/public/cpp/bindings/callback.h"
#include "mojo/public/cpp/environment/logging.h"
#include "mojo/public/cpp/system/macros.h"
#include "mojo/services/nfc/interfaces/nfc.mojom.h"

namespace mojo {
namespace {

// Tests the NFC mojo service on android.
class NfcApplicationTest : public test::ApplicationTestBase {
 public:
  NfcApplicationTest() : ApplicationTestBase() {}
  ~NfcApplicationTest() override {}

  void TransmitOnNextConnectionResult(bool success) {}

 protected:
  // ApplicationTestBase:
  void SetUp() override {
    ApplicationTestBase::SetUp();
    application_impl()->ConnectToService("mojo:nfc", &nfc_);
  }

  nfc::NfcPtr nfc_;
  nfc::NfcTransmissionPtr nfc_transmission_;

 private:
  MOJO_DISALLOW_COPY_AND_ASSIGN(NfcApplicationTest);
};

TEST_F(NfcApplicationTest, TransmitAndCancelNfc) {
  nfc::NfcDataPtr nfc_data = nfc::NfcData::New();
  nfc_->TransmitOnNextConnection(
      nfc_data.Pass(), GetProxy(&nfc_transmission_),
      base::Bind(&NfcApplicationTest::TransmitOnNextConnectionResult,
                 base::Unretained(this)));
  nfc_transmission_->Cancel();
}

TEST_F(NfcApplicationTest, Register) {
  nfc_->Register();
}

}  // namespace
}  // namespace mojo
