1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "athena/util/drag_handle.h" 6 7 #include "ui/aura/test/aura_test_base.h" 8 #include "ui/aura/window.h" 9 #include "ui/views/view.h" 10 #include "ui/views/widget/widget.h" 11 12 namespace athena { 13 14 class DragHandleDelegateTest : public DragHandleScrollDelegate { 15 public: 16 explicit DragHandleDelegateTest() 17 : begin_delta_(0), 18 got_scroll_end_(false), 19 update_delta_(0) {} 20 21 virtual ~DragHandleDelegateTest() {} 22 23 void Reset() { 24 begin_delta_ = 0; 25 got_scroll_end_ = false; 26 update_delta_ = 0; 27 } 28 29 float begin_delta() { return begin_delta_; } 30 bool got_scroll_end() { return got_scroll_end_; } 31 float update_delta() { return update_delta_; } 32 33 private: 34 // DragHandleScrollDelegate: 35 virtual void HandleScrollBegin(float delta) OVERRIDE { 36 begin_delta_ = delta; 37 } 38 39 virtual void HandleScrollEnd() OVERRIDE { 40 got_scroll_end_ = true; 41 } 42 43 virtual void HandleScrollUpdate(float delta) OVERRIDE { 44 update_delta_ = delta; 45 } 46 47 float begin_delta_; 48 bool got_scroll_end_; 49 float update_delta_; 50 51 DISALLOW_COPY_AND_ASSIGN(DragHandleDelegateTest); 52 }; 53 54 typedef aura::test::AuraTestBase DragHandleTest; 55 56 const int kDragHandleWidth = 10; 57 const int kDragHandleHeight = 100; 58 59 ui::GestureEvent CreateGestureEvent(ui::EventType type, 60 float x, 61 float delta_x) { 62 ui::GestureEvent event( 63 x, 64 1, 65 0, 66 base::TimeDelta::FromInternalValue(base::Time::Now().ToInternalValue()), 67 type == ui::ET_GESTURE_SCROLL_END 68 ? ui::GestureEventDetails(type) 69 : ui::GestureEventDetails(type, delta_x, 0)); 70 event.set_root_location(gfx::PointF(x, 1)); 71 return event; 72 } 73 74 TEST_F(DragHandleTest, ScrollTest) { 75 DragHandleDelegateTest delegate; 76 scoped_ptr<views::View> drag_handle( 77 CreateDragHandleView(DragHandleScrollDirection::DRAG_HANDLE_HORIZONTAL, 78 &delegate, 79 kDragHandleWidth, 80 kDragHandleHeight)); 81 82 views::Widget widget; 83 views::Widget::InitParams params( 84 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 85 params.parent = root_window(); 86 params.accept_events = true; 87 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 88 widget.Init(params); 89 widget.SetContentsView(drag_handle.get()); 90 const gfx::Size& size = gfx::Size(kDragHandleWidth, kDragHandleHeight); 91 widget.SetSize(size); 92 widget.SetBounds(gfx::Rect(0, 0, size.width(), size.height())); 93 94 const float begin_x = 4.0; 95 const float begin_delta = 10.0; 96 const float update_delta = 15.0; 97 98 ui::GestureEvent scroll_begin_model = 99 CreateGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, begin_x, begin_delta); 100 ui::GestureEvent scroll_update_model = 101 CreateGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 102 begin_x + update_delta, 103 update_delta - begin_delta); 104 ui::GestureEvent scroll_end_model = 105 CreateGestureEvent(ui::ET_GESTURE_SCROLL_END, begin_x + update_delta, 0); 106 ui::GestureEvent fling_start_model = 107 CreateGestureEvent(ui::ET_SCROLL_FLING_START, begin_x + update_delta, 0); 108 109 // Normal scroll 110 ui::GestureEvent e(scroll_begin_model); 111 widget.OnGestureEvent(&e); 112 EXPECT_EQ(begin_delta, delegate.begin_delta()); 113 EXPECT_EQ(0, delegate.update_delta()); 114 EXPECT_FALSE(delegate.got_scroll_end()); 115 e = ui::GestureEvent(scroll_update_model); 116 widget.OnGestureEvent(&e); 117 EXPECT_EQ(update_delta, delegate.update_delta()); 118 EXPECT_FALSE(delegate.got_scroll_end()); 119 e = ui::GestureEvent(scroll_end_model); 120 widget.OnGestureEvent(&e); 121 EXPECT_EQ(update_delta, delegate.update_delta()); 122 EXPECT_TRUE(delegate.got_scroll_end()); 123 124 delegate.Reset(); 125 126 // Scroll ending with a fling 127 e = ui::GestureEvent(scroll_begin_model); 128 widget.OnGestureEvent(&e); 129 e = ui::GestureEvent(scroll_update_model); 130 widget.OnGestureEvent(&e); 131 e = ui::GestureEvent(fling_start_model); 132 widget.OnGestureEvent(&e); 133 EXPECT_TRUE(delegate.got_scroll_end()); 134 135 delegate.Reset(); 136 137 drag_handle.reset(); 138 } 139 140 } // namespace athena 141