ListRowDataAdapterTest.java revision 5d196663056735d8f1453ed3aeab75e8d922a159
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 */
16package android.support.v17.leanback.app;
17
18import static org.junit.Assert.assertEquals;
19import static org.mockito.Matchers.anyInt;
20import static org.mockito.Mockito.times;
21import static org.mockito.Mockito.verify;
22
23import android.support.test.filters.SmallTest;
24import android.support.test.runner.AndroidJUnit4;
25import android.support.v17.leanback.widget.ArrayObjectAdapter;
26import android.support.v17.leanback.widget.DividerRow;
27import android.support.v17.leanback.widget.HeaderItem;
28import android.support.v17.leanback.widget.ListRow;
29import android.support.v17.leanback.widget.ObjectAdapter;
30import android.support.v17.leanback.widget.PresenterSelector;
31import android.support.v17.leanback.widget.SectionRow;
32
33import org.junit.Before;
34import org.junit.Test;
35import org.junit.runner.RunWith;
36import org.mockito.Mock;
37import org.mockito.Mockito;
38import org.mockito.MockitoAnnotations;
39
40import java.util.ArrayList;
41import java.util.List;
42
43/**
44 * Unit test for {@link ListRowDataAdapter} class.
45 */
46@RunWith(AndroidJUnit4.class)
47@SmallTest
48public class ListRowDataAdapterTest {
49    @Mock
50    private PresenterSelector presenterSelector;
51    @Mock
52    private ObjectAdapter.DataObserver dataObserver;
53
54    @Before
55    public void setUp() throws Exception {
56        MockitoAnnotations.initMocks(this);
57    }
58
59    @Test
60    public void itemRangeChangedTest() {
61        int itemCount = 4;
62        ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
63        adapter.add(new SectionRow("section 1"));
64        for (int i = 0; i < itemCount; i++) {
65            HeaderItem headerItem = new HeaderItem(i, "header "+i);
66            adapter.add(new ListRow(headerItem, createListRowAdapter()));
67        }
68
69        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
70        listRowDataAdapter.registerObserver(dataObserver);
71        SectionRow sectionRow = new SectionRow("section 11");
72        adapter.replace(0, sectionRow);
73
74        verify(dataObserver, times(1)).onItemRangeChanged(0, 1);
75        assertEquals(5, listRowDataAdapter.size());
76    }
77
78    @Test
79    public void adapterSize_nonVisibleRowPresent() {
80        int itemCount = 4;
81        ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
82        adapter.add(new SectionRow("section 1"));
83        for (int i = 0; i < itemCount; i++) {
84            HeaderItem headerItem = new HeaderItem(i, "header "+i);
85            adapter.add(new ListRow(headerItem, createListRowAdapter()));
86        }
87
88        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
89        assertEquals(5, listRowDataAdapter.size());
90
91        List<DividerRow> invisibleRows = new ArrayList<>();
92        invisibleRows.add(new DividerRow());
93        invisibleRows.add(new DividerRow());
94        adapter.addAll(5, invisibleRows);
95        verify(dataObserver, times(0)).onItemRangeInserted(anyInt(), anyInt());
96        assertEquals(5, listRowDataAdapter.size());
97    }
98
99    @Test
100    public void adapterSize_visibleRowInserted() {
101        int itemCount = 4;
102        ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
103        adapter.add(new SectionRow("section 1"));
104        for (int i = 0; i < itemCount; i++) {
105            HeaderItem headerItem = new HeaderItem(i, "header "+i);
106            adapter.add(new ListRow(headerItem, createListRowAdapter()));
107        }
108
109        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
110        assertEquals(5, listRowDataAdapter.size());
111
112        listRowDataAdapter.registerObserver(dataObserver);
113        List<ListRow> visibleRows = new ArrayList<>();
114        visibleRows.add(new ListRow(new HeaderItem(0, "Header 51"), createListRowAdapter()));
115        visibleRows.add(new ListRow(new HeaderItem(0, "Header 52"), createListRowAdapter()));
116        visibleRows.add(new ListRow(new HeaderItem(0, "Header 53"), createListRowAdapter()));
117        adapter.addAll(2, visibleRows);
118        verify(dataObserver, times(1)).onItemRangeInserted(2, 3);
119        assertEquals(8, listRowDataAdapter.size());
120    }
121
122    @Test
123    public void adapterSize_nonVisibleRowInserted() {
124        int itemCount = 4;
125        ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
126        adapter.add(new SectionRow("section 1"));
127        for (int i = 0; i < itemCount; i++) {
128            HeaderItem headerItem = new HeaderItem(i, "header "+i);
129            adapter.add(new ListRow(headerItem, createListRowAdapter()));
130        }
131
132        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
133        assertEquals(5, listRowDataAdapter.size());
134
135        List<DividerRow> invisibleRows = new ArrayList<>();
136        invisibleRows.add(new DividerRow());
137        invisibleRows.add(new DividerRow());
138
139        listRowDataAdapter.registerObserver(dataObserver);
140        adapter.addAll(adapter.size(), invisibleRows);
141        verify(dataObserver, times(0)).onItemRangeInserted(anyInt(), anyInt());
142        assertEquals(5, listRowDataAdapter.size());
143
144        adapter.add(new DividerRow());
145        verify(dataObserver, times(0)).onItemRangeInserted(anyInt(), anyInt());
146        assertEquals(5, listRowDataAdapter.size());
147
148        adapter.add(new ListRow(new HeaderItem(0, "Header 5"), createListRowAdapter()));
149        verify(dataObserver, times(1)).onItemRangeInserted(5, 4);
150        assertEquals(9, listRowDataAdapter.size());
151    }
152
153    @Test
154    public void adapterSize_visibleRowRemoved() {
155        int itemCount = 4;
156        ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
157        adapter.add(new SectionRow("section 1"));
158        for (int i = 0; i < itemCount; i++) {
159            HeaderItem headerItem = new HeaderItem(i, "header "+i);
160            adapter.add(new ListRow(headerItem, createListRowAdapter()));
161        }
162
163        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
164        assertEquals(5, listRowDataAdapter.size());
165        adapter.add(new DividerRow());
166        assertEquals(5, listRowDataAdapter.size());
167
168        listRowDataAdapter.registerObserver(dataObserver);
169        adapter.removeItems(2, 2);
170        verify(dataObserver, times(1)).onItemRangeRemoved(2, 2);
171        assertEquals(3, listRowDataAdapter.size());
172    }
173
174    @Test
175    public void adapterSize_nonVisibleRowRemoved() {
176        int itemCount = 4;
177        ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
178        adapter.add(new SectionRow("section 1"));
179        for (int i = 0; i < itemCount; i++) {
180            HeaderItem headerItem = new HeaderItem(i, "header "+i);
181            adapter.add(new ListRow(headerItem, createListRowAdapter()));
182        }
183
184        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
185        assertEquals(5, listRowDataAdapter.size());
186        adapter.add(new DividerRow());
187        assertEquals(5, listRowDataAdapter.size());
188
189        listRowDataAdapter.registerObserver(dataObserver);
190        adapter.removeItems(4, 1);
191        verify(dataObserver, times(1)).onItemRangeRemoved(4, 1);
192        assertEquals(4, listRowDataAdapter.size());
193
194        adapter.removeItems(4, 1);
195        verify(dataObserver, times(0)).onItemRangeInserted(anyInt(), anyInt());
196        assertEquals(4, listRowDataAdapter.size());
197    }
198
199    @Test
200    public void adapterSize_rowsRemoveAll() {
201        ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
202        adapter.add(new SectionRow("section 1"));
203        for (int i = 0; i < 4; i++) {
204            HeaderItem headerItem = new HeaderItem(i, "header "+i);
205            adapter.add(new ListRow(headerItem, createListRowAdapter()));
206        }
207
208        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
209        assertEquals(5, listRowDataAdapter.size());
210
211        adapter.clear();
212        assertEquals(0, listRowDataAdapter.size());
213
214        HeaderItem headerItem = new HeaderItem(10, "header "+10);
215        adapter.add(new ListRow(headerItem, createListRowAdapter()));
216        assertEquals(1, listRowDataAdapter.size());
217    }
218
219    @Test
220    public void adapterSize_rowsRemoved() {
221        int itemCount = 4;
222        ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
223        adapter.add(new SectionRow("section 1"));
224        for (int i = 0; i < itemCount; i++) {
225            HeaderItem headerItem = new HeaderItem(i, "header "+i);
226            adapter.add(new ListRow(headerItem, createListRowAdapter()));
227        }
228
229        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
230        assertEquals(5, listRowDataAdapter.size());
231
232        adapter.add(new DividerRow());
233        assertEquals(5, listRowDataAdapter.size());
234
235        listRowDataAdapter.registerObserver(dataObserver);
236        adapter.removeItems(3, 3);
237        verify(dataObserver, times(1)).onItemRangeRemoved(3, 2);
238        assertEquals(3, listRowDataAdapter.size());
239    }
240
241    @Test
242    public void customObjectAdapterTest() {
243        int itemCount = 4;
244        ArrayObjectAdapter adapter = new CustomAdapter(presenterSelector);
245        adapter.add(new SectionRow("section 1"));
246        for (int i = 0; i < itemCount; i++) {
247            HeaderItem headerItem = new HeaderItem(i, "header "+i);
248            adapter.add(new ListRow(headerItem, createListRowAdapter()));
249        }
250
251        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
252        assertEquals(5, listRowDataAdapter.size());
253
254        adapter.add(new DividerRow());
255        assertEquals(5, listRowDataAdapter.size());
256
257        listRowDataAdapter.registerObserver(dataObserver);
258        adapter.removeItems(3, 3);
259        verify(dataObserver, times(1)).onChanged();
260        assertEquals(3, listRowDataAdapter.size());
261
262        Mockito.reset(dataObserver);
263        adapter.add(new DividerRow());
264        verify(dataObserver, times(1)).onChanged();
265        assertEquals(3, listRowDataAdapter.size());
266    }
267
268    private ArrayObjectAdapter createListRowAdapter() {
269        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenterSelector);
270        listRowAdapter.add(new Integer(1));
271        listRowAdapter.add(new Integer(2));
272        return listRowAdapter;
273    }
274
275    private class CustomAdapter extends ArrayObjectAdapter {
276
277        public CustomAdapter(PresenterSelector selector) {
278            super(selector);
279        }
280
281        @Override
282        public boolean isImmediateNotifySupported() {
283            return false;
284        }
285    }
286}
287