1 /*
2  * Copyright (C) 2016 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.tv.dvr.ui;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 import static com.google.common.truth.Truth.assertWithMessage;
21 
22 import androidx.leanback.widget.ClassPresenterSelector;
23 import androidx.leanback.widget.ObjectAdapter;
24 
25 import com.android.tv.testing.constants.ConfigConstants;
26 
27 import org.junit.Before;
28 import org.junit.Test;
29 import org.junit.runner.RunWith;
30 import org.robolectric.RobolectricTestRunner;
31 import org.robolectric.annotation.Config;
32 
33 import java.util.Arrays;
34 import java.util.Comparator;
35 import java.util.Objects;
36 
37 /** Tests for {@link SortedArrayAdapter}. */
38 @RunWith(RobolectricTestRunner.class)
39 @Config(sdk = ConfigConstants.SDK)
40 public class SortedArrayAdapterTest {
41     public static final TestData P1 = TestData.create(1, "c");
42     public static final TestData P2 = TestData.create(2, "b");
43     public static final TestData P3 = TestData.create(3, "a");
44     public static final TestData EXTRA = TestData.create(4, "k");
45     private TestSortedArrayAdapter mAdapter;
46 
47     @Before
setUp()48     public void setUp() {
49         mAdapter = new TestSortedArrayAdapter(Integer.MAX_VALUE, null);
50     }
51 
52     @Test
testContents_empty()53     public void testContents_empty() {
54         assertEmpty();
55     }
56 
57     @Test
testAdd_one()58     public void testAdd_one() {
59         mAdapter.add(P1);
60         assertNotEmpty();
61         assertContentsInOrder(mAdapter, P1);
62     }
63 
64     @Test
testAdd_two()65     public void testAdd_two() {
66         mAdapter.add(P1);
67         mAdapter.add(P2);
68         assertNotEmpty();
69         assertContentsInOrder(mAdapter, P2, P1);
70     }
71 
72     @Test
testSetInitialItems_two()73     public void testSetInitialItems_two() {
74         mAdapter.setInitialItems(Arrays.asList(P1, P2));
75         assertNotEmpty();
76         assertContentsInOrder(mAdapter, P2, P1);
77     }
78 
79     @Test
testMaxInitialCount()80     public void testMaxInitialCount() {
81         mAdapter = new TestSortedArrayAdapter(1, null);
82         mAdapter.setInitialItems(Arrays.asList(P1, P2));
83         assertNotEmpty();
84         assertThat(mAdapter.size()).isEqualTo(1);
85         assertThat(mAdapter.get(0)).isEqualTo(P2);
86     }
87 
88     @Test
testExtraItem()89     public void testExtraItem() {
90         mAdapter = new TestSortedArrayAdapter(Integer.MAX_VALUE, EXTRA);
91         mAdapter.setInitialItems(Arrays.asList(P1, P2));
92         assertNotEmpty();
93         assertThat(mAdapter.size()).isEqualTo(3);
94         assertThat(mAdapter.get(0)).isEqualTo(P2);
95         assertThat(mAdapter.get(2)).isEqualTo(EXTRA);
96         mAdapter.remove(P2);
97         mAdapter.remove(P1);
98         assertThat(mAdapter.size()).isEqualTo(1);
99         assertThat(mAdapter.get(0)).isEqualTo(EXTRA);
100     }
101 
102     @Test
testExtraItemWithMaxCount()103     public void testExtraItemWithMaxCount() {
104         mAdapter = new TestSortedArrayAdapter(1, EXTRA);
105         mAdapter.setInitialItems(Arrays.asList(P1, P2));
106         assertNotEmpty();
107         assertThat(mAdapter.size()).isEqualTo(2);
108         assertThat(mAdapter.get(0)).isEqualTo(P2);
109         assertThat(mAdapter.get(1)).isEqualTo(EXTRA);
110         mAdapter.remove(P2);
111         assertThat(mAdapter.size()).isEqualTo(1);
112         assertThat(mAdapter.get(0)).isEqualTo(EXTRA);
113     }
114 
115     @Test
testRemove()116     public void testRemove() {
117         mAdapter.add(P1);
118         mAdapter.add(P2);
119         assertNotEmpty();
120         assertContentsInOrder(mAdapter, P2, P1);
121         mAdapter.remove(P3);
122         assertContentsInOrder(mAdapter, P2, P1);
123         mAdapter.remove(P2);
124         assertContentsInOrder(mAdapter, P1);
125         mAdapter.remove(P1);
126         assertEmpty();
127         mAdapter.add(P1);
128         mAdapter.add(P2);
129         mAdapter.add(P3);
130         assertContentsInOrder(mAdapter, P3, P2, P1);
131         mAdapter.removeItems(0, 2);
132         assertContentsInOrder(mAdapter, P1);
133         mAdapter.add(P2);
134         mAdapter.add(P3);
135         mAdapter.addExtraItem(EXTRA);
136         assertContentsInOrder(mAdapter, P3, P2, P1, EXTRA);
137         mAdapter.removeItems(1, 1);
138         assertContentsInOrder(mAdapter, P3, P1, EXTRA);
139         mAdapter.removeItems(1, 2);
140         assertContentsInOrder(mAdapter, P3);
141         mAdapter.addExtraItem(EXTRA);
142         mAdapter.addExtraItem(P2);
143         mAdapter.add(P1);
144         assertContentsInOrder(mAdapter, P3, P1, EXTRA, P2);
145         mAdapter.removeItems(1, 2);
146         assertContentsInOrder(mAdapter, P3, P2);
147         mAdapter.add(P1);
148         assertContentsInOrder(mAdapter, P3, P1, P2);
149     }
150 
151     @Test
testReplace()152     public void testReplace() {
153         mAdapter.add(P1);
154         mAdapter.add(P2);
155         assertNotEmpty();
156         assertContentsInOrder(mAdapter, P2, P1);
157         mAdapter.replace(1, P3);
158         assertContentsInOrder(mAdapter, P3, P2);
159         mAdapter.replace(0, P1);
160         assertContentsInOrder(mAdapter, P2, P1);
161         mAdapter.addExtraItem(EXTRA);
162         assertContentsInOrder(mAdapter, P2, P1, EXTRA);
163         mAdapter.replace(2, P3);
164         assertContentsInOrder(mAdapter, P2, P1, P3);
165     }
166 
167     @Test
testChange_sorting()168     public void testChange_sorting() {
169         TestData p2_changed = TestData.create(2, "z changed");
170         mAdapter.add(P1);
171         mAdapter.add(P2);
172         assertNotEmpty();
173         assertContentsInOrder(mAdapter, P2, P1);
174         mAdapter.change(p2_changed);
175         assertContentsInOrder(mAdapter, P1, p2_changed);
176     }
177 
178     @Test
testChange_new()179     public void testChange_new() {
180         mAdapter.change(P1);
181         assertNotEmpty();
182         assertContentsInOrder(mAdapter, P1);
183     }
184 
assertEmpty()185     private void assertEmpty() {
186         assertWithMessage("empty").that(mAdapter.isEmpty()).isTrue();
187     }
188 
assertNotEmpty()189     private void assertNotEmpty() {
190         assertWithMessage("empty").that(mAdapter.isEmpty()).isFalse();
191     }
192 
assertContentsInOrder(ObjectAdapter adapter, Object... contents)193     private static void assertContentsInOrder(ObjectAdapter adapter, Object... contents) {
194         int ex = contents.length;
195         assertWithMessage("size").that(adapter.size()).isEqualTo(ex);
196         for (int i = 0; i < ex; i++) {
197             assertWithMessage("element " + 1).that(adapter.get(i)).isEqualTo(contents[i]);
198         }
199     }
200 
201     private static class TestData {
202         @Override
toString()203         public String toString() {
204             return "TestData[" + mId + "]{" + mText + '}';
205         }
206 
create(long first, String text)207         static TestData create(long first, String text) {
208             return new TestData(first, text);
209         }
210 
211         private final long mId;
212         private final String mText;
213 
TestData(long id, String second)214         private TestData(long id, String second) {
215             this.mId = id;
216             this.mText = second;
217         }
218 
219         @Override
equals(Object o)220         public boolean equals(Object o) {
221             if (this == o) return true;
222             if (!(o instanceof TestData)) return false;
223             TestData that = (TestData) o;
224             return mId == that.mId && Objects.equals(mText, that.mText);
225         }
226 
227         @Override
hashCode()228         public int hashCode() {
229             return Objects.hash(mId, mText);
230         }
231     }
232 
233     private static class TestSortedArrayAdapter extends SortedArrayAdapter<TestData> {
234 
235         private static final Comparator<TestData> TEXT_COMPARATOR =
236                 new Comparator<TestData>() {
237                     @Override
238                     public int compare(TestData lhs, TestData rhs) {
239                         return lhs.mText.compareTo(rhs.mText);
240                     }
241                 };
242 
TestSortedArrayAdapter(int maxInitialCount, Object extra)243         TestSortedArrayAdapter(int maxInitialCount, Object extra) {
244             super(new ClassPresenterSelector(), TEXT_COMPARATOR, maxInitialCount);
245             if (extra != null) {
246                 addExtraItem((TestData) extra);
247             }
248         }
249 
250         @Override
getId(TestData item)251         protected long getId(TestData item) {
252             return item.mId;
253         }
254     }
255 }
256