// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/exo/input_method_surface.h"

#include "ash/shell.h"
#include "components/exo/buffer.h"
#include "components/exo/input_method_surface_manager.h"
#include "components/exo/test/exo_test_base.h"
#include "components/exo/test/exo_test_helper.h"
#include "ui/display/display.h"

namespace exo {

class InputMethodSurfaceTest : public test::ExoTestBase,
                               public InputMethodSurfaceManager {
 public:
  InputMethodSurfaceTest() = default;
  InputMethodSurfaceTest(const InputMethodSurfaceTest&) = delete;
  InputMethodSurfaceTest& operator=(const InputMethodSurfaceTest&) = delete;

  // Overridden from InputMethodSurfaceTest:
  InputMethodSurface* GetSurface() const override { return nullptr; }
  void AddSurface(InputMethodSurface* surface) override {}
  void RemoveSurface(InputMethodSurface* surface) override {}
  void OnTouchableBoundsChanged(InputMethodSurface* surface) override {}
};

TEST_F(InputMethodSurfaceTest, SetGeometryShouldIgnoreWorkArea) {
  UpdateDisplay("800x600");

  int64_t display_id = display::Screen::GetScreen()->GetPrimaryDisplay().id();
  display::DisplayManager* display_manager =
      ash::Shell::Get()->display_manager();

  // With work area top insets.
  display_manager->UpdateWorkAreaOfDisplay(display_id,
                                           gfx::Insets::TLBR(200, 0, 0, 0));

  gfx::Size buffer_size(800, 600);
  auto buffer = test::ExoTestHelper::CreateBuffer(buffer_size);
  std::unique_ptr<Surface> surface(new Surface);
  auto shell_surface =
      exo_test_helper()->CreateInputMethodSurface(surface.get(), this);
  surface->Attach(buffer.get());
  shell_surface->SetGeometry(gfx::Rect(buffer_size));
  surface->Commit();

  views::Widget* widget = shell_surface->GetWidget();
  EXPECT_EQ(gfx::Rect(buffer_size), widget->GetWindowBoundsInScreen());
}

}  // namespace exo
