// Copyright 2014 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/run_loop.h"
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/application/application_test_base.h"
#include "mojo/public/cpp/application/service_provider_impl.h"
#include "mojo/public/cpp/system/macros.h"
#include "mojo/services/view_manager/public/cpp/view.h"
#include "mojo/services/view_manager/public/cpp/view_manager_client_factory.h"
#include "mojo/services/view_manager/public/cpp/view_manager_delegate.h"
#include "mojo/services/window_manager/public/interfaces/window_manager.mojom.h"

namespace mojo {
namespace {

// TestApplication's view is embedded by the window manager.
class TestApplication : public ApplicationDelegate, public ViewManagerDelegate {
 public:
  TestApplication() : root_(nullptr) {}
  ~TestApplication() override {}

  View* root() const { return root_; }

  void set_embed_callback(const base::Closure& callback) {
    embed_callback_ = callback;
  }

 private:
  // ApplicationDelegate:
  void Initialize(ApplicationImpl* app) override {
    view_manager_client_factory_.reset(
        new ViewManagerClientFactory(app->shell(), this));
  }

  bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
    connection->AddService(view_manager_client_factory_.get());
    return true;
  }

  // ViewManagerDelegate:
  void OnEmbed(View* root,
               InterfaceRequest<ServiceProvider> services,
               ServiceProviderPtr exposed_services) override {
    root_ = root;
    embed_callback_.Run();
  }
  void OnViewManagerDisconnected(ViewManager* view_manager) override {}

  View* root_;
  base::Closure embed_callback_;
  scoped_ptr<ViewManagerClientFactory> view_manager_client_factory_;

  MOJO_DISALLOW_COPY_AND_ASSIGN(TestApplication);
};

class TestWindowManagerObserver : public WindowManagerObserver {
 public:
  explicit TestWindowManagerObserver(
      InterfaceRequest<WindowManagerObserver> observer_request)
      : binding_(this, observer_request.Pass()) {}
  ~TestWindowManagerObserver() override {}

 private:
  // Overridden from WindowManagerClient:
  void OnCaptureChanged(Id new_capture_node_id) override {}
  void OnFocusChanged(Id focused_node_id) override {}
  void OnActiveWindowChanged(Id active_window) override {}

  Binding<WindowManagerObserver> binding_;

  DISALLOW_COPY_AND_ASSIGN(TestWindowManagerObserver);
};

class WindowManagerApplicationTest : public test::ApplicationTestBase {
 public:
  WindowManagerApplicationTest() {}
  ~WindowManagerApplicationTest() override {}

 protected:
  // ApplicationTestBase:
  void SetUp() override {
    ApplicationTestBase::SetUp();
    application_impl()->ConnectToService("mojo:window_manager",
                                         &window_manager_);
  }
  ApplicationDelegate* GetApplicationDelegate() override {
    return &test_application_;
  }

  void EmbedApplicationWithURL(const std::string& url) {
    window_manager_->Embed(url, nullptr, nullptr);

    base::RunLoop run_loop;
    test_application_.set_embed_callback(run_loop.QuitClosure());
    run_loop.Run();
  }

  WindowManagerPtr window_manager_;
  TestApplication test_application_;

 private:
  MOJO_DISALLOW_COPY_AND_ASSIGN(WindowManagerApplicationTest);
};

TEST_F(WindowManagerApplicationTest, Embed) {
  EXPECT_EQ(nullptr, test_application_.root());
  EmbedApplicationWithURL(application_impl()->url());
  EXPECT_NE(nullptr, test_application_.root());
}

struct BoolCallback {
  BoolCallback(bool* bool_value, base::RunLoop* run_loop)
      : bool_value(bool_value), run_loop(run_loop) {}

  void Run(bool value) const {
    *bool_value = value;
    run_loop->Quit();
  }

  bool* bool_value;
  base::RunLoop* run_loop;
};

TEST_F(WindowManagerApplicationTest, SetCaptureFailsFromNonVM) {
  EmbedApplicationWithURL(application_impl()->url());
  bool callback_value = true;
  base::RunLoop run_loop;
  window_manager_->SetCapture(test_application_.root()->id(),
                              BoolCallback(&callback_value, &run_loop));
  run_loop.Run();
  // This call only succeeds for WindowManager connections from the ViewManager.
  EXPECT_FALSE(callback_value);
}

TEST_F(WindowManagerApplicationTest, FocusWindowFailsFromNonVM) {
  EmbedApplicationWithURL(application_impl()->url());
  bool callback_value = true;
  base::RunLoop run_loop;
  window_manager_->FocusWindow(test_application_.root()->id(),
                               BoolCallback(&callback_value, &run_loop));
  run_loop.Run();
  // This call only succeeds for WindowManager connections from the ViewManager.
  EXPECT_FALSE(callback_value);
}

TEST_F(WindowManagerApplicationTest, ActivateWindowFailsFromNonVM) {
  EmbedApplicationWithURL(application_impl()->url());
  bool callback_value = true;
  base::RunLoop run_loop;
  window_manager_->ActivateWindow(test_application_.root()->id(),
                                  BoolCallback(&callback_value, &run_loop));
  run_loop.Run();
  // This call only succeeds for WindowManager connections from the ViewManager.
  EXPECT_FALSE(callback_value);
}

struct FocusedAndActiveViewsCallback {
  FocusedAndActiveViewsCallback(uint32* capture_view_id,
                                uint32* focused_view_id,
                                uint32* active_view_id,
                                base::RunLoop* run_loop)
      : capture_view_id(capture_view_id),
        focused_view_id(focused_view_id),
        active_view_id(active_view_id),
        run_loop(run_loop) {
  }

  void Run(uint32 capture, uint32 focused, uint32 active) const {
    *capture_view_id = capture;
    *focused_view_id = focused;
    *active_view_id = active;
    run_loop->Quit();
  }

  uint32* capture_view_id;
  uint32* focused_view_id;
  uint32* active_view_id;
  base::RunLoop* run_loop;
};

TEST_F(WindowManagerApplicationTest, GetFocusedAndActiveViewsFailsWithoutFC) {
  EmbedApplicationWithURL(application_impl()->url());
  uint32 capture_view_id = -1;
  uint32 focused_view_id = -1;
  uint32 active_view_id = -1;
  base::RunLoop run_loop;

  WindowManagerObserverPtr observer;
  scoped_ptr<TestWindowManagerObserver> window_manager_observer(
      new TestWindowManagerObserver(GetProxy(&observer)));

  window_manager_->GetFocusedAndActiveViews(
      observer.Pass(),
      FocusedAndActiveViewsCallback(&capture_view_id,
                                    &focused_view_id,
                                    &active_view_id,
                                    &run_loop));
  run_loop.Run();
  // This call fails if the WindowManager does not have a FocusController.
  EXPECT_EQ(0u, capture_view_id);
  EXPECT_EQ(0u, focused_view_id);
  EXPECT_EQ(0u, active_view_id);
}

// TODO(msw): Write tests exercising other WindowManager functionality.

}  // namespace
}  // namespace mojo
