// Copyright 2016 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 "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/application/connect.h"
#include "mojo/services/ui/views/interfaces/view_manager.mojom.h"
#include "mojo/services/ui/views/interfaces/views.mojom.h"
#include "services/ui/view_manager/tests/mock_view_associate.h"
#include "services/ui/view_manager/tests/view_manager_test_base.h"

namespace view_manager {
namespace test {

class MockViewListener : public mojo::ui::ViewListener {
 public:
  MockViewListener() {}
  ~MockViewListener() override {}

  void OnPropertiesChanged(
      uint32_t scene_version,
      mojo::ui::ViewPropertiesPtr properties,
      const OnPropertiesChangedCallback& callback) override {}
};

class ViewManagerTest : public ViewManagerTestBase {
 public:
  ViewManagerTest() {}
  ~ViewManagerTest() override {}

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

    // Connect to view manager
    mojo::ConnectToService(shell(), "mojo:view_manager_service",
                           mojo::GetProxy(&view_manager_));
  }

 protected:
  mojo::ui::ViewManagerPtr view_manager_;

 private:
  DISALLOW_COPY_AND_ASSIGN(ViewManagerTest);
};

TEST_F(ViewManagerTest, CreateAViewManagerAndView) {
  // Create and bind a mock view listener
  mojo::ui::ViewListenerPtr view_listener;
  MockViewListener mock_view_listener;
  mojo::Binding<mojo::ui::ViewListener> view_listener_binding(
      &mock_view_listener, mojo::GetProxy(&view_listener));

  // Create a view
  mojo::ui::ViewPtr view;
  mojo::ui::ViewOwnerPtr client_view_owner;
  view_manager_->CreateView(mojo::GetProxy(&view),
                            mojo::GetProxy(&client_view_owner),
                            view_listener.Pass(), "test_view");

  // Call View::GetToken. Check that you get the callback.
  int view_token_callback_invokecount = 0;
  auto view_token_callback = [&view_token_callback_invokecount](
      mojo::ui::ViewTokenPtr token) { view_token_callback_invokecount++; };

  EXPECT_EQ(0, view_token_callback_invokecount);
  view->GetToken(view_token_callback);

  KICK_MESSAGE_LOOP_WHILE(view_token_callback_invokecount != 1);

  EXPECT_EQ(1, view_token_callback_invokecount);
}

TEST_F(ViewManagerTest, ConnectAMockViewAssociate) {
  // Create and bind a MockViewAssociate
  mojo::InterfaceHandle<mojo::ui::ViewAssociate> associate;
  MockViewAssociate mock_view_associate;
  mojo::Binding<mojo::ui::ViewAssociate> view_associate_binding(
      &mock_view_associate, mojo::GetProxy(&associate));

  // Call ViewManager::RegisterViewAssociate. MockViewAssociate::Connect
  // should be called back
  EXPECT_EQ(0, mock_view_associate.connect_invokecount);
  mojo::ui::ViewAssociateOwnerPtr view_associate_owner;
  view_manager_->RegisterViewAssociate(associate.Pass(),
                                       mojo::GetProxy(&view_associate_owner),
                                       "test_view_associate");

  KICK_MESSAGE_LOOP_WHILE(mock_view_associate.connect_invokecount != 1);

  EXPECT_EQ(1, mock_view_associate.connect_invokecount);
}

TEST_F(ViewManagerTest, DisconnectAMockViewAssociate) {
  mojo::ui::ViewAssociateOwnerPtr view_associate_owner;
  int owner_connection_error_callback_invokecount = 0;

  {
    // Create and bind a MockViewAssociate
    mojo::InterfaceHandle<mojo::ui::ViewAssociate> associate;
    MockViewAssociate mock_view_associate;
    mojo::Binding<mojo::ui::ViewAssociate> view_associate_binding(
        &mock_view_associate, mojo::GetProxy(&associate));

    // Call ViewManager::RegisterViewAssociate. MockViewAssociate::Connect
    // should be called back
    EXPECT_EQ(0, mock_view_associate.connect_invokecount);

    view_manager_->RegisterViewAssociate(associate.Pass(),
                                         mojo::GetProxy(&view_associate_owner),
                                         "test_view_associate_xyz");

    // set a callback for errors
    view_associate_owner.set_connection_error_handler(
        // use lambda function as callback
        [&owner_connection_error_callback_invokecount]() {
          owner_connection_error_callback_invokecount++;
        });

    KICK_MESSAGE_LOOP_WHILE(mock_view_associate.connect_invokecount != 1);

    EXPECT_EQ(1, mock_view_associate.connect_invokecount);

    EXPECT_EQ(0, owner_connection_error_callback_invokecount);
  }

  // mock_view_associate is out of scope, should be destroyed
  // we expect to get a connection error from the owner
  KICK_MESSAGE_LOOP_WHILE(owner_connection_error_callback_invokecount != 1)

  EXPECT_EQ(1, owner_connection_error_callback_invokecount);
}

TEST_F(ViewManagerTest, DisconnectAViewAssociateOwner) {
  // Create and bind a MockViewAssociate
  mojo::InterfaceHandle<mojo::ui::ViewAssociate> associate;
  MockViewAssociate mock_view_associate;
  mojo::Binding<mojo::ui::ViewAssociate> view_associate_binding(
      &mock_view_associate, mojo::GetProxy(&associate));

  // set a callback for errors
  int connection_error_callback_invokecount = 0;
  view_associate_binding.set_connection_error_handler(
      // use lambda function as callback
      [&connection_error_callback_invokecount]() {
        connection_error_callback_invokecount++;
      });

  {
    mojo::ui::ViewAssociateOwnerPtr view_associate_owner;

    // Call ViewManager::RegisterViewAssociate. MockViewAssociate::Connect
    // should be called back
    EXPECT_EQ(0, mock_view_associate.connect_invokecount);

    view_manager_->RegisterViewAssociate(associate.Pass(),
                                         mojo::GetProxy(&view_associate_owner),
                                         "test_view_associate_xyz");

    KICK_MESSAGE_LOOP_WHILE(mock_view_associate.connect_invokecount != 1);

    EXPECT_EQ(1, mock_view_associate.connect_invokecount);

    EXPECT_EQ(0, connection_error_callback_invokecount);
  }

  // view_associate_owner is out of scope, should be destroyed
  // we expect to get a connection error from the view associate
  KICK_MESSAGE_LOOP_WHILE(connection_error_callback_invokecount != 1)

  EXPECT_EQ(1, connection_error_callback_invokecount);
}

}  // namespace test
}  // namespace view_manager
