Index: ui/app_list/cocoa/apps_grid_controller_unittest.mm |
diff --git a/ui/app_list/cocoa/apps_grid_controller_unittest.mm b/ui/app_list/cocoa/apps_grid_controller_unittest.mm |
index cae06439a5922c0d284917f3dfb2c609d66352db..43cd5e7ef3c0a59384a4c7d4e3fd2d1337cafac9 100644 |
--- a/ui/app_list/cocoa/apps_grid_controller_unittest.mm |
+++ b/ui/app_list/cocoa/apps_grid_controller_unittest.mm |
@@ -16,12 +16,14 @@ |
@interface TestPaginationObserver : NSObject<AppsPaginationModelObserver> { |
@private |
+ NSInteger hoveredSegmentForTest_; |
int totalPagesChangedCount_; |
int selectedPageChangedCount_; |
int lastNewSelectedPage_; |
bool visibilityDidChange_; |
} |
+@property(assign, nonatomic) NSInteger hoveredSegmentForTest; |
@property(assign, nonatomic) int totalPagesChangedCount; |
@property(assign, nonatomic) int selectedPageChangedCount; |
@property(assign, nonatomic) int lastNewSelectedPage; |
@@ -32,10 +34,18 @@ |
@implementation TestPaginationObserver |
+@synthesize hoveredSegmentForTest = hoveredSegmentForTest_; |
@synthesize totalPagesChangedCount = totalPagesChangedCount_; |
@synthesize selectedPageChangedCount = selectedPageChangedCount_; |
@synthesize lastNewSelectedPage = lastNewSelectedPage_; |
+- (id)init { |
+ if ((self = [super init])) |
+ hoveredSegmentForTest_ = -1; |
+ |
+ return self; |
+} |
+ |
- (bool)readVisibilityDidChange { |
bool truth = visibilityDidChange_; |
visibilityDidChange_ = false; |
@@ -55,6 +65,10 @@ |
visibilityDidChange_ = true; |
} |
+- (NSInteger)pagerSegmentAtLocation:(NSPoint)locationInWindow { |
+ return hoveredSegmentForTest_; |
+} |
+ |
@end |
namespace app_list { |
@@ -88,6 +102,26 @@ class AppsGridControllerTest : public AppsGridControllerTestHelper { |
DISALLOW_COPY_AND_ASSIGN(AppsGridControllerTest); |
}; |
+// Generate a mouse event at the centre of the view in |page| with the given |
+// |index_in_page| that can be used to initiate, update and complete drag |
+// operations. |
+NSEvent* MouseEventInCell(NSCollectionView* page, size_t index_in_page) { |
+ NSRect cell_rect = [page frameForItemAtIndex:index_in_page]; |
+ NSPoint point_in_view = NSMakePoint(NSMidX(cell_rect), NSMidY(cell_rect)); |
+ NSPoint point_in_window = [page convertPoint:point_in_view |
+ toView:nil]; |
+ return cocoa_test_event_utils::LeftMouseDownAtPoint(point_in_window); |
+} |
+ |
+NSEvent* MouseEventForScroll(NSView* view, CGFloat relative_x) { |
+ NSRect view_rect = [view frame]; |
+ NSPoint point_in_view = NSMakePoint(NSMidX(view_rect), NSMidY(view_rect)); |
+ point_in_view.x += point_in_view.x * relative_x; |
+ NSPoint point_in_window = [view convertPoint:point_in_view |
+ toView:nil]; |
+ return cocoa_test_event_utils::LeftMouseDownAtPoint(point_in_window); |
+} |
+ |
} // namespace |
TEST_VIEW(AppsGridControllerTest, [apps_grid_controller_ view]); |
@@ -226,8 +260,6 @@ TEST_F(AppsGridControllerTest, FirstPageKeyboardNavigation) { |
// Tests keyboard navigation across pages. |
TEST_F(AppsGridControllerTest, CrossPageKeyboardNavigation) { |
- [AppsGridController setScrollAnimationDuration:0.0]; |
- |
model()->PopulateApps(2 * kItemsPerPage); |
EXPECT_EQ(kItemsPerPage, [[GetPageAt(0) content] count]); |
EXPECT_EQ(kItemsPerPage, [[GetPageAt(1) content] count]); |
@@ -460,7 +492,6 @@ TEST_F(AppsGridControllerTest, PaginationObserverPagesChanged) { |
// Test AppsGridPaginationObserver selectedPageChanged(). |
TEST_F(AppsGridControllerTest, PaginationObserverSelectedPageChanged) { |
- [AppsGridController setScrollAnimationDuration:0.0]; |
scoped_nsobject<TestPaginationObserver> observer( |
[[TestPaginationObserver alloc] init]); |
[apps_grid_controller_ setPaginationObserver:observer]; |
@@ -503,21 +534,6 @@ TEST_F(AppsGridControllerTest, PaginationObserverSelectedPageChanged) { |
[apps_grid_controller_ setPaginationObserver:nil]; |
} |
-namespace { |
- |
-// Generate a mouse event at the centre of the view in |page| with the given |
-// |index_in_page| that can be used to initiate, update and complete drag |
-// operations. |
-NSEvent* MouseEventInCell(NSCollectionView* page, size_t index_in_page) { |
- NSRect cell_rect = [page frameForItemAtIndex:index_in_page]; |
- NSPoint point_in_view = NSMakePoint(NSMidX(cell_rect), NSMidY(cell_rect)); |
- NSPoint point_in_window = [page convertPoint:point_in_view |
- toView:nil]; |
- return cocoa_test_event_utils::LeftMouseDownAtPoint(point_in_window); |
-} |
- |
-} // namespace |
- |
// Test basic item moves with two items; swapping them around, dragging outside |
// of the view bounds, and dragging on the background. |
TEST_F(AppsGridControllerTest, DragAndDropSimple) { |
@@ -625,7 +641,6 @@ TEST_F(AppsGridControllerTest, DragAndDropSimple) { |
// Test item moves between pages. |
TEST_F(AppsGridControllerTest, DragAndDropMultiPage) { |
- [AppsGridController setScrollAnimationDuration:0.0]; |
const size_t kPagesToTest = 3; |
// Put one item on the last page to hit more edge cases. |
ReplaceTestModel(kItemsPerPage * (kPagesToTest - 1) + 1); |
@@ -696,5 +711,77 @@ TEST_F(AppsGridControllerTest, DragAndDropMultiPage) { |
EXPECT_EQ(0u, GetPageIndexForItem(1)); |
} |
+// Test scrolling when dragging past edge or over the pager. |
+TEST_F(AppsGridControllerTest, ScrollingWhileDragging) { |
+ scoped_nsobject<TestPaginationObserver> observer( |
+ [[TestPaginationObserver alloc] init]); |
+ [apps_grid_controller_ setPaginationObserver:observer]; |
+ |
+ ReplaceTestModel(kItemsPerPage * 3); |
+ // Start on the middle page. |
+ [apps_grid_controller_ scrollToPage:1]; |
+ NSCollectionView* page = [apps_grid_controller_ collectionViewAtPageIndex:1]; |
+ NSEvent* mouse_at_cell_0 = MouseEventInCell(page, 0); |
+ |
+ NSEvent* at_center = MouseEventForScroll([apps_grid_controller_ view], 0.0); |
+ NSEvent* at_left = MouseEventForScroll([apps_grid_controller_ view], -1.1); |
+ NSEvent* at_right = MouseEventForScroll([apps_grid_controller_ view], 1.1); |
+ |
+ AppsCollectionViewDragManager* drag_manager = |
+ [apps_grid_controller_ dragManager]; |
+ [drag_manager onMouseDownInPage:page |
+ withEvent:mouse_at_cell_0]; |
+ [drag_manager onMouseDragged:at_center]; |
+ |
+ // Nothing should be scheduled: target page is visible page. |
+ EXPECT_EQ(1u, [apps_grid_controller_ visiblePage]); |
+ EXPECT_EQ(1u, [apps_grid_controller_ scheduledScrollPage]); |
+ |
+ // Drag to the left, should go to first page and no further. |
+ [drag_manager onMouseDragged:at_left]; |
+ EXPECT_EQ(1u, [apps_grid_controller_ visiblePage]); |
+ EXPECT_EQ(0u, [apps_grid_controller_ scheduledScrollPage]); |
+ [apps_grid_controller_ scrollToPage:0]; // Commit without timer for testing. |
+ [drag_manager onMouseDragged:at_left]; |
+ EXPECT_EQ(0u, [apps_grid_controller_ visiblePage]); |
+ EXPECT_EQ(0u, [apps_grid_controller_ scheduledScrollPage]); |
+ |
+ // Drag to the right, should go to last page and no futher. |
+ [drag_manager onMouseDragged:at_right]; |
+ EXPECT_EQ(0u, [apps_grid_controller_ visiblePage]); |
+ EXPECT_EQ(1u, [apps_grid_controller_ scheduledScrollPage]); |
+ [apps_grid_controller_ scrollToPage:1]; |
+ [drag_manager onMouseDragged:at_right]; |
+ EXPECT_EQ(1u, [apps_grid_controller_ visiblePage]); |
+ EXPECT_EQ(2u, [apps_grid_controller_ scheduledScrollPage]); |
+ [apps_grid_controller_ scrollToPage:2]; |
+ [drag_manager onMouseDragged:at_right]; |
+ EXPECT_EQ(2u, [apps_grid_controller_ visiblePage]); |
+ EXPECT_EQ(2u, [apps_grid_controller_ scheduledScrollPage]); |
+ |
+ // Simulate a hover over the first pager segment. |
+ [observer setHoveredSegmentForTest:0]; |
+ [drag_manager onMouseDragged:at_center]; |
+ EXPECT_EQ(2u, [apps_grid_controller_ visiblePage]); |
+ EXPECT_EQ(0u, [apps_grid_controller_ scheduledScrollPage]); |
+ |
+ // Drag it back, should cancel schedule. |
+ [observer setHoveredSegmentForTest:-1]; |
+ [drag_manager onMouseDragged:at_center]; |
+ EXPECT_EQ(2u, [apps_grid_controller_ visiblePage]); |
+ EXPECT_EQ(2u, [apps_grid_controller_ scheduledScrollPage]); |
+ |
+ // Hover again, now over middle segment, and ensure a release also cancels. |
+ [observer setHoveredSegmentForTest:1]; |
+ [drag_manager onMouseDragged:at_center]; |
+ EXPECT_EQ(2u, [apps_grid_controller_ visiblePage]); |
+ EXPECT_EQ(1u, [apps_grid_controller_ scheduledScrollPage]); |
+ [drag_manager onMouseUp:at_center]; |
+ EXPECT_EQ(2u, [apps_grid_controller_ visiblePage]); |
+ EXPECT_EQ(2u, [apps_grid_controller_ scheduledScrollPage]); |
+ |
+ [apps_grid_controller_ setPaginationObserver:nil]; |
+} |
+ |
} // namespace test |
} // namespace app_list |