// 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/run_loop.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/application/application_test_base.h"
#include "mojo/services/contacts/public/interfaces/contacts.mojom.h"

namespace contacts {

class ContactAppTest : public mojo::test::ApplicationTestBase {
 public:
  ContactAppTest() : ApplicationTestBase() {}
  ~ContactAppTest() override {}

  void SetUp() override {
    mojo::test::ApplicationTestBase::SetUp();
    application_impl()->ConnectToService("mojo:contacts", &contacts_service_);
  }

 protected:
  contacts::ContactsServicePtr contacts_service_;

  DISALLOW_COPY_AND_ASSIGN(ContactAppTest);
};

TEST_F(ContactAppTest, Count) {
  uint64_t count;
  contacts_service_->GetCount(mojo::String(), [&count](uint64_t c) {
    count = c;
    base::MessageLoop::current()->QuitWhenIdle();
  });
  { base::RunLoop().Run(); }
}

TEST_F(ContactAppTest, Get) {
  mojo::Array<ContactPtr> contacts;
  contacts_service_->Get(mojo::String(), 0, 1,
                         [&contacts](mojo::Array<ContactPtr> c) {
                           contacts = c.Pass();
                           base::MessageLoop::current()->QuitWhenIdle();
                         });
  { base::RunLoop().Run(); }
  EXPECT_FALSE(contacts.is_null());
}

TEST_F(ContactAppTest, GetWithFilter) {
  mojo::Array<ContactPtr> contacts;
  contacts_service_->Get("zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", 0, 1,
                         [&contacts](mojo::Array<ContactPtr> c) {
                           contacts = c.Pass();
                           base::MessageLoop::current()->QuitWhenIdle();
                         });
  { base::RunLoop().Run(); }
  EXPECT_FALSE(contacts.is_null());
  EXPECT_EQ(0u, contacts.size());
}

TEST_F(ContactAppTest, GetEmails) {
  mojo::Array<mojo::String> emails;

  contacts_service_->GetEmails(0, [&emails](mojo::Array<mojo::String> m) {
    emails = m.Pass();
    base::MessageLoop::current()->QuitWhenIdle();
  });
  { base::RunLoop().Run(); }
  EXPECT_FALSE(emails.is_null());
  EXPECT_EQ(0u, emails.size());
}

TEST_F(ContactAppTest, GetPhoto) {
  mojo::String url;

  contacts_service_->GetPhoto(0, false, [&url](const mojo::String& u) {
    url = u;
    base::MessageLoop::current()->QuitWhenIdle();
  });
  { base::RunLoop().Run(); };
  EXPECT_TRUE(url.is_null());

  contacts_service_->GetPhoto(0, true, [&url](const mojo::String& u) {
    url = u;
    base::MessageLoop::current()->QuitWhenIdle();
  });
  { base::RunLoop().Run(); };
  EXPECT_TRUE(url.is_null());
}

}  // namespace contacts
