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