ConsecutiveTapsGestureDetectorTest.java revision f2c8c89ad6048dd304f36928f1cddacbe7dbd920
1/* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.setupwizardlib.gesture; 18 19import static org.mockito.Matchers.eq; 20import static org.mockito.Mockito.inOrder; 21import static org.robolectric.RuntimeEnvironment.application; 22 23import android.view.MotionEvent; 24import android.view.View; 25import android.view.ViewConfiguration; 26 27import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner; 28 29import org.junit.Before; 30import org.junit.Test; 31import org.junit.runner.RunWith; 32import org.mockito.InOrder; 33import org.mockito.Mock; 34import org.mockito.MockitoAnnotations; 35import org.robolectric.annotation.Config; 36 37@Config(sdk = { Config.OLDEST_SDK, Config.NEWEST_SDK }) 38@RunWith(SuwLibRobolectricTestRunner.class) 39public class ConsecutiveTapsGestureDetectorTest { 40 41 @Mock 42 private ConsecutiveTapsGestureDetector.OnConsecutiveTapsListener mListener; 43 44 private ConsecutiveTapsGestureDetector mDetector; 45 private int mSlop; 46 private int mTapTimeout; 47 48 @Before 49 public void setUp() { 50 MockitoAnnotations.initMocks(this); 51 52 View view = new View(application); 53 view.measure(500, 500); 54 view.layout(0, 0, 500, 500); 55 mDetector = new ConsecutiveTapsGestureDetector(mListener, view); 56 57 mSlop = ViewConfiguration.get(application).getScaledDoubleTapSlop(); 58 mTapTimeout = ViewConfiguration.getDoubleTapTimeout(); 59 } 60 61 @Test 62 public void onTouchEvent_shouldTriggerCallbackOnFourTaps() { 63 InOrder inOrder = inOrder(mListener); 64 65 tap(0, 25f, 25f); 66 inOrder.verify(mListener).onConsecutiveTaps(eq(1)); 67 68 tap(100, 25f, 25f); 69 inOrder.verify(mListener).onConsecutiveTaps(eq(2)); 70 71 tap(200, 25f, 25f); 72 inOrder.verify(mListener).onConsecutiveTaps(eq(3)); 73 74 tap(300, 25f, 25f); 75 inOrder.verify(mListener).onConsecutiveTaps(eq(4)); 76 } 77 78 @Test 79 public void onTouchEvent_tapOnDifferentLocation_shouldResetCounter() { 80 InOrder inOrder = inOrder(mListener); 81 82 tap(0, 25f, 25f); 83 inOrder.verify(mListener).onConsecutiveTaps(eq(1)); 84 85 tap(100, 25f, 25f); 86 inOrder.verify(mListener).onConsecutiveTaps(eq(2)); 87 88 tap(200, 25f + mSlop * 2, 25f); 89 inOrder.verify(mListener).onConsecutiveTaps(eq(1)); 90 91 tap(300, 25f + mSlop * 2, 25f); 92 inOrder.verify(mListener).onConsecutiveTaps(eq(2)); 93 } 94 95 @Test 96 public void onTouchEvent_tapAfterTimeout_shouldResetCounter() { 97 InOrder inOrder = inOrder(mListener); 98 99 tap(0, 25f, 25f); 100 inOrder.verify(mListener).onConsecutiveTaps(eq(1)); 101 102 tap(100, 25f, 25f); 103 inOrder.verify(mListener).onConsecutiveTaps(eq(2)); 104 105 tap(200 + mTapTimeout, 25f, 25f); 106 inOrder.verify(mListener).onConsecutiveTaps(eq(1)); 107 108 tap(300 + mTapTimeout, 25f, 25f); 109 inOrder.verify(mListener).onConsecutiveTaps(eq(2)); 110 } 111 112 private void tap(int timeMillis, float x, float y) { 113 mDetector.onTouchEvent( 114 MotionEvent.obtain(timeMillis, timeMillis, MotionEvent.ACTION_DOWN, x, y, 0)); 115 mDetector.onTouchEvent( 116 MotionEvent.obtain(timeMillis, timeMillis + 10, MotionEvent.ACTION_UP, x, y, 0)); 117 } 118} 119