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"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/events/gestures/gesture_configuration.h"
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.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();
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    workspace_resizer_ = WorkspaceWindowResizer::GetInstanceForTest();
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();
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::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));
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  window_->SetProperty(aura::client::kCanMaximizeKey, true);
56068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(window_.get());
56168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect expected_bounds_in_parent(
564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        wm::GetDefaultLeftSnappedWindowBoundsInParent(window_.get()));
565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 10), 0);
5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(expected_bounds_in_parent.ToString(),
573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              window_->bounds().ToString());
57468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_TRUE(window_state->HasRestoreBounds());
575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("20,30 400x60",
57668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              window_state->GetRestoreBoundsInScreen().ToString());
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try the same with the right side.
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect expected_bounds_in_parent(
581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        wm::GetDefaultRightSnappedWindowBoundsInParent(window_.get()));
582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 800, 10), 0);
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(expected_bounds_in_parent.ToString(),
589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              window_->bounds().ToString());
59068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_TRUE(window_state->HasRestoreBounds());
591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("20,30 400x60",
59268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              window_state->GetRestoreBoundsInScreen().ToString());
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test if the restore bounds is correct in multiple displays.
5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
5977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
5987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Restore the window to clear snapped state.
600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window_state->Restore();
601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  UpdateDisplay("800x600,500x600");
603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], window_->GetRootWindow());
605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Window is wide enough not to get docked right away.
606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_->SetBoundsInScreen(gfx::Rect(800, 10, 400, 60),
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             ScreenUtil::GetSecondaryDisplay());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], window_->GetRootWindow());
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("800,10 400x60", window_->GetBoundsInScreen().ToString());
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 499, 0), 0);
616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int bottom =
6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_.get()).bottom();
6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // With the resolution of 500x600 we will hit in this case the 50% screen
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // size setting.
621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // TODO(varkha): Insets are updated because of http://crbug.com/292238
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("250,0 250x" + base::IntToString(bottom),
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_->bounds().ToString());
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("800,10 400x60",
62568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              window_state->GetRestoreBoundsInScreen().ToString());
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that non resizable windows will not get resized.
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, NonResizableWindows) {
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect(20, 30, 50, 60));
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetProperty(aura::client::kCanResizeKey, false);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -20, 0), 0);
6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->CompleteDrag();
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,30 50x60", window_->bounds().ToString());
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CancelSnapPhantom) {
6437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
6447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("800x600,800x600");
647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, root_windows.size());
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBoundsInScreen(gfx::Rect(0, 0, 50, 60),
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Shell::GetScreen()->GetPrimaryDisplay());
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], window_->GetRootWindow());
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FLOAT_EQ(1.0f, window_->layer()->opacity());
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(snap_phantom_window_controller());
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The pointer is on the edge but not shared. The snap phantom window
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // controller should be non-NULL.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 799, 0), 0);
663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(snap_phantom_window_controller());
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Move the cursor across the edge. Now the snap phantom window controller
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // should be canceled.
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 800, 0), 0);
668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(snap_phantom_window_controller());
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies that dragging a snapped window unsnaps it.
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DragSnapped) {
674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wm::WindowState* window_state = ash::wm::GetWindowState(window_.get());
6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Rect kInitialBounds(100, 100, 100, 100);
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetBounds(kInitialBounds);
6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Show();
679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const wm::WMEvent snap_event(wm::WM_EVENT_SNAP_LEFT);
680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_state->OnWMEvent(&snap_event);
681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType());
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect snapped_bounds = window_->bounds();
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(snapped_bounds.ToString(), kInitialBounds.ToString());
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(),
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            kInitialBounds.ToString());
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Dragging a side snapped window should unsnap it.
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 0), 0);
6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->CompleteDrag();
692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(wm::WINDOW_STATE_TYPE_NORMAL, window_state->GetStateType());
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("10,0 100x100", window_->bounds().ToString());
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(window_state->HasRestoreBounds());
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies the behavior of resizing a side snapped window.
6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeSnapped) {
699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wm::WindowState* window_state = ash::wm::GetWindowState(window_.get());
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Rect kInitialBounds(100, 100, 100, 100);
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetBounds(kInitialBounds);
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Show();
7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const wm::WMEvent snap_event(wm::WM_EVENT_SNAP_LEFT);
706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_state->OnWMEvent(&snap_event);
707a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType());
7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect snapped_bounds = window_->bounds();
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(snapped_bounds.ToString(), kInitialBounds.ToString());
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(),
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            kInitialBounds.ToString());
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // 1) Resizing a side snapped window to make it wider should not unsnap the
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // window.
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window_.get(), gfx::Point(), HTRIGHT));
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 10, 0), 0);
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType());
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    snapped_bounds.Inset(0, 0, -10, 0);
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(snapped_bounds.ToString(), window_->bounds().ToString());
7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(),
7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              kInitialBounds.ToString());
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // 2) Resizing a side snapped window vertically and then undoing the change
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // should not unsnap.
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOM));
7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, -30), 0);
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType());
7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(snapped_bounds.ToString(), window_->bounds().ToString());
7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(),
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              kInitialBounds.ToString());
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // 3) Resizing a side snapped window vertically and then not undoing the
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // change should unsnap.
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOM));
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, -10), 0);
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(wm::WINDOW_STATE_TYPE_NORMAL, window_state->GetStateType());
7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gfx::Rect expected_bounds(snapped_bounds);
7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_bounds.Inset(0, 0, 0, 10);
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(expected_bounds.ToString(), window_->bounds().ToString());
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(window_state->HasRestoreBounds());
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies windows are correctly restacked when reordering multiple windows.
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestackAttached) {
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(   0, 0, 200, 300));
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 0, 100, 200));
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 0, 100, 100));
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<aura::Window*> windows;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    windows.push_back(window2_.get());
7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
7667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        window_.get(), gfx::Point(), HTRIGHT,
7677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the right, which should expand w1 and push w2 and w3.
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 should be topmost since it's initially the highest in the stack.
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("2 1 3", WindowOrderAsString(window_->parent()));
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<aura::Window*> windows;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    windows.push_back(window3_.get());
7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
7807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        window2_.get(), gfx::Point(), HTRIGHT,
7817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the right, which should expand w1 and push w2 and w3.
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 should be topmost since it's initially the highest in the stack.
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("2 3 1", WindowOrderAsString(window_->parent()));
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging below the work area.
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffBottom) {
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0));
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, Shell::GetScreen()->GetNumDisplays());
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 300, 400));
799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600), 0);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_y =
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400",
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            window_->bounds().ToString());
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging on the work area with multidisplay.
8107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffBottomWithMultiDisplay) {
8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
8127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
8137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("800x600,800x600");
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0));
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Positions the secondary display at the bottom the primary display.
8218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays(
822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ash::DisplayLayout(ash::DisplayLayout::BOTTOM, 0));
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    window_->SetBounds(gfx::Rect(100, 200, 300, 20));
8264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DCHECK_LT(window_->bounds().height(),
8274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              WorkspaceWindowResizer::kMinOnscreenHeight);
828a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Drag down avoiding dragging along the edge as that would side-snap.
829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
830a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        window_.get(), gfx::Point(10, 0), HTCAPTION));
8314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(resizer.get());
8324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 400), 0);
8334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int expected_y = kRootHeight - window_->bounds().height() - 10;
8344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // When the mouse cursor is in the primary display, the window cannot move
8354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // on non-work area but can get all the way towards the bottom,
8364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // restricted only by the window height.
8374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x20",
8384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              window_->bounds().ToString());
839f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Revert the drag in order to not remember the restore bounds.
840f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->RevertDrag();
8414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
8424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
844f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0));
8454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  {
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SetBounds(gfx::Rect(100, 200, 300, 400));
847f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
848a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        window_.get(), gfx::Point(10, 0), HTCAPTION));
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Drag down avoiding dragging along the edge as that would side-snap.
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 400), 0);
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_y =
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10;
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When the mouse cursor is in the primary display, the window cannot move
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // on non-work area with kMinOnscreenHeight margin.
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400",
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_->bounds().ToString());
8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SetBounds(gfx::Rect(100, 200, 300, 400));
863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), window_->bounds().origin(), HTCAPTION));
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
866f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Drag down avoiding getting stuck against the shelf on the bottom screen.
867f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 500), 0);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The window can move to the secondary display beyond non-work area of
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the primary display.
870f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("100,700 300x400", window_->bounds().ToString());
8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging off the top of the work area.
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffTop) {
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(10, 0, 0, 0));
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 300, 400));
881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -600), 0);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,10 300x400", window_->bounds().ToString());
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeBottomOutsideWorkArea) {
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 300, 380));
893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTTOP));
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 8, 0), 0);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,200 300x380", window_->bounds().ToString());
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideLeftWorkArea) {
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int left = ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_.get()).x();
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pixels_to_left_border = 50;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_width = 300;
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_x = left - window_width + pixels_to_left_border;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(pixels_to_left_border, 0), HTRIGHT));
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -window_width, 0), 0);
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(window_x) + ",100 " +
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(kMinimumOnScreenArea - window_x) +
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideRightWorkArea) {
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int right = ScreenUtil::GetDisplayWorkAreaBoundsInParent(
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get()).right();
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pixels_to_right_border = 50;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_width = 300;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_x = right - pixels_to_right_border;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(window_x, 0), HTLEFT));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0);
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) +
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ",100 " +
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(window_width - pixels_to_right_border +
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              kMinimumOnScreenArea) +
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideBottomWorkArea) {
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int bottom = ScreenUtil::GetDisplayWorkAreaBoundsInParent(
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get()).bottom();
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int delta_to_bottom = 50;
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int height = 380;
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, bottom - delta_to_bottom, 300, height));
945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(0, bottom - delta_to_bottom), HTTOP));
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, bottom), 0);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100," +
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(bottom - kMinimumOnScreenArea) +
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " 300x" +
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(height - (delta_to_bottom -
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        kMinimumOnScreenArea)),
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            window_->bounds().ToString());
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that 'outside' check of the resizer take into account the extended
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// desktop in case of repositions.
9597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DragWindowOutsideRightToSecondaryDisplay) {
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only primary display.  Changes the window position to fit within the
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // display.
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int right = ScreenUtil::GetDisplayWorkAreaBoundsInParent(
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_.get()).right();
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pixels_to_right_border = 50;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_width = 300;
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_x = right - pixels_to_right_border;
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(window_x, 0), HTCAPTION));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0);
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) +
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ",100 " +
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(window_width) +
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
9807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
9817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // With secondary display.  Operation itself is same but doesn't change
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the position because the window is still within the secondary display.
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0));
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380));
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0);
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::IntToString(window_x + window_width) +
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ",100 " +
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IntToString(window_width) +
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "x380", window_->bounds().ToString());
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies snapping to edges works.
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToEdge) {
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(96, 112, 320, 160));
10003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Click 50px to the right so that the mouse pointer does not leave the
10013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // workspace ensuring sticky behavior.
1002f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
10033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      window_.get(),
10043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      window_->bounds().origin() + gfx::Vector2d(50, 0),
1005f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      HTCAPTION));
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move to an x-coordinate of 15, which should not snap.
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 15 - 96, 0), 0);
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An x-coordinate of 7 should snap.
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 7 - 96, 0), 0);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,112 320x160", window_->bounds().ToString());
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move to -15, should still snap to 0.
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -15 - 96, 0), 0);
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,112 320x160", window_->bounds().ToString());
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // At -32 should move past snap points.
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -32 - 96, 0), 0);
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-32,112 320x160", window_->bounds().ToString());
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -33 - 96, 0), 0);
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-33,112 320x160", window_->bounds().ToString());
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Right side should similarly snap.
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 15, 0), 0);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("465,112 320x160", window_->bounds().ToString());
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 7, 0), 0);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("480,112 320x160", window_->bounds().ToString());
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 15, 0), 0);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("480,112 320x160", window_->bounds().ToString());
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 32, 0), 0);
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("512,112 320x160", window_->bounds().ToString());
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 33, 0), 0);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("513,112 320x160", window_->bounds().ToString());
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the bottom should snap too.
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 - 7), 0);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,437 320x160", window_->bounds().ToString());
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 + 15), 0);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,437 320x160", window_->bounds().ToString());
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 32), 0);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,470 320x160", window_->bounds().ToString());
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 33), 0);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,471 320x160", window_->bounds().ToString());
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the top should snap too.
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 20), 0);
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,20 320x160", window_->bounds().ToString());
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 7), 0);
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,0 320x160", window_->bounds().ToString());
10481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // And bottom/left should snap too.
10501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  resizer->Drag(
10511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CalculateDragPoint(*resizer, 7 - 96, 600 - 160 - 112 - 3 - 7), 0);
10521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("0,437 320x160", window_->bounds().ToString());
10531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  resizer->Drag(
10541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CalculateDragPoint(*resizer, -15 - 96, 600 - 160 - 112 - 3 + 15), 0);
10551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("0,437 320x160", window_->bounds().ToString());
10561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // should move past snap points.
10571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  resizer->Drag(
10581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CalculateDragPoint(*resizer, -32 - 96, 600 - 160 - 112 - 2 + 32), 0);
10591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("-32,470 320x160", window_->bounds().ToString());
10601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  resizer->Drag(
10611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CalculateDragPoint(*resizer, -33 - 96, 600 - 160 - 112 - 2 + 33), 0);
10621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("-33,471 320x160", window_->bounds().ToString());
10631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No need to test dragging < 0 as we force that to 0.
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPLEFT.
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPLEFT) {
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
1070f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1071f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTTOPLEFT));
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -98, -199), 0);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 120x230", window_->bounds().ToString());
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPRIGHT.
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPRIGHT) {
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
10805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent(
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          window_.get()));
1082f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1083f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTTOPRIGHT));
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CalculateDragPoint(*resizer, work_area.right() - 120 - 1, -199), 0);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, window_->bounds().x());
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.y(), window_->bounds().y());
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.right() - 100, window_->bounds().width());
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(230, window_->bounds().height());
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMRIGHT.
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMRIGHT) {
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent(
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          window_.get()));
1098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1099f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT));
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CalculateDragPoint(*resizer, work_area.right() - 120 - 1,
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         work_area.bottom() - 220 - 2), 0);
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, window_->bounds().x());
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, window_->bounds().y());
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.right() - 100, window_->bounds().width());
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height());
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMLEFT.
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMLEFT) {
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent(
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          window_.get()));
1115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMLEFT));
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CalculateDragPoint(*resizer, -98, work_area.bottom() - 220 - 2), 0);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, window_->bounds().x());
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, window_->bounds().y());
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(120, window_->bounds().width());
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height());
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies window sticks to both window and work area.
11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, StickToBothEdgeAndWindow) {
11285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetBounds(gfx::Rect(10, 10, 20, 50));
11295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Show();
11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(150, 160, 25, 1000));
11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window2_->Show();
11325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      window_.get(), gfx::Point(10, 10), HTCAPTION));
11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Move |window| one pixel to the left of |window2|. Should snap to right.
11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, 145), 0);
11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect expected(130, 160, 20, 50);
11405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent(
11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          window_.get()));
11445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The initial y position of |window_|.
11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int initial_y = 10;
11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The drag position where the window is exactly attached to the bottom.
11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int attach_y = work_area.bottom() - window_->bounds().height() - initial_y;
11495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Dragging 10px above should not attach to the bottom.
11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y - 10), 0);
11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected.set_y(attach_y + initial_y - 10);
11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Stick to the work area.
11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y - 1), 0);
11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected.set_y(attach_y + initial_y);
11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y), 0);
11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected.set_y(attach_y + initial_y);
11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y + 1), 0);
11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected.set_y(attach_y + initial_y);
11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Moving down further should move the window.
11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y + 18), 0);
11705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected.set_y(attach_y + initial_y + 18);
11715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected.ToString(), window_->bounds().ToString());
11725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
11735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CtrlDragResizeToExactPosition) {
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(96, 112, 320, 160));
1176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT));
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resize the right bottom to add 10 in width, 12 in height.
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 12), ui::EF_CONTROL_DOWN);
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both bottom and right sides to resize to exact size requested.
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,112 330x172", window_->bounds().ToString());
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that a dragged, non-snapped window will clear restore bounds.
11861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WorkspaceWindowResizerTest, RestoreClearedOnResize) {
11871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  window_->SetBounds(gfx::Rect(10, 10, 100, 100));
11881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  wm::WindowState* window_state = wm::GetWindowState(window_.get());
11891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  window_state->SetRestoreBoundsInScreen(gfx::Rect(50, 50, 50, 50));
11901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
11911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      window_.get(), gfx::Point(), HTBOTTOMRIGHT));
11921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(resizer.get());
11931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Drag the window to new position by adding (20, 30) to original point,
11941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the original restore bound should be cleared.
11951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  resizer->Drag(CalculateDragPoint(*resizer, 20, 30), 0);
11961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  resizer->CompleteDrag();
11971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("10,10 120x130", window_->bounds().ToString());
11981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(window_state->HasRestoreBounds());
11991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size.
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestoreToPreMaximizeCoordinates) {
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 0, 1000, 1000));
120468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(window_.get());
120568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  window_state->SetRestoreBoundsInScreen(gfx::Rect(96, 112, 320, 160));
1206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag the window to new position by adding (10, 10) to original point,
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the window should get restored.
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 10, 10), 0);
12125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resizer->CompleteDrag();
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,10 320x160", window_->bounds().ToString());
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The restore rectangle should get cleared as well.
121568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->HasRestoreBounds());
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size.
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RevertResizeOperation) {
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect initial_bounds(0, 0, 200, 400);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(initial_bounds);
122268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
122368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(window_.get());
122468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  window_state->SetRestoreBoundsInScreen(gfx::Rect(96, 112, 320, 160));
1225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag the window to new poistion by adding (180, 16) to original point,
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the window should get restored.
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 180, 16), 0);
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->RevertDrag();
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(initial_bounds.ToString(), window_->bounds().ToString());
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("96,112 320x160",
123468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            window_state->GetRestoreBoundsInScreen().ToString());
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that only usable sizes get returned by the resizer.
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyAttach) {
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(10, 10, 20, 30));
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(150, 160, 25, 20));
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTCAPTION));
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel to the left of |window2|. Should snap to right and
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // top.
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 119, 145), 0);
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("130,160 20x30", window_->bounds().ToString());
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel to the right of |window2|. Should snap to left and
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // top.
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 164, 145), 0);
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("175,160 20x30", window_->bounds().ToString());
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel above |window2|. Should snap to top and left.
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 142, 119), 0);
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("150,130 20x30", window_->bounds().ToString());
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move |window| one pixel above the bottom of |window2|. Should snap to
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bottom and left.
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 142, 169), 0);
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("150,180 20x30", window_->bounds().ToString());
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following variants verify magnetic snapping during resize when dragging a
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular edge.
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOP) {
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(99, 179, 10, 20));
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTTOP));
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,199 20x31", window_->bounds().ToString());
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPLEFT) {
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(99, 179, 10, 20));
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTTOPLEFT));
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("99,199 21x31", window_->bounds().ToString());
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(88, 201, 10, 20));
1296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTTOPLEFT));
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("98,201 22x29", window_->bounds().ToString());
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPRIGHT) {
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(111, 179, 10, 20));
1311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTTOPRIGHT));
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,199 21x31", window_->bounds().ToString());
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(121, 199, 10, 20));
1321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTTOPRIGHT));
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,199 21x31", window_->bounds().ToString());
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_RIGHT) {
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(121, 199, 10, 20));
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT));
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,200 21x30", window_->bounds().ToString());
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMRIGHT) {
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(122, 212, 10, 20));
1348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMRIGHT));
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,200 22x32", window_->bounds().ToString());
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(111, 233, 10, 20));
1358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMRIGHT));
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("100,200 21x33", window_->bounds().ToString());
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOM) {
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(111, 233, 10, 20));
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM));
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,200 20x33", window_->bounds().ToString());
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMLEFT) {
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(99, 231, 10, 20));
1385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMLEFT));
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("99,200 21x31", window_->bounds().ToString());
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window2_->SetBounds(gfx::Rect(89, 209, 10, 20));
1395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTBOTTOMLEFT));
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("99,200 21x29", window_->bounds().ToString());
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_LEFT) {
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->SetBounds(gfx::Rect(89, 209, 10, 20));
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect(100, 200, 20, 30));
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_->Show();
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTLEFT));
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(resizer.get());
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0);
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("99,200 21x30", window_->bounds().ToString());
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the user user moved window flag is getting properly set.
1417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CheckUserWindowManagedFlags) {
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetBounds(gfx::Rect( 0,  50, 400, 200));
14191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  window_->SetProperty(aura::client::kCanMaximizeKey, true);
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> no_attached_windows;
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that an abort doesn't change anything.
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the bottom.
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0);
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("0,150 400x200", window_->bounds().ToString());
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->RevertDrag();
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
143268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_FALSE(wm::GetWindowState(window_.get())->bounds_changed_by_user());
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that a completed move / size does change the user coordinates.
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(resizer.get());
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move it 100 to the bottom.
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0);
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("0,150 400x200", window_->bounds().ToString());
14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resizer->CompleteDrag();
144468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_TRUE(wm::GetWindowState(window_.get())->bounds_changed_by_user());
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size doesn't exceed it when dragged.
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestMaxSizeEnforced) {
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 0, 400, 300));
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_max_size(gfx::Size(401, 301));
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT));
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0);
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(401, window_->bounds().width());
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(301, window_->bounds().height());
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max width doesn't restrict its height.
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestPartialMaxSizeEnforced) {
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect(0, 0, 400, 300));
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_max_size(gfx::Size(401, 0));
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOMRIGHT));
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0);
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(401, window_->bounds().width());
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(302, window_->bounds().height());
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size can't be snapped.
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, PhantomSnapMaxSize) {
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // With max size not set we get a phantom window controller for dragging off
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the right hand side.
1477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Make the window wider than maximum docked width.
1478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    window_->SetBounds(gfx::Rect(0, 0, 400, 200));
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
1482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(snap_phantom_window_controller());
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0);
1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(snap_phantom_window_controller());
1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->RevertDrag();
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // With max size defined, we get no phantom window for snapping but we still
1489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // get a phantom window (docking guide).
1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    window_->SetBounds(gfx::Rect(0, 0, 400, 200));
1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delegate_.set_max_size(gfx::Size(400, 200));
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0);
1496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(snap_phantom_window_controller());
1497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->RevertDrag();
1498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
1500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // With max size defined, we get no phantom window for snapping.
1501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    window_->SetBounds(gfx::Rect(0, 0, 400, 200));
1502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delegate_.set_max_size(gfx::Size(400, 200));
1503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // With min size defined, we get no phantom window for docking.
1504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delegate_.set_min_size(gfx::Size(400, 200));
1505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<WindowResizer> resizer(CreateResizerForTest(
1507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window_.get(), gfx::Point(), HTCAPTION));
1508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0);
1509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(snap_phantom_window_controller());
1510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resizer->RevertDrag();
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontRewardRightmostWindowForOverflows) {
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
15161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(400, 100, 100, 100));
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(101, 0));
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
15305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
15317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
15327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 51 to the left, which should contract w1 and expand w2-4.
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // w2 will hit its max size straight away, and in doing so will leave extra
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // pixels that a naive implementation may award to the rightmost window. A
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // fair implementation will give 25 pixels to each of the other windows.
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0);
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 49x100", window_->bounds().ToString());
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("149,100 101x100", window2_->bounds().ToString());
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("250,100 125x100", window3_->bounds().ToString());
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("375,100 125x100", window4_->bounds().ToString());
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxWidth) {
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
15471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(400, 100, 100, 100));
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(101, 0));
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(101, 0));
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
15625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
15637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
15647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 to the left, which should contract w1 and expand w2-4.
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0);
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 48x100", window_->bounds().ToString());
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("148,100 101x100", window2_->bounds().ToString());
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("249,100 101x100", window3_->bounds().ToString());
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("350,100 150x100", window4_->bounds().ToString());
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxHeight) {
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
15761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(100, 200, 100, 100));
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(100, 300, 100, 100));
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(100, 400, 100, 100));
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(0, 101));
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(0, 101));
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
15915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
15927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM,
15937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 up, which should contract w1 and expand w2-4.
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, -52), 0);
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 100x48", window_->bounds().ToString());
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,148 100x101", window2_->bounds().ToString());
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,249 100x101", window3_->bounds().ToString());
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,350 100x150", window4_->bounds().ToString());
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DISABLED_DontExceedMinHeight
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DontExceedMinHeight
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_DontExceedMinHeight) {
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x500");
16121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Four 100x100 windows flush against eachother, starting at 100,100.
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(100, 200, 100, 100));
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(100, 300, 100, 100));
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window4_->SetBounds(gfx::Rect(100, 400, 100, 100));
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_min_size(gfx::Size(0, 99));
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_min_size(gfx::Size(0, 99));
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
16275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
16287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTBOTTOM,
16297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 down, which should expand w1 and contract w2-4.
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 0, 52), 0);
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 100x152", window_->bounds().ToString());
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,252 100x99", window2_->bounds().ToString());
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,351 100x99", window3_->bounds().ToString());
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,450 100x50", window4_->bounds().ToString());
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExpandRightmostPastMaxWidth) {
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
16411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(101, 0));
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
16545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
16557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
16567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 51 to the left, which should contract w1 and expand w2-3.
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0);
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 49x100", window_->bounds().ToString());
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("149,100 150x100", window2_->bounds().ToString());
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("299,100 101x100", window3_->bounds().ToString());
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MoveAttachedWhenGrownToMaxSize) {
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x800");
16671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate2_.set_max_size(gfx::Size(101, 0));
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate3_.set_max_size(gfx::Size(101, 0));
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
16815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
16827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
16837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 52 to the left, which should contract w1 and expand and move w2-3.
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0);
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 48x100", window_->bounds().ToString());
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("148,100 101x100", window2_->bounds().ToString());
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("249,100 101x100", window3_->bounds().ToString());
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth DISABLED_MainWindowHonoursMaxWidth
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth MainWindowHonoursMaxWidth
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_MainWindowHonoursMaxWidth) {
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("400x800");
17011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_max_size(gfx::Size(102, 0));
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window4_.get());
17145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
17157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
17167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 50 to the right, which should expand w1 and contract w2-3, as they
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // won't fit in the root window in their original sizes.
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, 50, 0), 0);
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 102x100", window_->bounds().ToString());
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("202,100 99x100", window2_->bounds().ToString());
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("301,100 99x100", window3_->bounds().ToString());
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MainWindowHonoursMinWidth) {
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("400x800");
17281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets());
17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Three 100x100 windows flush against eachother, starting at 100,100.
17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetBounds(gfx::Rect( 100, 100, 100, 100));
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2_->SetBounds(gfx::Rect(200, 100, 100, 100));
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window3_->SetBounds(gfx::Rect(300, 100, 100, 100));
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_.set_min_size(gfx::Size(98, 0));
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<aura::Window*> windows;
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window2_.get());
17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows.push_back(window3_.get());
17405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest(
17417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      window_.get(), gfx::Point(), HTRIGHT,
17427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows));
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(resizer.get());
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move it 50 to the left, which should contract w1 and expand w2-3.
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resizer->Drag(CalculateDragPoint(*resizer, -50, 0), 0);
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 98x100", window_->bounds().ToString());
17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("198,100 101x100", window2_->bounds().ToString());
17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("299,100 101x100", window3_->bounds().ToString());
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// The following variants test that windows are resized correctly to the edges
17527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// of the screen using touch, when touch point is off of the window border.
17537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_RIGHT) {
17547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
17557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTRIGHT);
17577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(),
17587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
17615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     touch_resize_window_.get());
17627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag out of the right border a bit and check if the border is aligned with
17647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the touch point.
17657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(715, kRootHeight / 2),
17667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(725, kRootHeight / 2),
176758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
176858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
17697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 625, kRootHeight - 200).ToString(),
17707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag more, but stop before being snapped to the edge.
17727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(725, kRootHeight / 2),
17737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(760, kRootHeight / 2),
177458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
177558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
17767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 660, kRootHeight - 200).ToString(),
17777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag even more to snap to the edge.
17797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(760, kRootHeight / 2),
17807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(775, kRootHeight / 2),
178158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
178258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
17837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 700, kRootHeight - 200).ToString(),
17847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
17867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_LEFT) {
17887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
17897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTLEFT);
17917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(),
17927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
17937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
17955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     touch_resize_window_.get());
17967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag out of the left border a bit and check if the border is aligned with
17987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the touch point.
17997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(85, kRootHeight / 2),
18007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(75, kRootHeight / 2),
180158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
180258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(75, 100, 625, kRootHeight - 200).ToString(),
18047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag more, but stop before being snapped to the edge.
18067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(75, kRootHeight / 2),
18077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(40, kRootHeight / 2),
180858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
180958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(40, 100, 660, kRootHeight - 200).ToString(),
18117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag even more to snap to the edge.
18137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(40, kRootHeight / 2),
18147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(25, kRootHeight / 2),
181558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
181658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 100, 700, kRootHeight - 200).ToString(),
18187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
18207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_TOP) {
18227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
18237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTTOP);
18257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(),
18267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
18295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     touch_resize_window_.get());
18307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag out of the top border a bit and check if the border is aligned with
18327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the touch point.
18337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, 85),
18347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, 75),
183558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
183658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 75, 600, kRootHeight - 175).ToString(),
18387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag more, but stop before being snapped to the edge.
18407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, 75),
18417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, 40),
184258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
184358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 40, 600, kRootHeight - 140).ToString(),
18457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag even more to snap to the edge.
18477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, 40),
18487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, 25),
184958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
185058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 0, 600, kRootHeight - 100).ToString(),
18527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
18547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_BOTTOM) {
18567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
18577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTBOTTOM);
18597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(),
18607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
18635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     touch_resize_window_.get());
18647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag out of the bottom border a bit and check if the border is aligned with
18667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the touch point.
18677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 85),
18687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, kRootHeight - 75),
186958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
187058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 175).ToString(),
18727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag more, but stop before being snapped to the edge.
18747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 75),
18757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, kRootHeight - 40),
187658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
187758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 140).ToString(),
18797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drag even more to snap to the edge.
18817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 40),
18827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  gfx::Point(400, kRootHeight - 25),
188358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  base::TimeDelta::FromMilliseconds(10),
188458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  5);
18857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 100).ToString(),
18867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            touch_resize_window_->bounds().ToString());
18877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
18883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1890