Index: components/mus/example/wm/move_loop_unittest.cc |
diff --git a/components/mus/example/wm/move_loop_unittest.cc b/components/mus/example/wm/move_loop_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d53b862c9c777f2bdea17a1d297d33c6469ea210 |
--- /dev/null |
+++ b/components/mus/example/wm/move_loop_unittest.cc |
@@ -0,0 +1,180 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "components/mus/example/wm/move_loop.h" |
+ |
+#include "components/mus/public/cpp/tests/test_window.h" |
+#include "mojo/converters/input_events/input_events_type_converters.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/events/event.h" |
+#include "ui/gfx/geometry/point.h" |
+#include "ui/gfx/geometry/rect.h" |
+ |
+using MoveLoopTest = testing::Test; |
+ |
+namespace { |
+ |
+// Sets the client area for |window|. Padding is provided on the top so that |
+// there is a movable region. All other edges are sized to |
+// |MoveLoop::kResizeSize|. |
+void SetClientArea(mus::Window* window) { |
+ if (window->bounds().IsEmpty()) |
+ window->SetBounds(gfx::Rect(100, 200, 300, 400)); |
+ |
+ gfx::Rect client_area(window->bounds().size()); |
+ client_area.Inset(MoveLoop::kResizeSize, MoveLoop::kResizeSize + 10, |
+ MoveLoop::kResizeSize, MoveLoop::kResizeSize); |
+ window->SetClientArea(client_area); |
+} |
+ |
+mus::mojom::EventPtr CreatePointerDownEvent(const gfx::Point& location) { |
+ const ui::TouchEvent event(ui::ET_TOUCH_PRESSED, gfx::PointF(location), 1, |
+ base::TimeDelta()); |
+ return mus::mojom::Event::From(static_cast<const ui::Event&>(event)); |
+} |
+ |
+mus::mojom::EventPtr CreatePointerMove(const gfx::Point& location) { |
+ const ui::TouchEvent event(ui::ET_TOUCH_MOVED, gfx::PointF(location), 1, |
+ base::TimeDelta()); |
+ return mus::mojom::Event::From(static_cast<const ui::Event&>(event)); |
+} |
+ |
+enum class HorizontalLocation { |
+ LEFT, |
+ MIDDLE, |
+ RIGHT, |
+}; |
+ |
+enum class VerticalLocation { |
+ TOP_MOVE, |
+ TOP_RESIZE, |
+ MIDDLE, |
+ BOTTOM, |
+}; |
+ |
+int HorizontalLocationToPoint(const mus::Window* window, |
+ HorizontalLocation loc) { |
+ if (loc == HorizontalLocation::LEFT) |
+ return 0; |
+ return loc == HorizontalLocation::MIDDLE ? window->bounds().width() / 2 |
+ : window->bounds().width() - 1; |
+} |
+ |
+int VerticalLocationToPoint(const mus::Window* window, VerticalLocation loc) { |
+ switch (loc) { |
+ case VerticalLocation::TOP_MOVE: |
+ return MoveLoop::kResizeSize + 1; |
+ case VerticalLocation::TOP_RESIZE: |
+ return 0; |
+ case VerticalLocation::MIDDLE: |
+ return window->bounds().height() / 2; |
+ case VerticalLocation::BOTTOM: |
+ return window->bounds().height() - 1; |
+ } |
+ return 0; |
+} |
+ |
+gfx::Point LocationToPoint(const mus::Window* window, |
+ HorizontalLocation h_loc, |
+ VerticalLocation v_loc) { |
+ return gfx::Point(HorizontalLocationToPoint(window, h_loc), |
+ VerticalLocationToPoint(window, v_loc)); |
+} |
+ |
+} // namespace |
+ |
+TEST_F(MoveLoopTest, Move) { |
+ struct TestData { |
+ HorizontalLocation initial_h_loc; |
+ VerticalLocation initial_v_loc; |
+ // Number of values in delta_* that are valid. For example, if this is 1 |
+ // then only one move is generated with thye point |delta_x[0]|, |
+ // |delta_y[0]|. |
+ int delta_count; |
+ int delta_x[3]; |
+ int delta_y[3]; |
+ gfx::Rect expected_bounds; |
+ } data[] = { |
+ // Move. |
+ {HorizontalLocation::MIDDLE, |
+ VerticalLocation::TOP_MOVE, |
+ 1, |
+ {1, 0, 0}, |
+ {2, 0, 0}, |
+ gfx::Rect(101, 202, 300, 400)}, |
+ |
+ // Resize from top, left. |
+ {HorizontalLocation::LEFT, |
+ VerticalLocation::TOP_RESIZE, |
+ 1, |
+ {1, 0, 0}, |
+ {2, 0, 0}, |
+ gfx::Rect(101, 202, 299, 398)}, |
+ |
+ // Resize from left. |
+ {HorizontalLocation::LEFT, |
+ VerticalLocation::MIDDLE, |
+ 1, |
+ {1, 0, 0}, |
+ {2, 0, 0}, |
+ gfx::Rect(101, 200, 299, 400)}, |
+ |
+ // Resize from bottom, left. |
+ {HorizontalLocation::LEFT, |
+ VerticalLocation::BOTTOM, |
+ 1, |
+ {-1, 0, 0}, |
+ {-2, 0, 0}, |
+ gfx::Rect(99, 200, 301, 398)}, |
+ |
+ // Resize from bottom. |
+ {HorizontalLocation::MIDDLE, |
+ VerticalLocation::BOTTOM, |
+ 1, |
+ {-1, 0, 0}, |
+ {4, 0, 0}, |
+ gfx::Rect(100, 200, 300, 404)}, |
+ |
+ // Resize from bottom, right. |
+ {HorizontalLocation::RIGHT, |
+ VerticalLocation::BOTTOM, |
+ 1, |
+ {-3, 0, 0}, |
+ {4, 0, 0}, |
+ gfx::Rect(100, 200, 297, 404)}, |
+ |
+ // Resize from right. |
+ {HorizontalLocation::RIGHT, |
+ VerticalLocation::MIDDLE, |
+ 1, |
+ {6, 0, 0}, |
+ {-4, 0, 0}, |
+ gfx::Rect(100, 200, 306, 400)}, |
+ |
+ // Resize from top, right. |
+ {HorizontalLocation::RIGHT, |
+ VerticalLocation::TOP_RESIZE, |
+ 1, |
+ {6, 0, 0}, |
+ {5, 0, 0}, |
+ gfx::Rect(100, 205, 306, 395)}, |
+ }; |
+ |
+ for (size_t i = 0; i < arraysize(data); ++i) { |
+ mus::TestWindow window; |
+ SetClientArea(&window); |
+ gfx::Point pointer_location( |
+ LocationToPoint(&window, data[i].initial_h_loc, data[i].initial_v_loc)); |
+ scoped_ptr<MoveLoop> move_loop = |
+ MoveLoop::Create(&window, *CreatePointerDownEvent(pointer_location)); |
+ ASSERT_TRUE(move_loop.get()) << i; |
+ for (int j = 0; j < data[i].delta_count; ++j) { |
+ pointer_location.Offset(data[i].delta_x[j], data[i].delta_y[j]); |
+ ASSERT_EQ(MoveLoop::MoveResult::CONTINUE, |
+ move_loop->Move(*CreatePointerMove(pointer_location))) |
+ << i << " " << j; |
+ } |
+ ASSERT_EQ(data[i].expected_bounds, window.bounds()); |
+ } |
+} |