// 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:
  virtual 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("mojo:window_manager_apptests");
  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("mojo:window_manager_apptests");
  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("mojo:window_manager_apptests");
  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("mojo:window_manager_apptests");
  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("mojo:window_manager_apptests");
  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
