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