Home | History | Annotate | Download | only in selection
      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