1 /* 2 * Copyright (C) 2017 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 17 package com.android.documentsui.selection; 18 19 import static org.junit.Assert.assertFalse; 20 import static org.junit.Assert.assertTrue; 21 22 import android.graphics.Point; 23 import android.graphics.Rect; 24 import android.support.test.filters.SmallTest; 25 import android.support.test.runner.AndroidJUnit4; 26 import android.support.v7.widget.RecyclerView.OnScrollListener; 27 import android.view.MotionEvent; 28 29 import com.android.documentsui.selection.BandSelectionHelper.BandHost; 30 import com.android.documentsui.selection.testing.SelectionPredicates; 31 import com.android.documentsui.selection.testing.TestAdapter; 32 import com.android.documentsui.selection.testing.TestBandPredicate; 33 import com.android.documentsui.selection.testing.TestEvents.Builder; 34 import com.android.documentsui.selection.testing.TestStableIdProvider; 35 36 import org.junit.Before; 37 import org.junit.Test; 38 import org.junit.runner.RunWith; 39 40 import java.util.Collections; 41 import java.util.List; 42 43 @RunWith(AndroidJUnit4.class) 44 @SmallTest 45 public class BandSelectionHelperTest { 46 47 private List<String> mItems; 48 private BandSelectionHelper mBandController; 49 private boolean mIsActive; 50 private Builder mStartBuilder; 51 private Builder mStopBuilder; 52 private MotionEvent mStartEvent; 53 private MotionEvent mStopEvent; 54 private TestBandHost mBandHost; 55 private TestBandPredicate mBandPredicate; 56 57 @Before 58 public void setup() throws Exception { 59 mItems = TestAdapter.createItemList(10); 60 mIsActive = false; 61 TestAdapter adapter = new TestAdapter(); 62 adapter.updateTestModelIds(mItems); 63 mBandHost = new TestBandHost(); 64 mBandPredicate = new TestBandPredicate(); 65 66 SelectionHelper helper = new DefaultSelectionHelper( 67 DefaultSelectionHelper.MODE_SINGLE, 68 adapter, 69 new TestStableIdProvider(adapter), 70 SelectionPredicates.CAN_SET_ANYTHING); 71 72 mBandController = new BandSelectionHelper( 73 mBandHost, 74 adapter, 75 new TestStableIdProvider(adapter), 76 helper, 77 SelectionPredicates.CAN_SET_ANYTHING, 78 mBandPredicate, 79 new ContentLock()) { 80 @Override 81 public boolean isActive() { 82 return mIsActive; 83 } 84 }; 85 86 mStartBuilder = new Builder().mouse().primary().action(MotionEvent.ACTION_MOVE); 87 mStopBuilder = new Builder().mouse().action(MotionEvent.ACTION_UP); 88 mStartEvent = mStartBuilder.build(); 89 mStopEvent = mStopBuilder.build(); 90 } 91 92 @Test 93 public void testGoodStart() { 94 assertTrue(mBandController.shouldStart(mStartEvent)); 95 } 96 97 @Test 98 public void testBadStart_NoButtons() { 99 assertFalse(mBandController.shouldStart( 100 mStartBuilder.releaseButton(MotionEvent.BUTTON_PRIMARY).build())); 101 } 102 103 @Test 104 public void testBadStart_SecondaryButton() { 105 assertFalse( 106 mBandController.shouldStart(mStartBuilder.secondary().build())); 107 } 108 109 @Test 110 public void testBadStart_TertiaryButton() { 111 assertFalse( 112 mBandController.shouldStart(mStartBuilder.tertiary().build())); 113 } 114 115 @Test 116 public void testBadStart_Touch() { 117 assertFalse(mBandController.shouldStart( 118 mStartBuilder.touch().releaseButton(MotionEvent.BUTTON_PRIMARY).build())); 119 } 120 121 @Test 122 public void testBadStart_RespectsCanInitiateBand() { 123 mBandPredicate.setCanInitiate(false); 124 assertFalse(mBandController.shouldStart(mStartEvent)); 125 } 126 127 @Test 128 public void testBadStart_ActionDown() { 129 assertFalse(mBandController 130 .shouldStart(mStartBuilder.action(MotionEvent.ACTION_DOWN).build())); 131 } 132 133 @Test 134 public void testBadStart_ActionUp() { 135 assertFalse(mBandController 136 .shouldStart(mStartBuilder.action(MotionEvent.ACTION_UP).build())); 137 } 138 139 @Test 140 public void testBadStart_ActionPointerDown() { 141 assertFalse(mBandController.shouldStart( 142 mStartBuilder.action(MotionEvent.ACTION_POINTER_DOWN).build())); 143 } 144 145 @Test 146 public void testBadStart_ActionPointerUp() { 147 assertFalse(mBandController.shouldStart( 148 mStartBuilder.action(MotionEvent.ACTION_POINTER_UP).build())); 149 } 150 151 @Test 152 public void testBadStart_NoItems() { 153 TestAdapter emptyAdapter = new TestAdapter(); 154 emptyAdapter.updateTestModelIds(Collections.EMPTY_LIST); 155 156 SelectionHelper helper = new DefaultSelectionHelper( 157 DefaultSelectionHelper.MODE_SINGLE, 158 emptyAdapter, 159 new TestStableIdProvider(emptyAdapter), 160 SelectionPredicates.CAN_SET_ANYTHING); 161 162 mBandController = new BandSelectionHelper( 163 new TestBandHost(), 164 emptyAdapter, 165 new TestStableIdProvider(emptyAdapter), 166 helper, 167 SelectionPredicates.CAN_SET_ANYTHING, 168 mBandPredicate, 169 new ContentLock()); 170 171 assertFalse(mBandController.shouldStart(mStartEvent)); 172 } 173 174 @Test 175 public void testBadStart_alreadyActive() { 176 mIsActive = true; 177 assertFalse(mBandController.shouldStart(mStartEvent)); 178 } 179 180 @Test 181 public void testGoodStop() { 182 mIsActive = true; 183 assertTrue(mBandController.shouldStop(mStopEvent)); 184 } 185 186 @Test 187 public void testGoodStop_PointerUp() { 188 mIsActive = true; 189 assertTrue(mBandController 190 .shouldStop(mStopBuilder.action(MotionEvent.ACTION_POINTER_UP).build())); 191 } 192 193 @Test 194 public void testGoodStop_Cancel() { 195 mIsActive = true; 196 assertTrue(mBandController 197 .shouldStop(mStopBuilder.action(MotionEvent.ACTION_CANCEL).build())); 198 } 199 200 @Test 201 public void testBadStop_NotActive() { 202 assertFalse(mBandController.shouldStop(mStopEvent)); 203 } 204 205 @Test 206 public void testBadStop_NonMouse() { 207 mIsActive = true; 208 assertFalse(mBandController.shouldStop(mStopBuilder.touch().build())); 209 } 210 211 @Test 212 public void testBadStop_Move() { 213 mIsActive = true; 214 assertFalse(mBandController.shouldStop( 215 mStopBuilder.action(MotionEvent.ACTION_MOVE).touch().build())); 216 } 217 218 @Test 219 public void testBadStop_Down() { 220 mIsActive = true; 221 assertFalse(mBandController.shouldStop( 222 mStopBuilder.action(MotionEvent.ACTION_DOWN).touch().build())); 223 } 224 225 private final class TestBandHost extends BandHost { 226 @Override 227 public void scrollBy(int dy) { 228 } 229 230 @Override 231 public void runAtNextFrame(Runnable r) { 232 } 233 234 @Override 235 public void removeCallback(Runnable r) { 236 } 237 238 @Override 239 public void showBand(Rect rect) { 240 } 241 242 @Override 243 public void hideBand() { 244 } 245 246 @Override 247 public void addOnScrollListener(OnScrollListener listener) { 248 } 249 250 @Override 251 public void removeOnScrollListener(OnScrollListener listener) { 252 } 253 254 @Override 255 public int getHeight() { 256 return 0; 257 } 258 259 @Override 260 public void invalidateView() { 261 } 262 263 @Override 264 public Point createAbsolutePoint(Point relativePoint) { 265 return null; 266 } 267 268 @Override 269 public Rect getAbsoluteRectForChildViewAt(int index) { 270 return null; 271 } 272 273 @Override 274 public int getAdapterPositionAt(int index) { 275 return 0; 276 } 277 278 @Override 279 public int getColumnCount() { 280 return 0; 281 } 282 283 @Override 284 public int getChildCount() { 285 return 0; 286 } 287 288 @Override 289 public int getVisibleChildCount() { 290 return 0; 291 } 292 293 @Override 294 public boolean hasView(int adapterPosition) { 295 return false; 296 } 297 } 298 } 299