workspace_window_resizer_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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)
78bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ash/display/display_manager.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/screen_util.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"
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/wm/wm_event.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/phantom_window_controller.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/workspace_controller.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/aura_constants.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/test/event_generator.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/events/gestures/gesture_configuration.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/insets.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kRootHeight = 600;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple window delegate that returns the specified min size.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestWindowDelegate : public aura::test::TestWindowDelegate {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate() {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestWindowDelegate() {}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_min_size(const gfx::Size& size) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    min_size_ = size;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_max_size(const gfx::Size& size) {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    max_size_ = size;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from aura::Test::TestWindowDelegate:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return min_size_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetMaximumSize() const OVERRIDE {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return max_size_;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size min_size_;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size max_size_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestWindowDelegate);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WorkspaceWindowResizerTest : public test::AshTestBase {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WorkspaceWindowResizerTest() : workspace_resizer_(NULL) {}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WorkspaceWindowResizerTest() {}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::SetUp();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateDisplay(base::StringPrintf("800x%d", kRootHeight));
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Ignore the touch slop region.
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::GestureConfiguration::set_max_touch_move_in_pixels_for_click(0);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    aura::Window* root = Shell::GetPrimaryRootWindow();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect root_bounds(root->bounds());
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // RootWindow and Display can't resize on Windows Ash.
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // http://crbug.com/165962
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kRootHeight, root_bounds.height());
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(800, root_bounds.width());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_.reset(new aura::Window(&delegate_));
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window_->SetType(ui::wm::WINDOW_TYPE_NORMAL);
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window_->Init(aura::WINDOW_LAYER_NOT_DRAWN);
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ParentWindowInPrimaryRootWindow(window_.get());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->set_id(1);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_.reset(new aura::Window(&delegate2_));
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window2_->SetType(ui::wm::WINDOW_TYPE_NORMAL);
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window2_->Init(aura::WINDOW_LAYER_NOT_DRAWN);
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ParentWindowInPrimaryRootWindow(window2_.get());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->set_id(2);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window3_.reset(new aura::Window(&delegate3_));
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window3_->SetType(ui::wm::WINDOW_TYPE_NORMAL);
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window3_->Init(aura::WINDOW_LAYER_NOT_DRAWN);
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ParentWindowInPrimaryRootWindow(window3_.get());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window3_->set_id(3);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window4_.reset(new aura::Window(&delegate4_));
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window4_->SetType(ui::wm::WINDOW_TYPE_NORMAL);
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window4_->Init(aura::WINDOW_LAYER_NOT_DRAWN);
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ParentWindowInPrimaryRootWindow(window4_.get());
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window4_->set_id(4);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_.reset();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_.reset();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window3_.reset();
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window4_.reset();
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    touch_resize_window_.reset();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::TearDown();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a string identifying the z-order of each of the known child windows
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of |parent|.  The returned string constains the id of the known windows and
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is ordered from topmost to bottomost windows.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string WindowOrderAsString(aura::Window* parent) const {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string result;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const aura::Window::Windows& windows = parent->children();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (aura::Window::Windows::const_reverse_iterator i = windows.rbegin();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         i != windows.rend(); ++i) {
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (*i == window_ || *i == window2_ || *i == window3_) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!result.empty())
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          result += " ";
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result += base::IntToString((*i)->id());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WindowResizer* CreateResizerForTest(
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      aura::Window* window,
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const gfx::Point& point_in_parent,
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      int window_component) {
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    WindowResizer* resizer = CreateWindowResizer(
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window,
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        point_in_parent,
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_component,
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        aura::client::WINDOW_MOVE_SOURCE_MOUSE).release();
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    workspace_resizer_ = WorkspaceWindowResizer::instance_;
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return resizer;
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WorkspaceWindowResizer* CreateWorkspaceResizerForTest(
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      aura::Window* window,
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Point& point_in_parent,
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      int window_component,
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      aura::client::WindowMoveSource source,
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::vector<aura::Window*>& attached_windows) {
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    wm::WindowState* window_state = wm::GetWindowState(window);
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window_state->CreateDragDetails(
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window, point_in_parent, window_component, source);
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return WorkspaceWindowResizer::Create(window_state, attached_windows);
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PhantomWindowController* snap_phantom_window_controller() const {
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return workspace_resizer_->snap_phantom_window_controller_.get();
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Point CalculateDragPoint(const WindowResizer& resizer,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int delta_x,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int delta_y) const {
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    gfx::Point location = resizer.GetInitialLocation();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    location.set_x(location.x() + delta_x);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    location.set_y(location.y() + delta_y);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return location;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> empty_windows() const {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::vector<aura::Window*>();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ShelfLayoutManager* shelf_layout_manager() {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void InitTouchResizeWindow(const gfx::Rect& bounds, int window_component) {
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    touch_resize_delegate_.set_window_component(window_component);
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    touch_resize_window_.reset(
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        CreateTestWindowInShellWithDelegate(&touch_resize_delegate_, 0,
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                            bounds));
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate delegate_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate delegate2_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate delegate3_;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestWindowDelegate delegate4_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> window_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> window2_;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> window3_;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window4_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TestWindowDelegate touch_resize_delegate_;
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<aura::Window> touch_resize_window_;
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WorkspaceWindowResizer* workspace_resizer_;
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WorkspaceWindowResizerTest);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the right with 2
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_2) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 300, 400, 300));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(400, 200, 100, 200));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 to the right, which should expand w1 and push w2.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 500x300", window_->bounds().ToString());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,200 100x200", window2_->bounds().ToString());
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Push off the screen, w2 should be resized to its min.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(20, 20));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 780x300", window_->bounds().ToString());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("780,200 20x200", window2_->bounds().ToString());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move back to 100 and verify w2 gets its original size.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 500x300", window_->bounds().ToString());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,200 100x200", window2_->bounds().ToString());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Revert and make sure everything moves back.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->RevertDrag();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 400x300", window_->bounds().ToString());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,200 100x200", window2_->bounds().ToString());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around collapsing and expanding.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_Compress) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(   0, 300, 400, 300));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(400, 200, 100, 200));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 to the left, which should expand w2 and collapse w1.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -100, 10), 0);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 300x300", window_->bounds().ToString());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,200 200x200", window2_->bounds().ToString());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Collapse all the way to w1's min.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_.set_min_size(gfx::Size(20, 20));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -800, 20), 0);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 20x300", window_->bounds().ToString());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("20,200 480x200", window2_->bounds().ToString());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move 100 to the left.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 500x300", window_->bounds().ToString());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,200 100x200", window2_->bounds().ToString());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Back to -100.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -100, 20), 0);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,300 300x300", window_->bounds().ToString());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,200 200x200", window2_->bounds().ToString());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the right with 3
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_3) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 300, 200, 300));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(300, 300, 150, 200));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window3_->SetBounds(gfx::Rect(450, 300, 100, 200));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(52, 50));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate3_.set_min_size(gfx::Size(38, 50));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window3_.get());
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 to the right, which should expand w1 and push w2 and w3.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 300x300", window_->bounds().ToString());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,300 150x200", window2_->bounds().ToString());
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("550,300 100x200", window3_->bounds().ToString());
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 300, things should compress.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 300, -10), 0);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 500x300", window_->bounds().ToString());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("600,300 120x200", window2_->bounds().ToString());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("720,300 80x200", window3_->bounds().ToString());
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it so much the last two end up at their min.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800, 50), 0);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 610x300", window_->bounds().ToString());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("710,300 52x200", window2_->bounds().ToString());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("762,300 38x200", window3_->bounds().ToString());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Revert and make sure everything moves back.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->RevertDrag();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 200x300", window_->bounds().ToString());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,300 150x200", window2_->bounds().ToString());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("450,300 100x200", window3_->bounds().ToString());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resizing (collapsing and expanding) with
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3 windows.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_3_Compress) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 300, 200, 300));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(300, 300, 200, 200));
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window3_->SetBounds(gfx::Rect(450, 300, 100, 200));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(52, 50));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate3_.set_min_size(gfx::Size(38, 50));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window3_.get());
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it -100 to the right, which should collapse w1 and expand w2 and w3.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -100, -10), 0);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 100x300", window_->bounds().ToString());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200,300 266x200", window2_->bounds().ToString());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("466,300 134x200", window3_->bounds().ToString());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 to the right.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 300x300", window_->bounds().ToString());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,300 200x200", window2_->bounds().ToString());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("600,300 100x200", window3_->bounds().ToString());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 100 to the left again.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -100, -10), 0);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,300 100x300", window_->bounds().ToString());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200,300 266x200", window2_->bounds().ToString());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("466,300 134x200", window3_->bounds().ToString());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around collapsing and expanding from the bottom.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_Compress) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(   0, 100, 400, 300));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(400, 400, 100, 200));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM,
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it up 100, which should expand w2 and collapse w1.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, -100), 0);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,100 400x200", window_->bounds().ToString());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,300 100x300", window2_->bounds().ToString());
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Collapse all the way to w1's min.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_.set_min_size(gfx::Size(20, 20));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 20, -800), 0);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,100 400x20", window_->bounds().ToString());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,120 100x480", window2_->bounds().ToString());
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move 100 down.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,100 400x400", window_->bounds().ToString());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,500 100x100", window2_->bounds().ToString());
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Back to -100.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 20, -100), 0);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,100 400x200", window_->bounds().ToString());
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,300 100x300", window2_->bounds().ToString());
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the bottom with 2
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_2) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect( 0,  50, 400, 200));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(0, 250, 200, 100));
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM,
3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 to the bottom, which should expand w1 and push w2.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,50 400x300", window_->bounds().ToString());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,350 200x100", window2_->bounds().ToString());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Push off the screen, w2 should be resized to its min.
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(20, 20));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 50, 820), 0);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,50 400x530", window_->bounds().ToString());
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,580 200x20", window2_->bounds().ToString());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move back to 100 and verify w2 gets its original size.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,50 400x300", window_->bounds().ToString());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,350 200x100", window2_->bounds().ToString());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Revert and make sure everything moves back.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->RevertDrag();
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,50 400x200", window_->bounds().ToString());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,250 200x100", window2_->bounds().ToString());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AttachedResize_BOTTOM_3 DISABLED_AttachedResize_BOTTOM_3
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AttachedResize_BOTTOM_3 AttachedResize_BOTTOM_3
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Assertions around attached window resize dragging from the bottom with 3
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// windows.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_AttachedResize_BOTTOM_3) {
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
4341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect( 300, 100, 300, 200));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(300, 300, 200, 150));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 450, 200, 100));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(50, 52));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate3_.set_min_size(gfx::Size(50, 38));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window3_.get());
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM,
4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 100 down, which should expand w1 and push w2 and w3.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -10, 100), 0);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,100 300x300", window_->bounds().ToString());
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,400 200x150", window2_->bounds().ToString());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,550 200x100", window3_->bounds().ToString());
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 296 things should compress.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -10, 296), 0);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,100 300x496", window_->bounds().ToString());
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("300,596 200x123", window2_->bounds().ToString());
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("300,719 200x81", window3_->bounds().ToString());
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it so much everything ends up at its min.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 50, 798), 0);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,100 300x610", window_->bounds().ToString());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,710 200x52", window2_->bounds().ToString());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,762 200x38", window3_->bounds().ToString());
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Revert and make sure everything moves back.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->RevertDrag();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,100 300x200", window_->bounds().ToString());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,300 200x150", window2_->bounds().ToString());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,450 200x100", window3_->bounds().ToString());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resizing (collapsing and expanding) with
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3 windows.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_3_Compress) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(  0,   0, 200, 200));
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(10, 200, 200, 200));
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window3_->SetBounds(gfx::Rect(20, 400, 100, 100));
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate2_.set_min_size(gfx::Size(52, 50));
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate3_.set_min_size(gfx::Size(38, 50));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window2_.get());
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windows.push_back(window3_.get());
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM,
4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 up, which should collapse w1 and expand w2 and w3.
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -10, -100), 0);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x100", window_->bounds().ToString());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,100 200x266", window2_->bounds().ToString());
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("20,366 100x134", window3_->bounds().ToString());
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move it 100 down.
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x300", window_->bounds().ToString());
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,300 200x200", window2_->bounds().ToString());
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("20,500 100x100", window3_->bounds().ToString());
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 100 up again.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -10, -100), 0);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x100", window_->bounds().ToString());
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,100 200x266", window2_->bounds().ToString());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("20,366 100x134", window3_->bounds().ToString());
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that touch-dragging a window does not lock the mouse cursor
511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and therefore shows the cursor on a mousemove.
512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MouseMoveWithTouchDrag) {
513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 300, 400, 300));
514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(400, 200, 100, 200));
515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Shell* shell = Shell::GetInstance();
517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::test::EventGenerator generator(window_->GetRootWindow());
518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The cursor should not be locked initially.
520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(shell->cursor_manager()->IsCursorLocked());
521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<aura::Window*> windows;
523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  windows.push_back(window2_.get());
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_TOUCH, windows));
527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Creating a WorkspaceWindowResizer should not lock the cursor.
530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(shell->cursor_manager()->IsCursorLocked());
531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The cursor should be hidden after touching the screen and
533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // starting a drag.
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(shell->cursor_manager()->IsCursorVisible());
535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  generator.PressTouch();
536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0);
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(shell->cursor_manager()->IsCursorVisible());
538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(shell->cursor_manager()->IsCursorLocked());
539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Moving the mouse should show the cursor.
541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  generator.MoveMouseBy(1, 1);
542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(shell->cursor_manager()->IsCursorVisible());
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(shell->cursor_manager()->IsCursorLocked());
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  resizer->RevertDrag();
546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around dragging to the left/right edge of the screen.
5497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, Edge) {
550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!SupportsHostWindowResize())
551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Resize host window to force insets update.
554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UpdateDisplay("800x700");
555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // TODO(varkha): Insets are reset after every drag because of
556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // http://crbug.com/292238.
557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Window is wide enough not to get docked right away.
558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_->SetBounds(gfx::Rect(20, 30, 400, 60));
55968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(window_.get());
56068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect expected_bounds_in_parent(
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        wm::GetDefaultLeftSnappedWindowBoundsInParent(window_.get()));
564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 10), 0);
5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(expected_bounds_in_parent.ToString(),
572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              window_->bounds().ToString());
57368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_TRUE(window_state->HasRestoreBounds());
574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("20,30 400x60",
57568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              window_state->GetRestoreBoundsInScreen().ToString());
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try the same with the right side.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect expected_bounds_in_parent(
580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        wm::GetDefaultRightSnappedWindowBoundsInParent(window_.get()));
581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 800, 10), 0);
5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(expected_bounds_in_parent.ToString(),
588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              window_->bounds().ToString());
58968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_TRUE(window_state->HasRestoreBounds());
590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("20,30 400x60",
59168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              window_state->GetRestoreBoundsInScreen().ToString());
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test if the restore bounds is correct in multiple displays.
5957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
5977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Restore the window to clear snapped state.
599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window_state->Restore();
600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  UpdateDisplay("800x600,500x600");
602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], window_->GetRootWindow());
604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Window is wide enough not to get docked right away.
605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_->SetBoundsInScreen(gfx::Rect(800, 10, 400, 60),
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             ScreenUtil::GetSecondaryDisplay());
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], window_->GetRootWindow());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("800,10 400x60", window_->GetBoundsInScreen().ToString());
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 499, 0), 0);
615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int bottom =
6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_.get()).bottom();
6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // With the resolution of 500x600 we will hit in this case the 50% screen
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // size setting.
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // TODO(varkha): Insets are updated because of http://crbug.com/292238
621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("250,0 250x" + base::IntToString(bottom),
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_->bounds().ToString());
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("800,10 400x60",
62468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              window_state->GetRestoreBoundsInScreen().ToString());
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that non resizable windows will not get resized.
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, NonResizableWindows) {
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect(20, 30, 50, 60));
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetProperty(aura::client::kCanResizeKey, false);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -20, 0), 0);
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->CompleteDrag();
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,30 50x60", window_->bounds().ToString());
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CancelSnapPhantom) {
6427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
6437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("800x600,800x600");
646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, root_windows.size());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBoundsInScreen(gfx::Rect(0, 0, 50, 60),
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Shell::GetScreen()->GetPrimaryDisplay());
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], window_->GetRootWindow());
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FLOAT_EQ(1.0f, window_->layer()->opacity());
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(snap_phantom_window_controller());
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The pointer is on the edge but not shared. The snap phantom window
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // controller should be non-NULL.
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 799, 0), 0);
662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(snap_phantom_window_controller());
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Move the cursor across the edge. Now the snap phantom window controller
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // should be canceled.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 800, 0), 0);
667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(snap_phantom_window_controller());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies that dragging a snapped window unsnaps it.
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DragSnapped) {
673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wm::WindowState* window_state = ash::wm::GetWindowState(window_.get());
6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Rect kInitialBounds(100, 100, 100, 100);
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetBounds(kInitialBounds);
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Show();
678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const wm::WMEvent snap_event(wm::WM_EVENT_SNAP_LEFT);
679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_state->OnWMEvent(&snap_event);
680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType());
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect snapped_bounds = window_->bounds();
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(snapped_bounds.ToString(), kInitialBounds.ToString());
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(),
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            kInitialBounds.ToString());
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Dragging a side snapped window should unsnap it.
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 0), 0);
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->CompleteDrag();
691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(wm::WINDOW_STATE_TYPE_NORMAL, window_state->GetStateType());
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("10,0 100x100", window_->bounds().ToString());
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(window_state->HasRestoreBounds());
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies the behavior of resizing a side snapped window.
6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeSnapped) {
698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wm::WindowState* window_state = ash::wm::GetWindowState(window_.get());
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Rect kInitialBounds(100, 100, 100, 100);
7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetBounds(kInitialBounds);
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Show();
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
704a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const wm::WMEvent snap_event(wm::WM_EVENT_SNAP_LEFT);
705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_state->OnWMEvent(&snap_event);
706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType());
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect snapped_bounds = window_->bounds();
7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(snapped_bounds.ToString(), kInitialBounds.ToString());
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(),
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            kInitialBounds.ToString());
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // 1) Resizing a side snapped window to make it wider should not unsnap the
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // window.
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window_.get(), gfx::Point(), HTRIGHT));
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 10, 0), 0);
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
719a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType());
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    snapped_bounds.Inset(0, 0, -10, 0);
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(snapped_bounds.ToString(), window_->bounds().ToString());
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(),
7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              kInitialBounds.ToString());
7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // 2) Resizing a side snapped window vertically and then undoing the change
7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // should not unsnap.
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOM));
7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, -30), 0);
7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType());
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(snapped_bounds.ToString(), window_->bounds().ToString());
7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(),
7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              kInitialBounds.ToString());
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // 3) Resizing a side snapped window vertically and then not undoing the
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // change should unsnap.
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOM));
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, -10), 0);
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(wm::WINDOW_STATE_TYPE_NORMAL, window_state->GetStateType());
7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gfx::Rect expected_bounds(snapped_bounds);
7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_bounds.Inset(0, 0, 0, 10);
7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(expected_bounds.ToString(), window_->bounds().ToString());
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(window_state->HasRestoreBounds());
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies windows are correctly restacked when reordering multiple windows.
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestackAttached) {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(   0, 0, 200, 300));
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 0, 100, 200));
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 0, 100, 100));
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<aura::Window*> windows;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    windows.push_back(window2_.get());
7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
7657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        window_.get(), gfx::Point(), HTRIGHT,
7667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the right, which should expand w1 and push w2 and w3.
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 should be topmost since it's initially the highest in the stack.
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("2 1 3", WindowOrderAsString(window_->parent()));
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<aura::Window*> windows;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    windows.push_back(window3_.get());
7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
7797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        window2_.get(), gfx::Point(), HTRIGHT,
7807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the right, which should expand w1 and push w2 and w3.
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0);
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 should be topmost since it's initially the highest in the stack.
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("2 3 1", WindowOrderAsString(window_->parent()));
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging below the work area.
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffBottom) {
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0));
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, Shell::GetScreen()->GetNumDisplays());
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 300, 400));
798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600), 0);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_y =
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10;
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400",
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            window_->bounds().ToString());
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging on the work area with multidisplay.
8097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffBottomWithMultiDisplay) {
8107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
8127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("800x600,800x600");
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0));
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Positions the secondary display at the bottom the primary display.
8208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays(
821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ash::DisplayLayout(ash::DisplayLayout::BOTTOM, 0));
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    window_->SetBounds(gfx::Rect(100, 200, 300, 20));
8254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DCHECK_LT(window_->bounds().height(),
8264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              WorkspaceWindowResizer::kMinOnscreenHeight);
827a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Drag down avoiding dragging along the edge as that would side-snap.
828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
829a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        window_.get(), gfx::Point(10, 0), HTCAPTION));
8304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(resizer.get());
8314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 400), 0);
8324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int expected_y = kRootHeight - window_->bounds().height() - 10;
8334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // When the mouse cursor is in the primary display, the window cannot move
8344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // on non-work area but can get all the way towards the bottom,
8354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // restricted only by the window height.
8364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x20",
8374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              window_->bounds().ToString());
838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Revert the drag in order to not remember the restore bounds.
839f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->RevertDrag();
8404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
8414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
842f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0));
8444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  {
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SetBounds(gfx::Rect(100, 200, 300, 400));
846f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        window_.get(), gfx::Point(10, 0), HTCAPTION));
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Drag down avoiding dragging along the edge as that would side-snap.
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 400), 0);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_y =
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When the mouse cursor is in the primary display, the window cannot move
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // on non-work area with kMinOnscreenHeight margin.
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400",
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_->bounds().ToString());
8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SetBounds(gfx::Rect(100, 200, 300, 400));
862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), window_->bounds().origin(), HTCAPTION));
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
865f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Drag down avoiding getting stuck against the shelf on the bottom screen.
866f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 500), 0);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The window can move to the secondary display beyond non-work area of
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the primary display.
869f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("100,700 300x400", window_->bounds().ToString());
8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging off the top of the work area.
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffTop) {
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(10, 0, 0, 0));
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 300, 400));
880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -600), 0);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,10 300x400", window_->bounds().ToString());
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeBottomOutsideWorkArea) {
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 300, 380));
892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTTOP));
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 8, 0), 0);
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,200 300x380", window_->bounds().ToString());
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideLeftWorkArea) {
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int left = ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_.get()).x();
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pixels_to_left_border = 50;
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_width = 300;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_x = left - window_width + pixels_to_left_border;
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(pixels_to_left_border, 0), HTRIGHT));
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -window_width, 0), 0);
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(window_x) + ",100 " +
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(kMinimumOnScreenArea - window_x) +
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideRightWorkArea) {
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int right = ScreenUtil::GetDisplayWorkAreaBoundsInParent(
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get()).right();
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pixels_to_right_border = 50;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_width = 300;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_x = right - pixels_to_right_border;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
925f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(window_x, 0), HTLEFT));
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0);
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) +
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ",100 " +
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(window_width - pixels_to_right_border +
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              kMinimumOnScreenArea) +
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideBottomWorkArea) {
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int bottom = ScreenUtil::GetDisplayWorkAreaBoundsInParent(
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get()).bottom();
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int delta_to_bottom = 50;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int height = 380;
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, bottom - delta_to_bottom, 300, height));
944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(0, bottom - delta_to_bottom), HTTOP));
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, bottom), 0);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100," +
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(bottom - kMinimumOnScreenArea) +
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " 300x" +
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(height - (delta_to_bottom -
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        kMinimumOnScreenArea)),
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            window_->bounds().ToString());
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that 'outside' check of the resizer take into account the extended
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// desktop in case of repositions.
9587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DragWindowOutsideRightToSecondaryDisplay) {
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only primary display.  Changes the window position to fit within the
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // display.
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int right = ScreenUtil::GetDisplayWorkAreaBoundsInParent(
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get()).right();
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pixels_to_right_border = 50;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_width = 300;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_x = right - pixels_to_right_border;
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
969f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(window_x, 0), HTCAPTION));
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) +
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ",100 " +
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(window_width) +
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
9797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
9807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // With secondary display.  Operation itself is same but doesn't change
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the position because the window is still within the secondary display.
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0);
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(window_x + window_width) +
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ",100 " +
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(window_width) +
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies snapping to edges works.
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToEdge) {
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(96, 112, 320, 160));
9993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Click 50px to the right so that the mouse pointer does not leave the
10003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // workspace ensuring sticky behavior.
1001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
10023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      window_.get(),
10033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      window_->bounds().origin() + gfx::Vector2d(50, 0),
1004f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      HTCAPTION));
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move to an x-coordinate of 15, which should not snap.
1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 15 - 96, 0), 0);
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An x-coordinate of 7 should snap.
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 7 - 96, 0), 0);
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,112 320x160", window_->bounds().ToString());
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move to -15, should still snap to 0.
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -15 - 96, 0), 0);
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,112 320x160", window_->bounds().ToString());
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // At -32 should move past snap points.
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -32 - 96, 0), 0);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-32,112 320x160", window_->bounds().ToString());
1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -33 - 96, 0), 0);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-33,112 320x160", window_->bounds().ToString());
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Right side should similarly snap.
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 15, 0), 0);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("465,112 320x160", window_->bounds().ToString());
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 7, 0), 0);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("480,112 320x160", window_->bounds().ToString());
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 15, 0), 0);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("480,112 320x160", window_->bounds().ToString());
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 32, 0), 0);
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("512,112 320x160", window_->bounds().ToString());
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 33, 0), 0);
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("513,112 320x160", window_->bounds().ToString());
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the bottom should snap too.
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 - 7), 0);
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,437 320x160", window_->bounds().ToString());
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 + 15), 0);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,437 320x160", window_->bounds().ToString());
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 32), 0);
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,470 320x160", window_->bounds().ToString());
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 33), 0);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,471 320x160", window_->bounds().ToString());
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the top should snap too.
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 20), 0);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,20 320x160", window_->bounds().ToString());
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 7), 0);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,0 320x160", window_->bounds().ToString());
10471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // And bottom/left should snap too.
10491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  resizer->Drag(
10501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CalculateDragPoint(*resizer, 7 - 96, 600 - 160 - 112 - 3 - 7), 0);
10511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("0,437 320x160", window_->bounds().ToString());
10521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  resizer->Drag(
10531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CalculateDragPoint(*resizer, -15 - 96, 600 - 160 - 112 - 3 + 15), 0);
10541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("0,437 320x160", window_->bounds().ToString());
10551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // should move past snap points.
10561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  resizer->Drag(
10571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CalculateDragPoint(*resizer, -32 - 96, 600 - 160 - 112 - 2 + 32), 0);
10581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("-32,470 320x160", window_->bounds().ToString());
10591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  resizer->Drag(
10601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CalculateDragPoint(*resizer, -33 - 96, 600 - 160 - 112 - 2 + 33), 0);
10611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("-33,471 320x160", window_->bounds().ToString());
10621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No need to test dragging < 0 as we force that to 0.
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPLEFT.
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPLEFT) {
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
1069f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1070f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTTOPLEFT));
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -98, -199), 0);
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 120x230", window_->bounds().ToString());
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPRIGHT.
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPRIGHT) {
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent(
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          window_.get()));
1081f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1082f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTTOPRIGHT));
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CalculateDragPoint(*resizer, work_area.right() - 120 - 1, -199), 0);
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, window_->bounds().x());
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.y(), window_->bounds().y());
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.right() - 100, window_->bounds().width());
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(230, window_->bounds().height());
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMRIGHT.
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMRIGHT) {
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
10955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent(
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          window_.get()));
1097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT));
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CalculateDragPoint(*resizer, work_area.right() - 120 - 1,
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         work_area.bottom() - 220 - 2), 0);
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, window_->bounds().x());
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, window_->bounds().y());
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.right() - 100, window_->bounds().width());
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height());
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMLEFT.
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMLEFT) {
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
11125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent(
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          window_.get()));
1114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMLEFT));
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CalculateDragPoint(*resizer, -98, work_area.bottom() - 220 - 2), 0);
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, window_->bounds().x());
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, window_->bounds().y());
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(120, window_->bounds().width());
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height());
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies window sticks to both window and work area.
11265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, StickToBothEdgeAndWindow) {
11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetBounds(gfx::Rect(10, 10, 20, 50));
11285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Show();
11295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(150, 160, 25, 1000));
11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window2_->Show();
11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
11335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      window_.get(), gfx::Point(10, 10), HTCAPTION));
11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Move |window| one pixel to the left of |window2|. Should snap to right.
11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, 145), 0);
11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect expected(130, 160, 20, 50);
11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent(
11425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          window_.get()));
11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The initial y position of |window_|.
11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int initial_y = 10;
11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The drag position where the window is exactly attached to the bottom.
11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int attach_y = work_area.bottom() - window_->bounds().height() - initial_y;
11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Dragging 10px above should not attach to the bottom.
11505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y - 10), 0);
11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected.set_y(attach_y + initial_y - 10);
11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Stick to the work area.
11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y - 1), 0);
11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected.set_y(attach_y + initial_y);
11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y), 0);
11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected.set_y(attach_y + initial_y);
11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y + 1), 0);
11645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected.set_y(attach_y + initial_y);
11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Moving down further should move the window.
11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y + 18), 0);
11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected.set_y(attach_y + initial_y + 18);
11705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
11725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CtrlDragResizeToExactPosition) {
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(96, 112, 320, 160));
1175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT));
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resize the right bottom to add 10 in width, 12 in height.
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 12), ui::EF_CONTROL_DOWN);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both bottom and right sides to resize to exact size requested.
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,112 330x172", window_->bounds().ToString());
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size.
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestoreToPreMaximizeCoordinates) {
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 0, 1000, 1000));
118768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(window_.get());
118868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  window_state->SetRestoreBoundsInScreen(gfx::Rect(96, 112, 320, 160));
1189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag the window to new position by adding (10, 10) to original point,
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the window should get restored.
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 10), 0);
11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->CompleteDrag();
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,10 320x160", window_->bounds().ToString());
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The restore rectangle should get cleared as well.
119868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->HasRestoreBounds());
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size.
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RevertResizeOperation) {
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect initial_bounds(0, 0, 200, 400);
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(initial_bounds);
120568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
120668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(window_.get());
120768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  window_state->SetRestoreBoundsInScreen(gfx::Rect(96, 112, 320, 160));
1208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag the window to new poistion by adding (180, 16) to original point,
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the window should get restored.
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 180, 16), 0);
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->RevertDrag();
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(initial_bounds.ToString(), window_->bounds().ToString());
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,112 320x160",
121768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            window_state->GetRestoreBoundsInScreen().ToString());
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that only usable sizes get returned by the resizer.
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyAttach) {
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(10, 10, 20, 30));
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(150, 160, 25, 20));
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel to the left of |window2|. Should snap to right and
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // top.
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, 145), 0);
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("130,160 20x30", window_->bounds().ToString());
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel to the right of |window2|. Should snap to left and
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // top.
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 164, 145), 0);
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("175,160 20x30", window_->bounds().ToString());
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel above |window2|. Should snap to top and left.
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 142, 119), 0);
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("150,130 20x30", window_->bounds().ToString());
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel above the bottom of |window2|. Should snap to
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bottom and left.
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 142, 169), 0);
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("150,180 20x30", window_->bounds().ToString());
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following variants verify magnetic snapping during resize when dragging a
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular edge.
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOP) {
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(99, 179, 10, 20));
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTTOP));
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,199 20x31", window_->bounds().ToString());
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPLEFT) {
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(99, 179, 10, 20));
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTTOPLEFT));
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("99,199 21x31", window_->bounds().ToString());
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(88, 201, 10, 20));
1279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTTOPLEFT));
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("98,201 22x29", window_->bounds().ToString());
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPRIGHT) {
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(111, 179, 10, 20));
1294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTTOPRIGHT));
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,199 21x31", window_->bounds().ToString());
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(121, 199, 10, 20));
1304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTTOPRIGHT));
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,199 21x31", window_->bounds().ToString());
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_RIGHT) {
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(121, 199, 10, 20));
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT));
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,200 21x30", window_->bounds().ToString());
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMRIGHT) {
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(122, 212, 10, 20));
1331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMRIGHT));
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,200 22x32", window_->bounds().ToString());
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(111, 233, 10, 20));
1341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMRIGHT));
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,200 21x33", window_->bounds().ToString());
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOM) {
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(111, 233, 10, 20));
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM));
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,200 20x33", window_->bounds().ToString());
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMLEFT) {
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(99, 231, 10, 20));
1368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMLEFT));
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("99,200 21x31", window_->bounds().ToString());
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(89, 209, 10, 20));
1378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMLEFT));
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("99,200 21x29", window_->bounds().ToString());
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_LEFT) {
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(89, 209, 10, 20));
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTLEFT));
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("99,200 21x30", window_->bounds().ToString());
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the user user moved window flag is getting properly set.
1400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CheckUserWindowManagedFlags) {
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect( 0,  50, 400, 200));
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> no_attached_windows;
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that an abort doesn't change anything.
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the bottom.
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0);
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("0,150 400x200", window_->bounds().ToString());
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_FALSE(wm::GetWindowState(window_.get())->bounds_changed_by_user());
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that a completed move / size does change the user coordinates.
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the bottom.
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0);
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("0,150 400x200", window_->bounds().ToString());
14255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
142668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_TRUE(wm::GetWindowState(window_.get())->bounds_changed_by_user());
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size doesn't exceed it when dragged.
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestMaxSizeEnforced) {
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 0, 400, 300));
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_max_size(gfx::Size(401, 301));
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT));
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0);
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(401, window_->bounds().width());
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(301, window_->bounds().height());
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max width doesn't restrict its height.
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestPartialMaxSizeEnforced) {
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 0, 400, 300));
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_max_size(gfx::Size(401, 0));
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT));
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0);
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(401, window_->bounds().width());
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(302, window_->bounds().height());
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size can't be snapped.
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, PhantomSnapMaxSize) {
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // With max size not set we get a phantom window controller for dragging off
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the right hand side.
1459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Make the window wider than maximum docked width.
1460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    window_->SetBounds(gfx::Rect(0, 0, 400, 200));
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
1464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(snap_phantom_window_controller());
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0);
1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(snap_phantom_window_controller());
1467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->RevertDrag();
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // With max size defined, we get no phantom window for snapping but we still
1471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // get a phantom window (docking guide).
1472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    window_->SetBounds(gfx::Rect(0, 0, 400, 200));
1473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delegate_.set_max_size(gfx::Size(400, 200));
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0);
1478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(snap_phantom_window_controller());
1479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->RevertDrag();
1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
1482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // With max size defined, we get no phantom window for snapping.
1483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    window_->SetBounds(gfx::Rect(0, 0, 400, 200));
1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delegate_.set_max_size(gfx::Size(400, 200));
1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // With min size defined, we get no phantom window for docking.
1486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delegate_.set_min_size(gfx::Size(400, 200));
1487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0);
1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(snap_phantom_window_controller());
1492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->RevertDrag();
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontRewardRightmostWindowForOverflows) {
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
14981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(400, 100, 100, 100));
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(101, 0));
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
15125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
15137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
15147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 51 to the left, which should contract w1 and expand w2-4.
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // w2 will hit its max size straight away, and in doing so will leave extra
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // pixels that a naive implementation may award to the rightmost window. A
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // fair implementation will give 25 pixels to each of the other windows.
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0);
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 49x100", window_->bounds().ToString());
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("149,100 101x100", window2_->bounds().ToString());
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("250,100 125x100", window3_->bounds().ToString());
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("375,100 125x100", window4_->bounds().ToString());
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxWidth) {
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
15291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(400, 100, 100, 100));
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(101, 0));
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(101, 0));
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
15445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
15457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
15467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 to the left, which should contract w1 and expand w2-4.
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0);
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 48x100", window_->bounds().ToString());
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("148,100 101x100", window2_->bounds().ToString());
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("249,100 101x100", window3_->bounds().ToString());
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("350,100 150x100", window4_->bounds().ToString());
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxHeight) {
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
15581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(100, 200, 100, 100));
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(100, 300, 100, 100));
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(100, 400, 100, 100));
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(0, 101));
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(0, 101));
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
15735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
15747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM,
15757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 up, which should contract w1 and expand w2-4.
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -52), 0);
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 100x48", window_->bounds().ToString());
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,148 100x101", window2_->bounds().ToString());
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,249 100x101", window3_->bounds().ToString());
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,350 100x150", window4_->bounds().ToString());
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DISABLED_DontExceedMinHeight
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DontExceedMinHeight
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_DontExceedMinHeight) {
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x500");
15941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(100, 200, 100, 100));
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(100, 300, 100, 100));
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(100, 400, 100, 100));
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_min_size(gfx::Size(0, 99));
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_min_size(gfx::Size(0, 99));
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
16095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
16107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM,
16117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 down, which should expand w1 and contract w2-4.
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 52), 0);
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 100x152", window_->bounds().ToString());
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,252 100x99", window2_->bounds().ToString());
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,351 100x99", window3_->bounds().ToString());
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,450 100x50", window4_->bounds().ToString());
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExpandRightmostPastMaxWidth) {
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
16231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(101, 0));
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
16365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
16377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
16387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 51 to the left, which should contract w1 and expand w2-3.
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0);
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 49x100", window_->bounds().ToString());
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("149,100 150x100", window2_->bounds().ToString());
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("299,100 101x100", window3_->bounds().ToString());
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MoveAttachedWhenGrownToMaxSize) {
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
16491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(101, 0));
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(101, 0));
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
16635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
16647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
16657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 to the left, which should contract w1 and expand and move w2-3.
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0);
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 48x100", window_->bounds().ToString());
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("148,100 101x100", window2_->bounds().ToString());
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("249,100 101x100", window3_->bounds().ToString());
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth DISABLED_MainWindowHonoursMaxWidth
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth MainWindowHonoursMaxWidth
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_MainWindowHonoursMaxWidth) {
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("400x800");
16831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_max_size(gfx::Size(102, 0));
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
16965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
16977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
16987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 50 to the right, which should expand w1 and contract w2-3, as they
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // won't fit in the root window in their original sizes.
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 50, 0), 0);
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 102x100", window_->bounds().ToString());
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("202,100 99x100", window2_->bounds().ToString());
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("301,100 99x100", window3_->bounds().ToString());
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MainWindowHonoursMinWidth) {
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("400x800");
17101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_min_size(gfx::Size(98, 0));
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
17225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
17237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
17247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 50 to the left, which should contract w1 and expand w2-3.
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -50, 0), 0);
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 98x100", window_->bounds().ToString());
17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("198,100 101x100", window2_->bounds().ToString());
17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("299,100 101x100", window3_->bounds().ToString());
17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// The following variants test that windows are resized correctly to the edges
17347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// of the screen using touch, when touch point is off of the window border.
17357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_RIGHT) {
17367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
17377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTRIGHT);
17397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(),
17407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
17437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       touch_resize_window_.get());
17447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag out of the right border a bit and check if the border is aligned with
17467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the touch point.
17477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(715, kRootHeight / 2),
17487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(725, kRootHeight / 2),
174958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
175058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
17517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 625, kRootHeight - 200).ToString(),
17527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag more, but stop before being snapped to the edge.
17547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(725, kRootHeight / 2),
17557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(760, kRootHeight / 2),
175658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
175758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
17587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 660, kRootHeight - 200).ToString(),
17597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag even more to snap to the edge.
17617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(760, kRootHeight / 2),
17627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(775, kRootHeight / 2),
176358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
176458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
17657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 700, kRootHeight - 200).ToString(),
17667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
17687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_LEFT) {
17707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
17717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTLEFT);
17737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(),
17747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
17777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       touch_resize_window_.get());
17787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag out of the left border a bit and check if the border is aligned with
17807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the touch point.
17817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(85, kRootHeight / 2),
17827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(75, kRootHeight / 2),
178358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
178458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
17857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(75, 100, 625, kRootHeight - 200).ToString(),
17867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag more, but stop before being snapped to the edge.
17887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(75, kRootHeight / 2),
17897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(40, kRootHeight / 2),
179058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
179158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
17927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(40, 100, 660, kRootHeight - 200).ToString(),
17937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag even more to snap to the edge.
17957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(40, kRootHeight / 2),
17967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(25, kRootHeight / 2),
179758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
179858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
17997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 100, 700, kRootHeight - 200).ToString(),
18007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
18027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_TOP) {
18047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
18057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTTOP);
18077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(),
18087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
18117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       touch_resize_window_.get());
18127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag out of the top border a bit and check if the border is aligned with
18147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the touch point.
18157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, 85),
18167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, 75),
181758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
181858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 75, 600, kRootHeight - 175).ToString(),
18207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag more, but stop before being snapped to the edge.
18227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, 75),
18237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, 40),
182458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
182558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 40, 600, kRootHeight - 140).ToString(),
18277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag even more to snap to the edge.
18297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, 40),
18307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, 25),
183158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
183258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 0, 600, kRootHeight - 100).ToString(),
18347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
18367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_BOTTOM) {
18387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
18397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTBOTTOM);
18417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(),
18427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
18457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       touch_resize_window_.get());
18467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag out of the bottom border a bit and check if the border is aligned with
18487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the touch point.
18497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 85),
18507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, kRootHeight - 75),
185158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
185258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 175).ToString(),
18547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag more, but stop before being snapped to the edge.
18567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 75),
18577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, kRootHeight - 40),
185858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
185958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 140).ToString(),
18617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag even more to snap to the edge.
18637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 40),
18647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, kRootHeight - 25),
186558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
186658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 100).ToString(),
18687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
18703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1872