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 */ 16package com.android.settings.dashboard.conditional; 17 18import android.content.Context; 19import android.support.v7.widget.RecyclerView; 20import android.view.LayoutInflater; 21import android.view.View; 22import android.widget.LinearLayout; 23 24import com.android.settings.R; 25import com.android.settings.testutils.SettingsRobolectricTestRunner; 26import com.android.settings.TestConfig; 27import com.android.settings.dashboard.DashboardAdapter; 28import com.android.settings.dashboard.DashboardData; 29 30import java.util.ArrayList; 31import java.util.List; 32 33import org.junit.Before; 34import org.junit.Test; 35import org.junit.runner.RunWith; 36import org.mockito.Mock; 37import org.mockito.MockitoAnnotations; 38import org.robolectric.RuntimeEnvironment; 39import org.robolectric.annotation.Config; 40 41import static com.google.common.truth.Truth.assertThat; 42import static org.mockito.Mockito.verify; 43import static org.mockito.Mockito.when; 44 45@RunWith(SettingsRobolectricTestRunner.class) 46@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 47public class ConditionAdapterTest { 48 @Mock 49 private Condition mCondition1; 50 @Mock 51 private Condition mCondition2; 52 53 private Context mContext; 54 private ConditionAdapter mConditionAdapter; 55 private List<Condition> mOneCondition; 56 private List<Condition> mTwoConditions; 57 58 @Before 59 public void setUp() { 60 MockitoAnnotations.initMocks(this); 61 mContext = RuntimeEnvironment.application; 62 final CharSequence[] actions = new CharSequence[2]; 63 when(mCondition1.getActions()).thenReturn(actions); 64 when(mCondition1.shouldShow()).thenReturn(true); 65 mOneCondition = new ArrayList<>(); 66 mOneCondition.add(mCondition1); 67 mTwoConditions = new ArrayList<>(); 68 mTwoConditions.add(mCondition1); 69 mTwoConditions.add(mCondition2); 70 } 71 72 @Test 73 public void getItemCount_notFullyExpanded_shouldReturn0() { 74 mConditionAdapter = new ConditionAdapter( 75 mContext, mOneCondition, DashboardData.HEADER_MODE_DEFAULT); 76 assertThat(mConditionAdapter.getItemCount()).isEqualTo(0); 77 78 mConditionAdapter = new ConditionAdapter( 79 mContext, mOneCondition, DashboardData.HEADER_MODE_SUGGESTION_EXPANDED); 80 assertThat(mConditionAdapter.getItemCount()).isEqualTo(0); 81 82 mConditionAdapter = new ConditionAdapter( 83 mContext, mOneCondition, DashboardData.HEADER_MODE_COLLAPSED); 84 assertThat(mConditionAdapter.getItemCount()).isEqualTo(0); 85 } 86 87 @Test 88 public void getItemCount_fullyExpanded_shouldReturnListSize() { 89 mConditionAdapter = new ConditionAdapter( 90 mContext, mOneCondition, DashboardData.HEADER_MODE_FULLY_EXPANDED); 91 assertThat(mConditionAdapter.getItemCount()).isEqualTo(1); 92 93 mConditionAdapter = new ConditionAdapter( 94 mContext, mTwoConditions, DashboardData.HEADER_MODE_FULLY_EXPANDED); 95 assertThat(mConditionAdapter.getItemCount()).isEqualTo(2); 96 } 97 98 @Test 99 public void getItemViewType_shouldReturnConditionTile() { 100 mConditionAdapter = new ConditionAdapter( 101 mContext, mTwoConditions, DashboardData.HEADER_MODE_FULLY_EXPANDED); 102 assertThat(mConditionAdapter.getItemViewType(0)).isEqualTo(R.layout.condition_tile); 103 } 104 105 @Test 106 public void onBindViewHolder_shouldSetListener() { 107 final View view = LayoutInflater.from(mContext).inflate( 108 R.layout.condition_tile, new LinearLayout(mContext), true); 109 final DashboardAdapter.DashboardItemHolder viewHolder = 110 new DashboardAdapter.DashboardItemHolder(view); 111 mConditionAdapter = new ConditionAdapter( 112 mContext, mOneCondition, DashboardData.HEADER_MODE_SUGGESTION_EXPANDED); 113 114 mConditionAdapter.onBindViewHolder(viewHolder, 0); 115 final View card = view.findViewById(R.id.content); 116 assertThat(card.hasOnClickListeners()).isTrue(); 117 } 118 119 @Test 120 public void viewClick_shouldInvokeConditionPrimaryClick() { 121 final View view = LayoutInflater.from(mContext).inflate( 122 R.layout.condition_tile, new LinearLayout(mContext), true); 123 final DashboardAdapter.DashboardItemHolder viewHolder = 124 new DashboardAdapter.DashboardItemHolder(view); 125 mConditionAdapter = new ConditionAdapter( 126 mContext, mOneCondition, DashboardData.HEADER_MODE_SUGGESTION_EXPANDED); 127 128 mConditionAdapter.onBindViewHolder(viewHolder, 0); 129 final View card = view.findViewById(R.id.content); 130 card.performClick(); 131 verify(mCondition1).onPrimaryClick(); 132 } 133 134 @Test 135 public void onSwiped_nullCondition_shouldNotCrash() { 136 final RecyclerView recyclerView = new RecyclerView(mContext); 137 final View view = LayoutInflater.from(mContext).inflate( 138 R.layout.condition_tile, new LinearLayout(mContext), true); 139 final DashboardAdapter.DashboardItemHolder viewHolder = 140 new DashboardAdapter.DashboardItemHolder(view); 141 mConditionAdapter = new ConditionAdapter( 142 mContext, mOneCondition, DashboardData.HEADER_MODE_SUGGESTION_EXPANDED); 143 mConditionAdapter.addDismissHandling(recyclerView); 144 145 // do not bind viewholder to simulate the null condition scenario 146 mConditionAdapter.mSwipeCallback.onSwiped(viewHolder, 0); 147 // no crash 148 } 149 150} 151