Commit b2bfbb18 authored by Xiaodan Zhu's avatar Xiaodan Zhu Committed by Chromium LUCI CQ

Add unittests for reordering desks by drag & drop.

This CL implements the unittest for reodering desks by drag & drop.

This CL adds three helper functions:
- LongTapOnDeskPreview
- StartDragDeskPreview
- DragDeskPreviewTo
- DropDeskPreview

The CL adds two unittests: DesksBentoTest.ReorderDesksByMouse and
DesksBentoTest.ReorderDesksByGesture which test

- Trigger drag & drop and reorder desks by mouse.
- Trigger drag & drop and reprder desks by gesture.

Change-Id: I295e393ef4fdcf94a242ba4ecb011bb8f44515d3
Bug: 1154038
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2609587Reviewed-by: default avatarAhmed Fakhry <afakhry@chromium.org>
Commit-Queue: Xiaodan Zhu <zxdan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#843902}
parent dd223e70
...@@ -260,6 +260,30 @@ void DesksBarViewLayoutTestHelper(const DesksBarView* desks_bar_view, ...@@ -260,6 +260,30 @@ void DesksBarViewLayoutTestHelper(const DesksBarView* desks_bar_view,
} }
} }
// Simulate pressing on a desk preview.
void LongTapOnDeskPreview(const DeskMiniView* desk_mini_view,
ui::test::EventGenerator* event_generator) {
DCHECK(desk_mini_view);
gfx::Point desk_preview_center =
desk_mini_view->GetPreviewBoundsInScreen().CenterPoint();
LongGestureTap(desk_preview_center, event_generator, /*release_touch=*/false);
}
// Simulate drag on a desk preview.
void StartDragDeskPreview(const DeskMiniView* desk_mini_view,
ui::test::EventGenerator* event_generator) {
DCHECK(desk_mini_view);
gfx::Point desk_preview_center =
desk_mini_view->GetPreviewBoundsInScreen().CenterPoint();
event_generator->set_current_screen_location(desk_preview_center);
event_generator->PressLeftButton();
event_generator->MoveMouseBy(0, 50);
}
// Defines an observer to test DesksController notifications. // Defines an observer to test DesksController notifications.
class TestObserver : public DesksController::Observer { class TestObserver : public DesksController::Observer {
public: public:
...@@ -4207,6 +4231,149 @@ TEST_F(DesksBentoTest, NewDeskButton) { ...@@ -4207,6 +4231,149 @@ TEST_F(DesksBentoTest, NewDeskButton) {
EXPECT_TRUE(new_desk_button->GetEnabled()); EXPECT_TRUE(new_desk_button->GetEnabled());
} }
TEST_F(DesksBentoTest, ReorderDesksByMouse) {
auto* desks_controller = DesksController::Get();
auto* overview_controller = Shell::Get()->overview_controller();
overview_controller->StartOverview();
EXPECT_TRUE(overview_controller->InOverviewSession());
auto* root_window = Shell::GetPrimaryRootWindow();
const auto* desks_bar_view =
GetOverviewGridForRoot(root_window)->desks_bar_view();
auto* event_generator = GetEventGenerator();
// Add two desks (Now we have three desks).
NewDesk();
NewDesk();
// Cache the mini view and corresponding desks.
std::vector<DeskMiniView*> mini_views = desks_bar_view->mini_views();
DeskMiniView* mini_view_0 = mini_views[0];
Desk* desk_0 = mini_view_0->desk();
DeskMiniView* mini_view_1 = mini_views[1];
Desk* desk_1 = mini_view_1->desk();
DeskMiniView* mini_view_2 = mini_views[2];
Desk* desk_2 = mini_view_2->desk();
// Dragging the desk preview will trigger drag & drop.
StartDragDeskPreview(mini_view_1, event_generator);
EXPECT_TRUE(desks_bar_view->IsDraggingDesk());
event_generator->ReleaseLeftButton();
// Reorder the second desk
StartDragDeskPreview(mini_view_1, event_generator);
EXPECT_TRUE(desks_bar_view->IsDraggingDesk());
// Swap the positions of the second desk and the third desk.
gfx::Point desk_center_2 =
mini_view_2->GetPreviewBoundsInScreen().CenterPoint();
event_generator->MoveMouseTo(desk_center_2);
// Now, the desks order should be [0, 2, 1]:
EXPECT_EQ(0, desks_controller->GetDeskIndex(desk_0));
EXPECT_EQ(1, desks_controller->GetDeskIndex(desk_2));
EXPECT_EQ(2, desks_controller->GetDeskIndex(desk_1));
// Swap the positions of the second desk and the first desk.
gfx::Point desk_center_0 =
mini_view_0->GetPreviewBoundsInScreen().CenterPoint();
event_generator->MoveMouseTo(desk_center_0);
// Now, the desks order should be [1, 0, 2]:
EXPECT_EQ(0, desks_controller->GetDeskIndex(desk_1));
EXPECT_EQ(1, desks_controller->GetDeskIndex(desk_0));
EXPECT_EQ(2, desks_controller->GetDeskIndex(desk_2));
// If the cursor is outside the desk bar, the second desk will be moved to the
// end.
gfx::Point desk_bar_bottom_center = desks_bar_view->bounds().bottom_center();
views::View::ConvertPointToScreen(desks_bar_view->parent(),
&desk_bar_bottom_center);
event_generator->MoveMouseTo(desk_bar_bottom_center + gfx::Vector2d(0, 10));
// Now, the desks order should be [0, 2, 1]:
EXPECT_EQ(0, desks_controller->GetDeskIndex(desk_0));
EXPECT_EQ(1, desks_controller->GetDeskIndex(desk_2));
EXPECT_EQ(2, desks_controller->GetDeskIndex(desk_1));
event_generator->ReleaseLeftButton();
}
TEST_F(DesksBentoTest, ReorderDesksByGesture) {
auto* desks_controller = DesksController::Get();
auto* overview_controller = Shell::Get()->overview_controller();
overview_controller->StartOverview();
EXPECT_TRUE(overview_controller->InOverviewSession());
auto* root_window = Shell::GetPrimaryRootWindow();
const auto* desks_bar_view =
GetOverviewGridForRoot(root_window)->desks_bar_view();
auto* event_generator = GetEventGenerator();
// Add two desks (Now we have three desks).
NewDesk();
NewDesk();
// Cache the mini view and corresponding desks.
std::vector<DeskMiniView*> mini_views = desks_bar_view->mini_views();
DeskMiniView* mini_view_0 = mini_views[0];
Desk* desk_0 = mini_view_0->desk();
DeskMiniView* mini_view_1 = mini_views[1];
Desk* desk_1 = mini_view_1->desk();
DeskMiniView* mini_view_2 = mini_views[2];
Desk* desk_2 = mini_view_2->desk();
// If long press on the second desk preview, drag & drop will be triggered.
// Perform by gesture:
LongTapOnDeskPreview(mini_view_1, event_generator);
EXPECT_TRUE(desks_bar_view->IsDraggingDesk());
event_generator->ReleaseTouch();
// Reorder the second desk
LongTapOnDeskPreview(mini_view_1, event_generator);
EXPECT_TRUE(desks_bar_view->IsDraggingDesk());
// Swap the positions of the second desk and the third desk.
gfx::Point desk_center_2 =
mini_view_2->GetPreviewBoundsInScreen().CenterPoint();
event_generator->MoveTouch(desk_center_2);
// Now, the desks order should be [0, 2, 1]:
EXPECT_EQ(0, desks_controller->GetDeskIndex(desk_0));
EXPECT_EQ(1, desks_controller->GetDeskIndex(desk_2));
EXPECT_EQ(2, desks_controller->GetDeskIndex(desk_1));
// Swap the positions of the second desk and the first desk.
gfx::Point desk_center_0 =
mini_view_0->GetPreviewBoundsInScreen().CenterPoint();
event_generator->MoveTouch(desk_center_0);
// Now, the desks order should be [1, 0, 2]:
EXPECT_EQ(0, desks_controller->GetDeskIndex(desk_1));
EXPECT_EQ(1, desks_controller->GetDeskIndex(desk_0));
EXPECT_EQ(2, desks_controller->GetDeskIndex(desk_2));
// If the touch point is outside the desk bar, the second desk will be moved
// to the end.
gfx::Point desk_bar_bottom_center = desks_bar_view->bounds().bottom_center();
views::View::ConvertPointToScreen(desks_bar_view->parent(),
&desk_bar_bottom_center);
event_generator->MoveTouch(desk_bar_bottom_center + gfx::Vector2d(0, 10));
// Now, the desks order should be [0, 2, 1]:
EXPECT_EQ(0, desks_controller->GetDeskIndex(desk_0));
EXPECT_EQ(1, desks_controller->GetDeskIndex(desk_2));
EXPECT_EQ(2, desks_controller->GetDeskIndex(desk_1));
event_generator->ReleaseTouch();
}
// TODO(afakhry): Add more tests: // TODO(afakhry): Add more tests:
// - Always on top windows are not tracked by any desk. // - Always on top windows are not tracked by any desk.
// - Reusing containers when desks are removed and created. // - Reusing containers when desks are removed and created.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment