workspace_window_resizer_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/workspace_window_resizer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/display_controller.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screen_ash.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/property_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/phantom_window_controller.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/workspace/snap_sizer.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/workspace_controller.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_number_conversions.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stringprintf.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/aura_constants.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/insets.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kRootHeight = 600;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple window delegate that returns the specified min size.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestWindowDelegate : public aura::test::TestWindowDelegate {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate() {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestWindowDelegate() {}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_min_size(const gfx::Size& size) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    min_size_ = size;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_max_size(const gfx::Size& size) {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    max_size_ = size;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from aura::Test::TestWindowDelegate:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return min_size_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetMaximumSize() const OVERRIDE {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return max_size_;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size min_size_;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size max_size_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestWindowDelegate);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WorkspaceWindowResizerTest : public test::AshTestBase {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WorkspaceWindowResizerTest() : window_(NULL) {}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WorkspaceWindowResizerTest() {}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::SetUp();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateDisplay(base::StringPrintf("800x%d", kRootHeight));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::RootWindow* root = Shell::GetPrimaryRootWindow();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect root_bounds(root->bounds());
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // RootWindow and Display can't resize on Windows Ash.
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // http://crbug.com/165962
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kRootHeight, root_bounds.height());
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(800, root_bounds.width());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_.reset(new aura::Window(&delegate_));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SetType(aura::client::WINDOW_TYPE_NORMAL);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->Init(ui::LAYER_NOT_DRAWN);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetDefaultParentByPrimaryRootWindow(window_.get());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->set_id(1);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_.reset(new aura::Window(&delegate2_));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetType(aura::client::WINDOW_TYPE_NORMAL);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->Init(ui::LAYER_NOT_DRAWN);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetDefaultParentByPrimaryRootWindow(window2_.get());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->set_id(2);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window3_.reset(new aura::Window(&delegate3_));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window3_->SetType(aura::client::WINDOW_TYPE_NORMAL);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window3_->Init(ui::LAYER_NOT_DRAWN);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetDefaultParentByPrimaryRootWindow(window3_.get());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window3_->set_id(3);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window4_.reset(new aura::Window(&delegate4_));
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window4_->SetType(aura::client::WINDOW_TYPE_NORMAL);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window4_->Init(ui::LAYER_NOT_DRAWN);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetDefaultParentByPrimaryRootWindow(window4_.get());
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window4_->set_id(4);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_.reset();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_.reset();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window3_.reset();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window4_.reset();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::TearDown();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a string identifying the z-order of each of the known child windows
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of |parent|.  The returned string constains the id of the known windows and
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is ordered from topmost to bottomost windows.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string WindowOrderAsString(aura::Window* parent) const {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string result;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const aura::Window::Windows& windows = parent->children();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (aura::Window::Windows::const_reverse_iterator i = windows.rbegin();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         i != windows.rend(); ++i) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (*i == window_.get() || *i == window2_.get() || *i == window3_.get()) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!result.empty())
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          result += " ";
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result += base::IntToString((*i)->id());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point CalculateDragPoint(const WorkspaceWindowResizer& resizer,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int delta_x,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int delta_y) const {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point location = resizer.GetInitialLocationInParentForTest();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    location.set_x(location.x() + delta_x);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    location.set_y(location.y() + delta_y);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return location;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> empty_windows() const {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::vector<aura::Window*>();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::ShelfLayoutManager* shelf_layout_manager() {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate delegate_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate delegate2_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate delegate3_;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestWindowDelegate delegate4_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> window_;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> window2_;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> window3_;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window4_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WorkspaceWindowResizerTest);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the right with 2
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_2) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 300, 400, 300));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(400, 200, 100, 200));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT, windows));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 to the right, which should expand w1 and push w2.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 500x300", window_->bounds().ToString());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,200 100x200", window2_->bounds().ToString());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Push off the screen, w2 should be resized to its min.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(20, 20));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 780x300", window_->bounds().ToString());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("780,200 20x200", window2_->bounds().ToString());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move back to 100 and verify w2 gets its original size.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 500x300", window_->bounds().ToString());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,200 100x200", window2_->bounds().ToString());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Revert and make sure everything moves back.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->RevertDrag();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 400x300", window_->bounds().ToString());
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,200 100x200", window2_->bounds().ToString());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around collapsing and expanding.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_Compress) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(   0, 300, 400, 300));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(400, 200, 100, 200));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT, windows));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 to the left, which should expand w2 and collapse w1.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -100, 10), 0);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 300x300", window_->bounds().ToString());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,200 200x200", window2_->bounds().ToString());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Collapse all the way to w1's min.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_.set_min_size(gfx::Size(20, 20));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -800, 20), 0);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 20x300", window_->bounds().ToString());
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("20,200 480x200", window2_->bounds().ToString());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move 100 to the left.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 500x300", window_->bounds().ToString());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,200 100x200", window2_->bounds().ToString());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Back to -100.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -100, 20), 0);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 300x300", window_->bounds().ToString());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,200 200x200", window2_->bounds().ToString());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the right with 3
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_3) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 300, 200, 300));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(300, 300, 150, 200));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window3_->SetBounds(gfx::Rect(450, 300, 100, 200));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(52, 50));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate3_.set_min_size(gfx::Size(38, 50));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window3_.get());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT, windows));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 to the right, which should expand w1 and push w2 and w3.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 300x300", window_->bounds().ToString());
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,300 150x200", window2_->bounds().ToString());
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("550,300 100x200", window3_->bounds().ToString());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 300, things should compress.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 300, -10), 0);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 500x300", window_->bounds().ToString());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("600,300 120x200", window2_->bounds().ToString());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("720,300 80x200", window3_->bounds().ToString());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it so much the last two end up at their min.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800, 50), 0);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 610x300", window_->bounds().ToString());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("710,300 52x200", window2_->bounds().ToString());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("762,300 38x200", window3_->bounds().ToString());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Revert and make sure everything moves back.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->RevertDrag();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 200x300", window_->bounds().ToString());
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,300 150x200", window2_->bounds().ToString());
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("450,300 100x200", window3_->bounds().ToString());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resizing (collapsing and expanding) with
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3 windows.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_3_Compress) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 300, 200, 300));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(300, 300, 200, 200));
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window3_->SetBounds(gfx::Rect(450, 300, 100, 200));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(52, 50));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate3_.set_min_size(gfx::Size(38, 50));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window3_.get());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT, windows));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it -100 to the right, which should collapse w1 and expand w2 and w3.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -100, -10), 0);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 100x300", window_->bounds().ToString());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200,300 266x200", window2_->bounds().ToString());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("466,300 134x200", window3_->bounds().ToString());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 to the right.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 300x300", window_->bounds().ToString());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,300 200x200", window2_->bounds().ToString());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("600,300 100x200", window3_->bounds().ToString());
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 100 to the left again.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -100, -10), 0);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 100x300", window_->bounds().ToString());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200,300 266x200", window2_->bounds().ToString());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("466,300 134x200", window3_->bounds().ToString());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around collapsing and expanding from the bottom.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_Compress) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(   0, 100, 400, 300));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(400, 400, 100, 200));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM, windows));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it up 100, which should expand w2 and collapse w1.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, -100), 0);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,100 400x200", window_->bounds().ToString());
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,300 100x300", window2_->bounds().ToString());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Collapse all the way to w1's min.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_.set_min_size(gfx::Size(20, 20));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 20, -800), 0);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,100 400x20", window_->bounds().ToString());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,120 100x480", window2_->bounds().ToString());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move 100 down.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,100 400x400", window_->bounds().ToString());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,500 100x100", window2_->bounds().ToString());
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Back to -100.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 20, -100), 0);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,100 400x200", window_->bounds().ToString());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,300 100x300", window2_->bounds().ToString());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the bottom with 2
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_2) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect( 0,  50, 400, 200));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(0, 250, 200, 100));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM, windows));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 to the bottom, which should expand w1 and push w2.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,50 400x300", window_->bounds().ToString());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,350 200x100", window2_->bounds().ToString());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Push off the screen, w2 should be resized to its min.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(20, 20));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 50, 820), 0);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,50 400x530", window_->bounds().ToString());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,580 200x20", window2_->bounds().ToString());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move back to 100 and verify w2 gets its original size.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,50 400x300", window_->bounds().ToString());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,350 200x100", window2_->bounds().ToString());
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Revert and make sure everything moves back.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->RevertDrag();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,50 400x200", window_->bounds().ToString());
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,250 200x100", window2_->bounds().ToString());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AttachedResize_BOTTOM_3 DISABLED_AttachedResize_BOTTOM_3
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AttachedResize_BOTTOM_3 AttachedResize_BOTTOM_3
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Assertions around attached window resize dragging from the bottom with 3
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// windows.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_AttachedResize_BOTTOM_3) {
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* root = Shell::GetPrimaryRootWindow();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect( 300, 100, 300, 200));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(300, 300, 200, 150));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 450, 200, 100));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(50, 52));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate3_.set_min_size(gfx::Size(50, 38));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window3_.get());
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM, windows));
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 100 down, which should expand w1 and push w2 and w3.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -10, 100), 0);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,100 300x300", window_->bounds().ToString());
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,400 200x150", window2_->bounds().ToString());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,550 200x100", window3_->bounds().ToString());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 296 things should compress.
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -10, 296), 0);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,100 300x496", window_->bounds().ToString());
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("300,596 200x123", window2_->bounds().ToString());
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("300,719 200x81", window3_->bounds().ToString());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it so much everything ends up at its min.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 50, 798), 0);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,100 300x610", window_->bounds().ToString());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,710 200x52", window2_->bounds().ToString());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,762 200x38", window3_->bounds().ToString());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Revert and make sure everything moves back.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->RevertDrag();
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,100 300x200", window_->bounds().ToString());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,300 200x150", window2_->bounds().ToString());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,450 200x100", window3_->bounds().ToString());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resizing (collapsing and expanding) with
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3 windows.
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_3_Compress) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(  0,   0, 200, 200));
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(10, 200, 200, 200));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window3_->SetBounds(gfx::Rect(20, 400, 100, 100));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(52, 50));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate3_.set_min_size(gfx::Size(38, 50));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window3_.get());
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM, windows));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 up, which should collapse w1 and expand w2 and w3.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -10, -100), 0);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x100", window_->bounds().ToString());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,100 200x266", window2_->bounds().ToString());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("20,366 100x134", window3_->bounds().ToString());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 down.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x300", window_->bounds().ToString());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,300 200x200", window2_->bounds().ToString());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("20,500 100x100", window3_->bounds().ToString());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 100 up again.
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -10, -100), 0);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x100", window_->bounds().ToString());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,100 200x266", window2_->bounds().ToString());
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("20,366 100x134", window3_->bounds().ToString());
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Multiple displays are not supported on Windows Ash. http://crbug.com/165962
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_Edge DISABLED_Edge
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_Edge Edge
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around dragging to the left/right edge of the screen.
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_Edge) {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bottom =
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ScreenAsh::GetDisplayWorkAreaBoundsInParent(window_.get()).bottom();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(20, 30, 50, 60));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 10), 0);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->CompleteDrag(0);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("0,0 720x" + base::IntToString(bottom),
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_->bounds().ToString());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(GetRestoreBoundsInScreen(window_.get()));
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("20,30 50x60",
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GetRestoreBoundsInScreen(window_.get())->ToString());
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try the same with the right side.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 800, 10), 0);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->CompleteDrag(0);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("80,0 720x" + base::IntToString(bottom),
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_->bounds().ToString());
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(GetRestoreBoundsInScreen(window_.get()));
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("20,30 50x60",
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GetRestoreBoundsInScreen(window_.get())->ToString());
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test if the restore bounds is correct in multiple displays.
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearRestoreBounds(window_.get());
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("800x600,200x600");
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], window_->GetRootWindow());
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBoundsInScreen(gfx::Rect(800, 10, 50, 60),
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ScreenAsh::GetSecondaryDisplay());
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], window_->GetRootWindow());
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bottom =
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ScreenAsh::GetDisplayWorkAreaBoundsInParent(window_.get()).bottom();
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("800,10 50x60", window_->GetBoundsInScreen().ToString());
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 199, 00), 0);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->CompleteDrag(0);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // With the resolution of 200x600 we will hit in this case the 50% screen
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // size setting.
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,0 100x" + base::IntToString(bottom),
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_->bounds().ToString());
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("800,10 50x60",
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GetRestoreBoundsInScreen(window_.get())->ToString());
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that non resizable windows will not get resized.
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, NonResizableWindows) {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect(20, 30, 50, 60));
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetProperty(aura::client::kCanResizeKey, false);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -20, 0), 0);
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->CompleteDrag(0);
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,30 50x60", window_->bounds().ToString());
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Multiple displays are not supported on Windows Ash. http://crbug.com/165962
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CancelSnapPhantom DISABLED_CancelSnapPhantom
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CancelSnapPhantom CancelSnapPhantom
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_CancelSnapPhantom) {
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("800x600,800x600");
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, root_windows.size());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBoundsInScreen(gfx::Rect(0, 0, 50, 60),
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Shell::GetScreen()->GetPrimaryDisplay());
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], window_->GetRootWindow());
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FLOAT_EQ(1.0f, window_->layer()->opacity());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(resizer->snap_phantom_window_controller_.get());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The pointer is on the edge but not shared. The snap phantom window
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // controller should be non-NULL.
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 799, 0), 0);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(resizer->snap_phantom_window_controller_.get());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Move the cursor across the edge. Now the snap phantom window controller
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // should be canceled.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 800, 0), 0);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(resizer->snap_phantom_window_controller_.get());
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies windows are correctly restacked when reordering multiple windows.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestackAttached) {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(   0, 0, 200, 300));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 0, 100, 200));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 0, 100, 100));
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<aura::Window*> windows;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    windows.push_back(window2_.get());
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTRIGHT, windows));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the right, which should expand w1 and push w2 and w3.
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 should be topmost since it's initially the highest in the stack.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("2 1 3", WindowOrderAsString(window_->parent()));
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<aura::Window*> windows;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    windows.push_back(window3_.get());
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window2_.get(), gfx::Point(), HTRIGHT, windows));
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the right, which should expand w1 and push w2 and w3.
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 should be topmost since it's initially the highest in the stack.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("2 3 1", WindowOrderAsString(window_->parent()));
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging below the work area.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffBottom) {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, Shell::GetScreen()->GetNumDisplays());
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 300, 400));
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600), 0);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_y =
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400",
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            window_->bounds().ToString());
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Multiple displays are not supported on Windows Ash. http://crbug.com/165962
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontDragOffBottomWithMultiDisplay \
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DISABLED_DontDragOffBottomWithMultiDisplay
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontDragOffBottomWithMultiDisplay \
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DontDragOffBottomWithMultiDisplay
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging on the work area with multidisplay.
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_DontDragOffBottomWithMultiDisplay) {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("800x600,800x600");
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Positions the secondary display at the bottom the primary display.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ash::DisplayLayout display_layout(ash::DisplayLayout::BOTTOM, 0);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->display_controller()->SetDefaultDisplayLayout(
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_layout);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SetBounds(gfx::Rect(100, 200, 300, 400));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 400), 0);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_y =
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When the mouse cursor is in the primary display, the window cannot move
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // on non-work area with kMinOnscreenHeight margin.
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400",
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_->bounds().ToString());
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SetBounds(gfx::Rect(100, 200, 300, 400));
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 600), 0);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The window can move to the secondary display beyond non-work area of
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the primary display.
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,800 300x400", window_->bounds().ToString());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging off the top of the work area.
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffTop) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(10, 0, 0, 0));
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 300, 400));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -600), 0);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,10 300x400", window_->bounds().ToString());
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeBottomOutsideWorkArea) {
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 300, 380));
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTTOP, empty_windows()));
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 8, 0), 0);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,200 300x380", window_->bounds().ToString());
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideLeftWorkArea) {
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int left = ScreenAsh::GetDisplayWorkAreaBoundsInParent(window_.get()).x();
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pixels_to_left_border = 50;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_width = 300;
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_x = left - window_width + pixels_to_left_border;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(pixels_to_left_border, 0), HTRIGHT,
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      empty_windows()));
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -window_width, 0), 0);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(window_x) + ",100 " +
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(kMinimumOnScreenArea - window_x) +
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideRightWorkArea) {
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int right = ScreenAsh::GetDisplayWorkAreaBoundsInParent(
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get()).right();
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pixels_to_right_border = 50;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_width = 300;
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_x = right - pixels_to_right_border;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(window_x, 0), HTLEFT,
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      empty_windows()));
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0);
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) +
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ",100 " +
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(window_width - pixels_to_right_border +
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              kMinimumOnScreenArea) +
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideBottomWorkArea) {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bottom = ScreenAsh::GetDisplayWorkAreaBoundsInParent(
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get()).bottom();
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int delta_to_bottom = 50;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int height = 380;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, bottom - delta_to_bottom, 300, height));
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(0, bottom - delta_to_bottom), HTTOP,
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      empty_windows()));
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, bottom), 0);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100," +
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(bottom - kMinimumOnScreenArea) +
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " 300x" +
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(height - (delta_to_bottom -
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        kMinimumOnScreenArea)),
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            window_->bounds().ToString());
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Multiple displays are not supported on Windows Ash. http://crbug.com/165962
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DragWindowOutsideRightToSecondaryDisplay \
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DISABLED_DragWindowOutsideRightToSecondaryDisplay
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DragWindowOutsideRightToSecondaryDisplay \
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DragWindowOutsideRightToSecondaryDisplay
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that 'outside' check of the resizer take into account the extended
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// desktop in case of repositions.
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest,
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       MAYBE_DragWindowOutsideRightToSecondaryDisplay) {
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only primary display.  Changes the window position to fit within the
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // display.
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int right = ScreenAsh::GetDisplayWorkAreaBoundsInParent(
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get()).right();
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pixels_to_right_border = 50;
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_width = 300;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_x = right - pixels_to_right_border;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(window_x, 0), HTCAPTION,
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      empty_windows()));
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0);
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) +
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ",100 " +
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(window_width) +
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // With secondary display.  Operation itself is same but doesn't change
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the position because the window is still within the secondary display.
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(window_x + window_width) +
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ",100 " +
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(window_width) +
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies snapping to edges works.
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToEdge) {
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(96, 112, 320, 160));
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move to an x-coordinate of 15, which should not snap.
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -81, 0), 0);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An x-coordinate of 7 should snap.
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -89, 0), 0);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,112 320x160", window_->bounds().ToString());
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move to -15, should still snap to 0.
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -111, 0), 0);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,112 320x160", window_->bounds().ToString());
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // At -32 should move past snap points.
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -128, 0), 0);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-32,112 320x160", window_->bounds().ToString());
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -129, 0), 0);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-33,112 320x160", window_->bounds().ToString());
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Right side should similarly snap.
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 15, 0), 0);
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("465,112 320x160", window_->bounds().ToString());
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 7, 0), 0);
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("480,112 320x160", window_->bounds().ToString());
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 15, 0), 0);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("480,112 320x160", window_->bounds().ToString());
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 32, 0), 0);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("512,112 320x160", window_->bounds().ToString());
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 33, 0), 0);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("513,112 320x160", window_->bounds().ToString());
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the bottom should snap too.
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 - 7), 0);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,437 320x160", window_->bounds().ToString());
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 + 15), 0);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,437 320x160", window_->bounds().ToString());
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 32), 0);
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,470 320x160", window_->bounds().ToString());
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 33), 0);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,471 320x160", window_->bounds().ToString());
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the top should snap too.
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 20), 0);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,20 320x160", window_->bounds().ToString());
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 7), 0);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,0 320x160", window_->bounds().ToString());
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No need to test dragging < 0 as we force that to 0.
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPLEFT.
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPLEFT) {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTTOPLEFT, empty_windows()));
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -98, -199), 0);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 120x230", window_->bounds().ToString());
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPRIGHT.
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPRIGHT) {
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent(
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          window_.get()));
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTTOPRIGHT, empty_windows()));
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CalculateDragPoint(*resizer, work_area.right() - 120 - 1, -199), 0);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, window_->bounds().x());
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.y(), window_->bounds().y());
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.right() - 100, window_->bounds().width());
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(230, window_->bounds().height());
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMRIGHT.
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMRIGHT) {
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent(
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          window_.get()));
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows()));
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CalculateDragPoint(*resizer, work_area.right() - 120 - 1,
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         work_area.bottom() - 220 - 2), 0);
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, window_->bounds().x());
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, window_->bounds().y());
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.right() - 100, window_->bounds().width());
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height());
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMLEFT.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMLEFT) {
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent(
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          window_.get()));
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMLEFT, empty_windows()));
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CalculateDragPoint(*resizer, -98, work_area.bottom() - 220 - 2), 0);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, window_->bounds().x());
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, window_->bounds().y());
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(120, window_->bounds().width());
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height());
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CtrlDragResizeToExactPosition) {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(96, 112, 320, 160));
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows()));
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resize the right bottom to add 10 in width, 12 in height.
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 12), ui::EF_CONTROL_DOWN);
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both bottom and right sides to resize to exact size requested.
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,112 330x172", window_->bounds().ToString());
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CtrlCompleteDragMoveToExactPosition) {
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(96, 112, 320, 160));
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ctrl + drag the window to new poistion by adding (10, 12) to its origin,
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the window should move to the exact position.
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 12), 0);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->CompleteDrag(ui::EF_CONTROL_DOWN);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("106,124 320x160", window_->bounds().ToString());
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that only usable sizes get returned by the resizer.
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestProperSizerResolutions) {
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we have the correct work area resolution which fits our
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expected test result.
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent(
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          window_.get()));
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(800, work_area.width());
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(96, 112, 320, 160));
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SnapSizer> resizer(new SnapSizer(
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(),
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(),
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SnapSizer::LEFT_EDGE,
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SnapSizer::OTHER_INPUT));
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf_layout_manager()->SetAutoHideBehavior(
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the list is declining and contains elements of the
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ideal size list [1280, 1024, 768, 640] as well as 50% and 90% the work
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // area.
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect rect = resizer->GetTargetBoundsForSize(0);
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 720x597", rect.ToString());
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rect = resizer->GetTargetBoundsForSize(1);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 640x597", rect.ToString());
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rect = resizer->GetTargetBoundsForSize(2);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 400x597", rect.ToString());
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf_layout_manager()->SetAutoHideBehavior(
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rect = resizer->GetTargetBoundsForSize(0);
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 720x552", rect.ToString());
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rect = resizer->GetTargetBoundsForSize(1);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 640x552", rect.ToString());
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rect = resizer->GetTargetBoundsForSize(2);
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 400x552", rect.ToString());
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size.
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestoreToPreMaximizeCoordinates) {
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 0, 1000, 1000));
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetRestoreBoundsInScreen(window_.get(), gfx::Rect(96, 112, 320, 160));
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag the window to new position by adding (10, 10) to original point,
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the window should get restored.
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 10), 0);
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->CompleteDrag(0);
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,10 320x160", window_->bounds().ToString());
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The restore rectangle should get cleared as well.
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NULL, GetRestoreBoundsInScreen(window_.get()));
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size.
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RevertResizeOperation) {
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect initial_bounds(0, 0, 200, 400);
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(initial_bounds);
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetRestoreBoundsInScreen(window_.get(), gfx::Rect(96, 112, 320, 160));
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag the window to new poistion by adding (180, 16) to original point,
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the window should get restored.
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 180, 16), 0);
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->RevertDrag();
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(initial_bounds.ToString(), window_->bounds().ToString());
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,112 320x160",
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRestoreBoundsInScreen(window_.get())->ToString());
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that only usable sizes get returned by the resizer.
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyAttach) {
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(10, 10, 20, 30));
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(150, 160, 25, 20));
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel to the left of |window2|. Should snap to right and
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // top.
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, 145), 0);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("130,160 20x30", window_->bounds().ToString());
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel to the right of |window2|. Should snap to left and
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // top.
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 164, 145), 0);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("175,160 20x30", window_->bounds().ToString());
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel above |window2|. Should snap to top and left.
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 142, 119), 0);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("150,130 20x30", window_->bounds().ToString());
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel above the bottom of |window2|. Should snap to
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bottom and left.
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 142, 169), 0);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("150,180 20x30", window_->bounds().ToString());
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following variants verify magnetic snapping during resize when dragging a
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular edge.
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOP) {
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(99, 179, 10, 20));
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_.get(), gfx::Point(), HTTOP, empty_windows()));
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,199 20x31", window_->bounds().ToString());
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPLEFT) {
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(99, 179, 10, 20));
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTTOPLEFT, empty_windows()));
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("99,199 21x31", window_->bounds().ToString());
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(88, 201, 10, 20));
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTTOPLEFT, empty_windows()));
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("98,201 22x29", window_->bounds().ToString());
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPRIGHT) {
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(111, 179, 10, 20));
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTTOPRIGHT, empty_windows()));
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,199 21x31", window_->bounds().ToString());
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(121, 199, 10, 20));
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTTOPRIGHT, empty_windows()));
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,199 21x31", window_->bounds().ToString());
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_RIGHT) {
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(121, 199, 10, 20));
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT, empty_windows()));
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,200 21x30", window_->bounds().ToString());
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMRIGHT) {
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(122, 212, 10, 20));
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows()));
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,200 22x32", window_->bounds().ToString());
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(111, 233, 10, 20));
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows()));
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,200 21x33", window_->bounds().ToString());
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOM) {
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(111, 233, 10, 20));
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOM, empty_windows()));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,200 20x33", window_->bounds().ToString());
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMLEFT) {
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(99, 231, 10, 20));
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMLEFT, empty_windows()));
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("99,200 21x31", window_->bounds().ToString());
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(89, 209, 10, 20));
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMLEFT, empty_windows()));
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("99,200 21x29", window_->bounds().ToString());
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_LEFT) {
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(89, 209, 10, 20));
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get(), gfx::Point(), HTLEFT, empty_windows()));
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("99,200 21x30", window_->bounds().ToString());
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the user user moved window flag is getting properly set.
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CheckUserWindowMangedFlags) {
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect( 0,  50, 400, 200));
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> no_attached_windows;
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that an abort doesn't change anything.
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION, no_attached_windows));
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the bottom.
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("0,150 400x200", window_->bounds().ToString());
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ash::wm::HasUserChangedWindowPositionOrSize(window_.get()));
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that a completed move / size does change the user coordinates.
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION, no_attached_windows));
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the bottom.
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0);
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("0,150 400x200", window_->bounds().ToString());
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->CompleteDrag(0);
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ash::wm::HasUserChangedWindowPositionOrSize(window_.get()));
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size doesn't exceed it when dragged.
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestMaxSizeEnforced) {
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 0, 400, 300));
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_max_size(gfx::Size(401, 301));
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows()));
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0);
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(401, window_->bounds().width());
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(301, window_->bounds().height());
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max width doesn't restrict its height.
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestPartialMaxSizeEnforced) {
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 0, 400, 300));
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_max_size(gfx::Size(401, 0));
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows()));
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0);
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(401, window_->bounds().width());
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(302, window_->bounds().height());
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size can't be snapped.
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, PhantomSnapMaxSize) {
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // With max size not set we get a phantom window controller for dragging off
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the right hand side.
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_->SetBounds(gfx::Rect(0, 0, 300, 200));
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(resizer->snap_phantom_window_controller_.get());
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0);
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(resizer->snap_phantom_window_controller_.get());
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // With max size defined, we get no phantom window.
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_->SetBounds(gfx::Rect(0, 0, 300, 200));
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_.set_max_size(gfx::Size(300, 200));
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION, empty_windows()));
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0);
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(resizer->snap_phantom_window_controller_.get());
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontRewardRightmostWindowForOverflows) {
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* root = Shell::GetPrimaryRootWindow();
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(400, 100, 100, 100));
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(101, 0));
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT, windows));
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 51 to the left, which should contract w1 and expand w2-4.
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // w2 will hit its max size straight away, and in doing so will leave extra
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // pixels that a naive implementation may award to the rightmost window. A
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // fair implementation will give 25 pixels to each of the other windows.
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0);
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 49x100", window_->bounds().ToString());
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("149,100 101x100", window2_->bounds().ToString());
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("250,100 125x100", window3_->bounds().ToString());
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("375,100 125x100", window4_->bounds().ToString());
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxWidth) {
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* root = Shell::GetPrimaryRootWindow();
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(400, 100, 100, 100));
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(101, 0));
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(101, 0));
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT, windows));
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 to the left, which should contract w1 and expand w2-4.
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0);
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 48x100", window_->bounds().ToString());
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("148,100 101x100", window2_->bounds().ToString());
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("249,100 101x100", window3_->bounds().ToString());
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("350,100 150x100", window4_->bounds().ToString());
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxHeight) {
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* root = Shell::GetPrimaryRootWindow();
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(100, 200, 100, 100));
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(100, 300, 100, 100));
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(100, 400, 100, 100));
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(0, 101));
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(0, 101));
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM, windows));
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 up, which should contract w1 and expand w2-4.
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -52), 0);
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 100x48", window_->bounds().ToString());
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,148 100x101", window2_->bounds().ToString());
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,249 100x101", window3_->bounds().ToString());
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,350 100x150", window4_->bounds().ToString());
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DISABLED_DontExceedMinHeight
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DontExceedMinHeight
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_DontExceedMinHeight) {
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x500");
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* root = Shell::GetPrimaryRootWindow();
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(100, 200, 100, 100));
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(100, 300, 100, 100));
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(100, 400, 100, 100));
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_min_size(gfx::Size(0, 99));
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_min_size(gfx::Size(0, 99));
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM, windows));
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 down, which should expand w1 and contract w2-4.
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 52), 0);
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 100x152", window_->bounds().ToString());
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,252 100x99", window2_->bounds().ToString());
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,351 100x99", window3_->bounds().ToString());
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,450 100x50", window4_->bounds().ToString());
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExpandRightmostPastMaxWidth) {
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* root = Shell::GetPrimaryRootWindow();
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(101, 0));
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT, windows));
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 51 to the left, which should contract w1 and expand w2-3.
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0);
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 49x100", window_->bounds().ToString());
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("149,100 150x100", window2_->bounds().ToString());
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("299,100 101x100", window3_->bounds().ToString());
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MoveAttachedWhenGrownToMaxSize) {
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* root = Shell::GetPrimaryRootWindow();
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(101, 0));
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(101, 0));
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT, windows));
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 to the left, which should contract w1 and expand and move w2-3.
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0);
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 48x100", window_->bounds().ToString());
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("148,100 101x100", window2_->bounds().ToString());
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("249,100 101x100", window3_->bounds().ToString());
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth DISABLED_MainWindowHonoursMaxWidth
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth MainWindowHonoursMaxWidth
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_MainWindowHonoursMaxWidth) {
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("400x800");
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* root = Shell::GetPrimaryRootWindow();
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_max_size(gfx::Size(102, 0));
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT, windows));
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 50 to the right, which should expand w1 and contract w2-3, as they
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // won't fit in the root window in their original sizes.
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 50, 0), 0);
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 102x100", window_->bounds().ToString());
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("202,100 99x100", window2_->bounds().ToString());
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("301,100 99x100", window3_->bounds().ToString());
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MainWindowHonoursMinWidth) {
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("400x800");
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* root = Shell::GetPrimaryRootWindow();
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_min_size(gfx::Size(98, 0));
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT, windows));
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 50 to the left, which should contract w1 and expand w2-3.
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -50, 0), 0);
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 98x100", window_->bounds().ToString());
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("198,100 101x100", window2_->bounds().ToString());
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("299,100 101x100", window3_->bounds().ToString());
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1496