1754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas/* 2754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * Copyright (C) 2016 The Android Open Source Project 3754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * 4754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * Licensed under the Apache License, Version 2.0 (the "License"); 5754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * you may not use this file except in compliance with the License. 6754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * You may obtain a copy of the License at 7754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * 8754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * http://www.apache.org/licenses/LICENSE-2.0 9754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * 10754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * Unless required by applicable law or agreed to in writing, software 11754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * distributed under the License is distributed on an "AS IS" BASIS, 12754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * See the License for the specific language governing permissions and 14754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas * limitations under the License. 15754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas */ 16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.leanback.app; 17b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 18754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.junit.Assert.assertEquals; 19754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Matchers.anyInt; 20754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.times; 21754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.verify; 22754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas 2335232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikasimport android.support.test.filters.MediumTest; 24754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.SmallTest; 25754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.runner.AndroidJUnit4; 268619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikas 27ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ArrayObjectAdapter; 28ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.DividerRow; 29ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.HeaderItem; 30ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ListRow; 31ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ObjectAdapter; 32ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.PresenterSelector; 33ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.SectionRow; 34754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas 35b3756c53c5be55e8c8a2f6e2cda264407be84881susnataimport org.junit.Before; 36b3756c53c5be55e8c8a2f6e2cda264407be84881susnataimport org.junit.Test; 37b3756c53c5be55e8c8a2f6e2cda264407be84881susnataimport org.junit.runner.RunWith; 38b3756c53c5be55e8c8a2f6e2cda264407be84881susnataimport org.mockito.Mock; 39dbac8f49866ec226152849e7d3ace3e8263de1e4susnataimport org.mockito.Mockito; 40b3756c53c5be55e8c8a2f6e2cda264407be84881susnataimport org.mockito.MockitoAnnotations; 41b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 42dbac8f49866ec226152849e7d3ace3e8263de1e4susnataimport java.util.ArrayList; 43dbac8f49866ec226152849e7d3ace3e8263de1e4susnataimport java.util.List; 44dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 45b3756c53c5be55e8c8a2f6e2cda264407be84881susnata/** 46b3756c53c5be55e8c8a2f6e2cda264407be84881susnata * Unit test for {@link ListRowDataAdapter} class. 47b3756c53c5be55e8c8a2f6e2cda264407be84881susnata */ 48dbac8f49866ec226152849e7d3ace3e8263de1e4susnata@RunWith(AndroidJUnit4.class) 49b3756c53c5be55e8c8a2f6e2cda264407be84881susnatapublic class ListRowDataAdapterTest { 50b3756c53c5be55e8c8a2f6e2cda264407be84881susnata @Mock 51b3756c53c5be55e8c8a2f6e2cda264407be84881susnata private PresenterSelector presenterSelector; 52dbac8f49866ec226152849e7d3ace3e8263de1e4susnata @Mock 53dbac8f49866ec226152849e7d3ace3e8263de1e4susnata private ObjectAdapter.DataObserver dataObserver; 54b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 55b3756c53c5be55e8c8a2f6e2cda264407be84881susnata @Before 56b3756c53c5be55e8c8a2f6e2cda264407be84881susnata public void setUp() throws Exception { 57b3756c53c5be55e8c8a2f6e2cda264407be84881susnata MockitoAnnotations.initMocks(this); 58b3756c53c5be55e8c8a2f6e2cda264407be84881susnata } 59b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 6035232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @SmallTest 61b3756c53c5be55e8c8a2f6e2cda264407be84881susnata @Test 62dbac8f49866ec226152849e7d3ace3e8263de1e4susnata public void itemRangeChangedTest() { 63dbac8f49866ec226152849e7d3ace3e8263de1e4susnata int itemCount = 4; 64dbac8f49866ec226152849e7d3ace3e8263de1e4susnata ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector); 65dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.add(new SectionRow("section 1")); 66dbac8f49866ec226152849e7d3ace3e8263de1e4susnata for (int i = 0; i < itemCount; i++) { 67dbac8f49866ec226152849e7d3ace3e8263de1e4susnata HeaderItem headerItem = new HeaderItem(i, "header "+i); 68dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.add(new ListRow(headerItem, createListRowAdapter())); 69dbac8f49866ec226152849e7d3ace3e8263de1e4susnata } 70dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 71dbac8f49866ec226152849e7d3ace3e8263de1e4susnata ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter); 72dbac8f49866ec226152849e7d3ace3e8263de1e4susnata listRowDataAdapter.registerObserver(dataObserver); 73dbac8f49866ec226152849e7d3ace3e8263de1e4susnata SectionRow sectionRow = new SectionRow("section 11"); 74dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.replace(0, sectionRow); 75dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 76dbac8f49866ec226152849e7d3ace3e8263de1e4susnata verify(dataObserver, times(1)).onItemRangeChanged(0, 1); 77dbac8f49866ec226152849e7d3ace3e8263de1e4susnata assertEquals(5, listRowDataAdapter.size()); 78dbac8f49866ec226152849e7d3ace3e8263de1e4susnata } 79dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 8035232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @SmallTest 81dbac8f49866ec226152849e7d3ace3e8263de1e4susnata @Test 82b3756c53c5be55e8c8a2f6e2cda264407be84881susnata public void adapterSize_nonVisibleRowPresent() { 83dbac8f49866ec226152849e7d3ace3e8263de1e4susnata int itemCount = 4; 84b3756c53c5be55e8c8a2f6e2cda264407be84881susnata ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector); 85b3756c53c5be55e8c8a2f6e2cda264407be84881susnata adapter.add(new SectionRow("section 1")); 86dbac8f49866ec226152849e7d3ace3e8263de1e4susnata for (int i = 0; i < itemCount; i++) { 87b3756c53c5be55e8c8a2f6e2cda264407be84881susnata HeaderItem headerItem = new HeaderItem(i, "header "+i); 88b3756c53c5be55e8c8a2f6e2cda264407be84881susnata adapter.add(new ListRow(headerItem, createListRowAdapter())); 89b3756c53c5be55e8c8a2f6e2cda264407be84881susnata } 90b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 91b3756c53c5be55e8c8a2f6e2cda264407be84881susnata ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter); 92b3756c53c5be55e8c8a2f6e2cda264407be84881susnata assertEquals(5, listRowDataAdapter.size()); 93b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 94dbac8f49866ec226152849e7d3ace3e8263de1e4susnata List<DividerRow> invisibleRows = new ArrayList<>(); 95dbac8f49866ec226152849e7d3ace3e8263de1e4susnata invisibleRows.add(new DividerRow()); 96dbac8f49866ec226152849e7d3ace3e8263de1e4susnata invisibleRows.add(new DividerRow()); 97dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.addAll(5, invisibleRows); 98dbac8f49866ec226152849e7d3ace3e8263de1e4susnata verify(dataObserver, times(0)).onItemRangeInserted(anyInt(), anyInt()); 99b3756c53c5be55e8c8a2f6e2cda264407be84881susnata assertEquals(5, listRowDataAdapter.size()); 100dbac8f49866ec226152849e7d3ace3e8263de1e4susnata } 101b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 10235232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @SmallTest 103dbac8f49866ec226152849e7d3ace3e8263de1e4susnata @Test 104dbac8f49866ec226152849e7d3ace3e8263de1e4susnata public void adapterSize_visibleRowInserted() { 105dbac8f49866ec226152849e7d3ace3e8263de1e4susnata int itemCount = 4; 106dbac8f49866ec226152849e7d3ace3e8263de1e4susnata ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector); 107dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.add(new SectionRow("section 1")); 108dbac8f49866ec226152849e7d3ace3e8263de1e4susnata for (int i = 0; i < itemCount; i++) { 109dbac8f49866ec226152849e7d3ace3e8263de1e4susnata HeaderItem headerItem = new HeaderItem(i, "header "+i); 110dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.add(new ListRow(headerItem, createListRowAdapter())); 111dbac8f49866ec226152849e7d3ace3e8263de1e4susnata } 112dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 113dbac8f49866ec226152849e7d3ace3e8263de1e4susnata ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter); 114b3756c53c5be55e8c8a2f6e2cda264407be84881susnata assertEquals(5, listRowDataAdapter.size()); 115dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 116dbac8f49866ec226152849e7d3ace3e8263de1e4susnata listRowDataAdapter.registerObserver(dataObserver); 117dbac8f49866ec226152849e7d3ace3e8263de1e4susnata List<ListRow> visibleRows = new ArrayList<>(); 118dbac8f49866ec226152849e7d3ace3e8263de1e4susnata visibleRows.add(new ListRow(new HeaderItem(0, "Header 51"), createListRowAdapter())); 119dbac8f49866ec226152849e7d3ace3e8263de1e4susnata visibleRows.add(new ListRow(new HeaderItem(0, "Header 52"), createListRowAdapter())); 120dbac8f49866ec226152849e7d3ace3e8263de1e4susnata visibleRows.add(new ListRow(new HeaderItem(0, "Header 53"), createListRowAdapter())); 121dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.addAll(2, visibleRows); 122dbac8f49866ec226152849e7d3ace3e8263de1e4susnata verify(dataObserver, times(1)).onItemRangeInserted(2, 3); 123dbac8f49866ec226152849e7d3ace3e8263de1e4susnata assertEquals(8, listRowDataAdapter.size()); 124b3756c53c5be55e8c8a2f6e2cda264407be84881susnata } 125b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 12635232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @SmallTest 127b3756c53c5be55e8c8a2f6e2cda264407be84881susnata @Test 128b3756c53c5be55e8c8a2f6e2cda264407be84881susnata public void adapterSize_nonVisibleRowInserted() { 129dbac8f49866ec226152849e7d3ace3e8263de1e4susnata int itemCount = 4; 130b3756c53c5be55e8c8a2f6e2cda264407be84881susnata ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector); 131b3756c53c5be55e8c8a2f6e2cda264407be84881susnata adapter.add(new SectionRow("section 1")); 132dbac8f49866ec226152849e7d3ace3e8263de1e4susnata for (int i = 0; i < itemCount; i++) { 133b3756c53c5be55e8c8a2f6e2cda264407be84881susnata HeaderItem headerItem = new HeaderItem(i, "header "+i); 134b3756c53c5be55e8c8a2f6e2cda264407be84881susnata adapter.add(new ListRow(headerItem, createListRowAdapter())); 135b3756c53c5be55e8c8a2f6e2cda264407be84881susnata } 136b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 137b3756c53c5be55e8c8a2f6e2cda264407be84881susnata ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter); 138b3756c53c5be55e8c8a2f6e2cda264407be84881susnata assertEquals(5, listRowDataAdapter.size()); 139b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 140dbac8f49866ec226152849e7d3ace3e8263de1e4susnata List<DividerRow> invisibleRows = new ArrayList<>(); 141dbac8f49866ec226152849e7d3ace3e8263de1e4susnata invisibleRows.add(new DividerRow()); 142dbac8f49866ec226152849e7d3ace3e8263de1e4susnata invisibleRows.add(new DividerRow()); 143dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 144dbac8f49866ec226152849e7d3ace3e8263de1e4susnata listRowDataAdapter.registerObserver(dataObserver); 145dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.addAll(adapter.size(), invisibleRows); 146dbac8f49866ec226152849e7d3ace3e8263de1e4susnata verify(dataObserver, times(0)).onItemRangeInserted(anyInt(), anyInt()); 147dbac8f49866ec226152849e7d3ace3e8263de1e4susnata assertEquals(5, listRowDataAdapter.size()); 148dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 149b3756c53c5be55e8c8a2f6e2cda264407be84881susnata adapter.add(new DividerRow()); 150dbac8f49866ec226152849e7d3ace3e8263de1e4susnata verify(dataObserver, times(0)).onItemRangeInserted(anyInt(), anyInt()); 151b3756c53c5be55e8c8a2f6e2cda264407be84881susnata assertEquals(5, listRowDataAdapter.size()); 152b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 153dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.add(new ListRow(new HeaderItem(0, "Header 5"), createListRowAdapter())); 154dbac8f49866ec226152849e7d3ace3e8263de1e4susnata verify(dataObserver, times(1)).onItemRangeInserted(5, 4); 155dbac8f49866ec226152849e7d3ace3e8263de1e4susnata assertEquals(9, listRowDataAdapter.size()); 156dbac8f49866ec226152849e7d3ace3e8263de1e4susnata } 157b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 15835232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @SmallTest 159dbac8f49866ec226152849e7d3ace3e8263de1e4susnata @Test 160dbac8f49866ec226152849e7d3ace3e8263de1e4susnata public void adapterSize_visibleRowRemoved() { 161dbac8f49866ec226152849e7d3ace3e8263de1e4susnata int itemCount = 4; 162dbac8f49866ec226152849e7d3ace3e8263de1e4susnata ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector); 163dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.add(new SectionRow("section 1")); 164dbac8f49866ec226152849e7d3ace3e8263de1e4susnata for (int i = 0; i < itemCount; i++) { 165dbac8f49866ec226152849e7d3ace3e8263de1e4susnata HeaderItem headerItem = new HeaderItem(i, "header "+i); 166dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.add(new ListRow(headerItem, createListRowAdapter())); 167dbac8f49866ec226152849e7d3ace3e8263de1e4susnata } 168dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 169dbac8f49866ec226152849e7d3ace3e8263de1e4susnata ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter); 170dbac8f49866ec226152849e7d3ace3e8263de1e4susnata assertEquals(5, listRowDataAdapter.size()); 171b3756c53c5be55e8c8a2f6e2cda264407be84881susnata adapter.add(new DividerRow()); 172dbac8f49866ec226152849e7d3ace3e8263de1e4susnata assertEquals(5, listRowDataAdapter.size()); 173b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 174dbac8f49866ec226152849e7d3ace3e8263de1e4susnata listRowDataAdapter.registerObserver(dataObserver); 175dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.removeItems(2, 2); 176dbac8f49866ec226152849e7d3ace3e8263de1e4susnata verify(dataObserver, times(1)).onItemRangeRemoved(2, 2); 177dbac8f49866ec226152849e7d3ace3e8263de1e4susnata assertEquals(3, listRowDataAdapter.size()); 178b3756c53c5be55e8c8a2f6e2cda264407be84881susnata } 179b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 18035232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @MediumTest 181b3756c53c5be55e8c8a2f6e2cda264407be84881susnata @Test 182b3756c53c5be55e8c8a2f6e2cda264407be84881susnata public void adapterSize_nonVisibleRowRemoved() { 183dbac8f49866ec226152849e7d3ace3e8263de1e4susnata int itemCount = 4; 184b3756c53c5be55e8c8a2f6e2cda264407be84881susnata ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector); 185b3756c53c5be55e8c8a2f6e2cda264407be84881susnata adapter.add(new SectionRow("section 1")); 186dbac8f49866ec226152849e7d3ace3e8263de1e4susnata for (int i = 0; i < itemCount; i++) { 187b3756c53c5be55e8c8a2f6e2cda264407be84881susnata HeaderItem headerItem = new HeaderItem(i, "header "+i); 188b3756c53c5be55e8c8a2f6e2cda264407be84881susnata adapter.add(new ListRow(headerItem, createListRowAdapter())); 189b3756c53c5be55e8c8a2f6e2cda264407be84881susnata } 190b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 191b3756c53c5be55e8c8a2f6e2cda264407be84881susnata ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter); 192b3756c53c5be55e8c8a2f6e2cda264407be84881susnata assertEquals(5, listRowDataAdapter.size()); 193b3756c53c5be55e8c8a2f6e2cda264407be84881susnata adapter.add(new DividerRow()); 194b3756c53c5be55e8c8a2f6e2cda264407be84881susnata assertEquals(5, listRowDataAdapter.size()); 195b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 196dbac8f49866ec226152849e7d3ace3e8263de1e4susnata listRowDataAdapter.registerObserver(dataObserver); 197b3756c53c5be55e8c8a2f6e2cda264407be84881susnata adapter.removeItems(4, 1); 198dbac8f49866ec226152849e7d3ace3e8263de1e4susnata verify(dataObserver, times(1)).onItemRangeRemoved(4, 1); 199b3756c53c5be55e8c8a2f6e2cda264407be84881susnata assertEquals(4, listRowDataAdapter.size()); 200b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 201dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.removeItems(4, 1); 202dbac8f49866ec226152849e7d3ace3e8263de1e4susnata verify(dataObserver, times(0)).onItemRangeInserted(anyInt(), anyInt()); 203b3756c53c5be55e8c8a2f6e2cda264407be84881susnata assertEquals(4, listRowDataAdapter.size()); 204b3756c53c5be55e8c8a2f6e2cda264407be84881susnata } 205b3756c53c5be55e8c8a2f6e2cda264407be84881susnata 20635232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @SmallTest 207dbac8f49866ec226152849e7d3ace3e8263de1e4susnata @Test 2085d196663056735d8f1453ed3aeab75e8d922a159Dake Gu public void adapterSize_rowsRemoveAll() { 2095d196663056735d8f1453ed3aeab75e8d922a159Dake Gu ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector); 2105d196663056735d8f1453ed3aeab75e8d922a159Dake Gu adapter.add(new SectionRow("section 1")); 2115d196663056735d8f1453ed3aeab75e8d922a159Dake Gu for (int i = 0; i < 4; i++) { 2125d196663056735d8f1453ed3aeab75e8d922a159Dake Gu HeaderItem headerItem = new HeaderItem(i, "header "+i); 2135d196663056735d8f1453ed3aeab75e8d922a159Dake Gu adapter.add(new ListRow(headerItem, createListRowAdapter())); 2145d196663056735d8f1453ed3aeab75e8d922a159Dake Gu } 2155d196663056735d8f1453ed3aeab75e8d922a159Dake Gu 2165d196663056735d8f1453ed3aeab75e8d922a159Dake Gu ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter); 2175d196663056735d8f1453ed3aeab75e8d922a159Dake Gu assertEquals(5, listRowDataAdapter.size()); 2185d196663056735d8f1453ed3aeab75e8d922a159Dake Gu 2195d196663056735d8f1453ed3aeab75e8d922a159Dake Gu adapter.clear(); 2205d196663056735d8f1453ed3aeab75e8d922a159Dake Gu assertEquals(0, listRowDataAdapter.size()); 2215d196663056735d8f1453ed3aeab75e8d922a159Dake Gu 2225d196663056735d8f1453ed3aeab75e8d922a159Dake Gu HeaderItem headerItem = new HeaderItem(10, "header "+10); 2235d196663056735d8f1453ed3aeab75e8d922a159Dake Gu adapter.add(new ListRow(headerItem, createListRowAdapter())); 2245d196663056735d8f1453ed3aeab75e8d922a159Dake Gu assertEquals(1, listRowDataAdapter.size()); 2255d196663056735d8f1453ed3aeab75e8d922a159Dake Gu } 2265d196663056735d8f1453ed3aeab75e8d922a159Dake Gu 22735232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @SmallTest 2285d196663056735d8f1453ed3aeab75e8d922a159Dake Gu @Test 22909cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu public void changeRemove_revealInvisibleItems() { 23009cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector); 23109cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu for (int i = 0; i < 4; i++) { 23209cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu HeaderItem headerItem = new HeaderItem(i, "header "+i); 23309cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu adapter.add(new ListRow(headerItem, createListRowAdapter())); 23409cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu } 23509cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu adapter.add(new SectionRow("section")); 23609cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu for (int i = 4; i < 8; i++) { 23709cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu HeaderItem headerItem = new HeaderItem(i, "header "+i); 23809cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu adapter.add(new ListRow(headerItem, createListRowAdapter())); 23909cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu } 24009cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu 24109cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter); 24209cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu assertEquals(9, listRowDataAdapter.size()); 24309cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu 24409cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu listRowDataAdapter.registerObserver(dataObserver); 24509cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu adapter.removeItems(5, 4); 24609cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu verify(dataObserver, times(1)).onItemRangeRemoved(4, 5); 24709cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu assertEquals(4, listRowDataAdapter.size()); 24809cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu } 24909cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu 25035232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @SmallTest 25109cc61cbcf87063fb5f540a1f2e6c52773ca2cb2Dake Gu @Test 252dbac8f49866ec226152849e7d3ace3e8263de1e4susnata public void adapterSize_rowsRemoved() { 253dbac8f49866ec226152849e7d3ace3e8263de1e4susnata int itemCount = 4; 254dbac8f49866ec226152849e7d3ace3e8263de1e4susnata ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector); 255dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.add(new SectionRow("section 1")); 256dbac8f49866ec226152849e7d3ace3e8263de1e4susnata for (int i = 0; i < itemCount; i++) { 257dbac8f49866ec226152849e7d3ace3e8263de1e4susnata HeaderItem headerItem = new HeaderItem(i, "header "+i); 258dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.add(new ListRow(headerItem, createListRowAdapter())); 259dbac8f49866ec226152849e7d3ace3e8263de1e4susnata } 260dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 261dbac8f49866ec226152849e7d3ace3e8263de1e4susnata ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter); 262dbac8f49866ec226152849e7d3ace3e8263de1e4susnata assertEquals(5, listRowDataAdapter.size()); 263dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 264dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.add(new DividerRow()); 265dbac8f49866ec226152849e7d3ace3e8263de1e4susnata assertEquals(5, listRowDataAdapter.size()); 266dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 267dbac8f49866ec226152849e7d3ace3e8263de1e4susnata listRowDataAdapter.registerObserver(dataObserver); 268dbac8f49866ec226152849e7d3ace3e8263de1e4susnata adapter.removeItems(3, 3); 269dbac8f49866ec226152849e7d3ace3e8263de1e4susnata verify(dataObserver, times(1)).onItemRangeRemoved(3, 2); 270dbac8f49866ec226152849e7d3ace3e8263de1e4susnata assertEquals(3, listRowDataAdapter.size()); 271dbac8f49866ec226152849e7d3ace3e8263de1e4susnata } 272dbac8f49866ec226152849e7d3ace3e8263de1e4susnata 27335232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas @SmallTest 2741f55c2c933d1085a097b00598aef18de029fe0d2susnata @Test 2751f55c2c933d1085a097b00598aef18de029fe0d2susnata public void customObjectAdapterTest() { 2761f55c2c933d1085a097b00598aef18de029fe0d2susnata int itemCount = 4; 2771f55c2c933d1085a097b00598aef18de029fe0d2susnata ArrayObjectAdapter adapter = new CustomAdapter(presenterSelector); 2781f55c2c933d1085a097b00598aef18de029fe0d2susnata adapter.add(new SectionRow("section 1")); 2791f55c2c933d1085a097b00598aef18de029fe0d2susnata for (int i = 0; i < itemCount; i++) { 2801f55c2c933d1085a097b00598aef18de029fe0d2susnata HeaderItem headerItem = new HeaderItem(i, "header "+i); 2811f55c2c933d1085a097b00598aef18de029fe0d2susnata adapter.add(new ListRow(headerItem, createListRowAdapter())); 2821f55c2c933d1085a097b00598aef18de029fe0d2susnata } 2831f55c2c933d1085a097b00598aef18de029fe0d2susnata 2841f55c2c933d1085a097b00598aef18de029fe0d2susnata ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter); 2851f55c2c933d1085a097b00598aef18de029fe0d2susnata assertEquals(5, listRowDataAdapter.size()); 2861f55c2c933d1085a097b00598aef18de029fe0d2susnata 2871f55c2c933d1085a097b00598aef18de029fe0d2susnata adapter.add(new DividerRow()); 2881f55c2c933d1085a097b00598aef18de029fe0d2susnata assertEquals(5, listRowDataAdapter.size()); 2891f55c2c933d1085a097b00598aef18de029fe0d2susnata 2901f55c2c933d1085a097b00598aef18de029fe0d2susnata listRowDataAdapter.registerObserver(dataObserver); 2911f55c2c933d1085a097b00598aef18de029fe0d2susnata adapter.removeItems(3, 3); 2921f55c2c933d1085a097b00598aef18de029fe0d2susnata verify(dataObserver, times(1)).onChanged(); 2931f55c2c933d1085a097b00598aef18de029fe0d2susnata assertEquals(3, listRowDataAdapter.size()); 2941f55c2c933d1085a097b00598aef18de029fe0d2susnata 2951f55c2c933d1085a097b00598aef18de029fe0d2susnata Mockito.reset(dataObserver); 2961f55c2c933d1085a097b00598aef18de029fe0d2susnata adapter.add(new DividerRow()); 2971f55c2c933d1085a097b00598aef18de029fe0d2susnata verify(dataObserver, times(1)).onChanged(); 2981f55c2c933d1085a097b00598aef18de029fe0d2susnata assertEquals(3, listRowDataAdapter.size()); 2991f55c2c933d1085a097b00598aef18de029fe0d2susnata } 3001f55c2c933d1085a097b00598aef18de029fe0d2susnata 301b3756c53c5be55e8c8a2f6e2cda264407be84881susnata private ArrayObjectAdapter createListRowAdapter() { 302b3756c53c5be55e8c8a2f6e2cda264407be84881susnata ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenterSelector); 303b3756c53c5be55e8c8a2f6e2cda264407be84881susnata listRowAdapter.add(new Integer(1)); 304b3756c53c5be55e8c8a2f6e2cda264407be84881susnata listRowAdapter.add(new Integer(2)); 305b3756c53c5be55e8c8a2f6e2cda264407be84881susnata return listRowAdapter; 306b3756c53c5be55e8c8a2f6e2cda264407be84881susnata } 3071f55c2c933d1085a097b00598aef18de029fe0d2susnata 3081f55c2c933d1085a097b00598aef18de029fe0d2susnata private class CustomAdapter extends ArrayObjectAdapter { 3091f55c2c933d1085a097b00598aef18de029fe0d2susnata 3101f55c2c933d1085a097b00598aef18de029fe0d2susnata public CustomAdapter(PresenterSelector selector) { 3111f55c2c933d1085a097b00598aef18de029fe0d2susnata super(selector); 3121f55c2c933d1085a097b00598aef18de029fe0d2susnata } 3131f55c2c933d1085a097b00598aef18de029fe0d2susnata 3141f55c2c933d1085a097b00598aef18de029fe0d2susnata @Override 3151f55c2c933d1085a097b00598aef18de029fe0d2susnata public boolean isImmediateNotifySupported() { 3161f55c2c933d1085a097b00598aef18de029fe0d2susnata return false; 3171f55c2c933d1085a097b00598aef18de029fe0d2susnata } 3181f55c2c933d1085a097b00598aef18de029fe0d2susnata } 319b3756c53c5be55e8c8a2f6e2cda264407be84881susnata} 320