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.settings.display;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.ArgumentMatchers.any;
22 import static org.mockito.ArgumentMatchers.anyInt;
23 import static org.mockito.Mockito.doReturn;
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.when;
26 
27 import android.content.Context;
28 import android.content.Intent;
29 import android.content.pm.ActivityInfo;
30 import android.content.pm.ApplicationInfo;
31 import android.content.pm.PackageManager;
32 import android.content.pm.ResolveInfo;
33 import android.graphics.drawable.Drawable;
34 import android.util.AttributeSet;
35 import android.util.IconDrawableFactory;
36 
37 import com.android.settings.R;
38 
39 import org.junit.Before;
40 import org.junit.Test;
41 import org.junit.runner.RunWith;
42 import org.mockito.Mock;
43 import org.mockito.MockitoAnnotations;
44 import org.robolectric.Robolectric;
45 import org.robolectric.RobolectricTestRunner;
46 import org.robolectric.RuntimeEnvironment;
47 
48 import java.util.ArrayList;
49 import java.util.List;
50 
51 /**
52  * Tests for {@link AppGridView}.
53  */
54 @RunWith(RobolectricTestRunner.class)
55 public class AppGridViewTest {
56 
57     @Mock
58     private ResolveInfo mInfo;
59     @Mock
60     private ActivityInfo mActivityInfo;
61     @Mock
62     private ApplicationInfo mApplicationInfo;
63     @Mock
64     private Drawable mIcon;
65     @Mock
66     private PackageManager mPackageManager;
67     private Context mContext;
68     private IconDrawableFactory mIconFactory;
69 
70     @Before
setUp()71     public void setUp() {
72         MockitoAnnotations.initMocks(this);
73         mInfo.activityInfo = mActivityInfo;
74         mInfo.activityInfo.applicationInfo = mApplicationInfo;
75         mContext = spy(RuntimeEnvironment.application);
76         doReturn(mPackageManager).when(mContext).getPackageManager();
77         mIconFactory = IconDrawableFactory.newInstance(mContext);
78     }
79 
80     @Test
appEntry_shouldLoadIcon()81     public void appEntry_shouldLoadIcon() {
82         when(mPackageManager.loadUnbadgedItemIcon(mActivityInfo, mApplicationInfo))
83             .thenReturn(mIcon);
84         final AppGridView.ActivityEntry activityEntry =
85             new AppGridView.ActivityEntry(mInfo, "label", mIconFactory);
86 
87         assertThat(activityEntry.label).isEqualTo("label");
88         assertThat(activityEntry.getIcon()).isNotNull();
89     }
90 
91     @Test
appEntry_compare_shouldCompareIgnoreCase()92     public void appEntry_compare_shouldCompareIgnoreCase() {
93         final AppGridView.ActivityEntry entry1 =
94             new AppGridView.ActivityEntry(mInfo, "label", mIconFactory);
95         final AppGridView.ActivityEntry entry2 =
96             new AppGridView.ActivityEntry(mInfo, "LABEL", mIconFactory);
97         final AppGridView.ActivityEntry entry3 =
98             new AppGridView.ActivityEntry(mInfo, "label2", mIconFactory);
99 
100         assertThat(entry1.compareTo(entry2)).isEqualTo(0);
101         assertThat(entry1.compareTo(entry3)).isNotEqualTo(0);
102     }
103 
104     @Test
noAppCountAttribute_matchListSize()105     public void noAppCountAttribute_matchListSize() {
106         final int appCountFromSystem = 8;
107         setUpResolveInfos(appCountFromSystem);
108 
109         final AppGridView appGridView = new AppGridView(mContext, /* attrs= */ null);
110 
111         assertThat(appGridView.getAdapter().getCount()).isEqualTo(/* expected= */ 6);
112     }
113 
114     @Test
setAppCountAttribute_matchListSize()115     public void setAppCountAttribute_matchListSize() {
116         final int appCountFromSystem = 8;
117         final int appCountFromAttr = 7;
118         setUpResolveInfos(appCountFromSystem);
119 
120         final AppGridView appGridView =
121                 new AppGridView(mContext, createAttributeSet(appCountFromAttr));
122 
123         assertThat(appGridView.getAdapter().getCount()).isEqualTo(appCountFromAttr);
124     }
125 
126     @Test(expected = IllegalArgumentException.class)
setAppCountAttribute_belowLowerBound_matchListSize()127     public void setAppCountAttribute_belowLowerBound_matchListSize() {
128         final int appCountFromSystem = 9;
129         final int appCountFromAttr = -1; // The num is just for the test.
130         setUpResolveInfos(appCountFromSystem);
131 
132         new AppGridView(mContext, createAttributeSet(appCountFromAttr));
133     }
134 
135     @Test
setAppCountAttribute_aboveUpperBound_matchListSize()136     public void setAppCountAttribute_aboveUpperBound_matchListSize() {
137         final int appCountFromSystem = 10;
138         final int appCountFromAttr = 15;
139         setUpResolveInfos(appCountFromSystem);
140 
141         final AppGridView appGridView =
142                 new AppGridView(mContext, createAttributeSet(appCountFromAttr));
143 
144         assertThat(appGridView.getAdapter().getCount()).isEqualTo(appCountFromSystem);
145     }
146 
createAttributeSet(int appCount)147     private AttributeSet createAttributeSet(int appCount) {
148         return Robolectric.buildAttributeSet()
149                 .addAttribute(R.attr.appCount, String.valueOf(appCount))
150                 .build();
151     }
152 
setUpResolveInfos(int appCount)153     private void setUpResolveInfos(int appCount) {
154         when(mContext.getPackageManager().queryIntentActivities(
155                 any(Intent.class), anyInt()))
156                 .thenReturn(createFakeResolveInfos(appCount));
157     }
158 
createFakeResolveInfos(int count)159     private List<ResolveInfo> createFakeResolveInfos(int count) {
160         final List<ResolveInfo> list = new ArrayList<>();
161 
162         for (int i = 0; i < count; i++) {
163             final ResolveInfo info = new ResolveInfo();
164             info.nonLocalizedLabel = String.valueOf(i);
165 
166             list.add(info);
167         }
168 
169         return list;
170     }
171 }
172