107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee/* 207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * Copyright (C) 2015 The Android Open Source Project 307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * 407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * Licensed under the Apache License, Version 2.0 (the "License"); 507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * you may not use this file except in compliance with the License. 607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * You may obtain a copy of the License at 707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * 807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * http://www.apache.org/licenses/LICENSE-2.0 907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * 1007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * Unless required by applicable law or agreed to in writing, software 1107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * distributed under the License is distributed on an "AS IS" BASIS, 1207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * See the License for the specific language governing permissions and 1407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * limitations under the License. 1507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee */ 1607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 1707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leepackage com.android.dialer.calllog; 1807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 1907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leeimport static com.android.dialer.calllog.GroupingListAdapter.ITEM_TYPE_GROUP_HEADER; 2007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leeimport static com.android.dialer.calllog.GroupingListAdapter.ITEM_TYPE_IN_GROUP; 2107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leeimport static com.android.dialer.calllog.GroupingListAdapter.ITEM_TYPE_STANDALONE; 2207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 2307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leeimport android.content.Context; 2407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leeimport android.database.Cursor; 2507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leeimport android.database.MatrixCursor; 26492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Leeimport android.support.v7.widget.RecyclerView; 2707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leeimport android.test.AndroidTestCase; 2807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leeimport android.text.TextUtils; 2907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leeimport android.view.View; 3007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leeimport android.view.ViewGroup; 3107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 3207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee/** 3307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * Tests for {@link GroupingListAdapter}. 3407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * 3507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * Running all tests: 3607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * 3707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee * adb shell am instrument -e class com.android.dialer.calllog.GroupingListAdapterTests \ 38492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee * -w com.android.dialer.tests/android.test.InstrumentationTestRunner 3907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee */ 4007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Leepublic class GroupingListAdapterTests extends AndroidTestCase { 4107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 4207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee static private final String[] PROJECTION = new String[] { 4307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee "_id", 4407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee "group", 4507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee }; 4607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 4707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee private static final int GROUPING_COLUMN_INDEX = 1; 4807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 4907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee private MatrixCursor mCursor; 5007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee private long mNextId; 5107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 5207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee private GroupingListAdapter mAdapter = new GroupingListAdapter(null) { 5307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 5407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee @Override 5507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee protected void addGroups(Cursor cursor) { 5607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee int count = cursor.getCount(); 5707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee int groupItemCount = 1; 5807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee cursor.moveToFirst(); 5907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee String currentValue = cursor.getString(GROUPING_COLUMN_INDEX); 6007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee for (int i = 1; i < count; i++) { 6107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee cursor.moveToNext(); 6207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee String value = cursor.getString(GROUPING_COLUMN_INDEX); 6307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee if (TextUtils.equals(value, currentValue)) { 6407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee groupItemCount++; 6507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } else { 6607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee if (groupItemCount > 1) { 6707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee addGroup(i - groupItemCount, groupItemCount, false); 6807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 6907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 7007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee groupItemCount = 1; 7107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee currentValue = value; 7207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 7307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 7407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee if (groupItemCount > 1) { 7507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee addGroup(count - groupItemCount, groupItemCount, false); 7607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 7707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 7807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 7907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee @Override 80492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee public void onContentChanged() { 81492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee // Do nothing. 8207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 8307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 8407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee @Override 85492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int position) { 8607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee return null; 8707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 8807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 8907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee @Override 90492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 91492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee // Do nothing. 9207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 9307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee }; 9407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 95492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee 9607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee private void buildCursor(String... numbers) { 9707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mCursor = new MatrixCursor(PROJECTION); 9807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mNextId = 1; 9907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee for (String number : numbers) { 10007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mCursor.addRow(new Object[]{mNextId, number}); 10107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mNextId++; 10207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 10307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 10407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 10507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testGroupingWithoutGroups() { 10607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor("1", "2", "3"); 10707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 10807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 109492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(3, mAdapter.getItemCount()); 11007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0); 11107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_STANDALONE, false, 1); 11207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_STANDALONE, false, 2); 11307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 11407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 11507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testGroupingWithCollapsedGroupAtTheBeginning() { 11607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor("1", "1", "2"); 11707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 11807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 119492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(2, mAdapter.getItemCount()); 12007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_GROUP_HEADER, false, 0); 12107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_STANDALONE, false, 2); 12207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 12307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 12407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testGroupingWithExpandedGroupAtTheBeginning() { 12507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor("1", "1", "2"); 12607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 12707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.toggleGroup(0); 12807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 129492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(4, mAdapter.getItemCount()); 13007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_GROUP_HEADER, true, 0); 13107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_IN_GROUP, false, 0); 13207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_IN_GROUP, false, 1); 13307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(3, ITEM_TYPE_STANDALONE, false, 2); 13407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 13507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 13607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testGroupingWithExpandCollapseCycleAtTheBeginning() { 13707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor("1", "1", "2"); 13807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 13907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.toggleGroup(0); 14007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.toggleGroup(0); 14107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 142492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(2, mAdapter.getItemCount()); 14307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_GROUP_HEADER, false, 0); 14407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_STANDALONE, false, 2); 14507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 14607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 14707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testGroupingWithCollapsedGroupInTheMiddle() { 14807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor("1", "2", "2", "2", "3"); 14907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 15007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 151492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(3, mAdapter.getItemCount()); 15207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0); 15307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, false, 1); 15407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_STANDALONE, false, 4); 15507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 15607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 15707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testGroupingWithExpandedGroupInTheMiddle() { 15807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor("1", "2", "2", "2", "3"); 15907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 16007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.toggleGroup(1); 16107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 162492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(6, mAdapter.getItemCount()); 16307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0); 16407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, true, 1); 16507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_IN_GROUP, false, 1); 16607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(3, ITEM_TYPE_IN_GROUP, false, 2); 16707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(4, ITEM_TYPE_IN_GROUP, false, 3); 16807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(5, ITEM_TYPE_STANDALONE, false, 4); 16907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 17007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 17107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testGroupingWithCollapsedGroupAtTheEnd() { 17207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor("1", "2", "3", "3", "3"); 17307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 17407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 175492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(3, mAdapter.getItemCount()); 17607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0); 17707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_STANDALONE, false, 1); 17807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_GROUP_HEADER, false, 2); 17907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 18007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 18107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testGroupingWithExpandedGroupAtTheEnd() { 18207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor("1", "2", "3", "3", "3"); 18307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 18407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.toggleGroup(2); 18507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 186492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(6, mAdapter.getItemCount()); 18707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0); 18807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_STANDALONE, false, 1); 18907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_GROUP_HEADER, true, 2); 19007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(3, ITEM_TYPE_IN_GROUP, false, 2); 19107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(4, ITEM_TYPE_IN_GROUP, false, 3); 19207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(5, ITEM_TYPE_IN_GROUP, false, 4); 19307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 19407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 19507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testGroupingWithMultipleCollapsedGroups() { 19607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor("1", "2", "2", "3", "4", "4", "5", "5", "6"); 19707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 19807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 199492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(6, mAdapter.getItemCount()); 20007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0); 20107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, false, 1); 20207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_STANDALONE, false, 3); 20307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(3, ITEM_TYPE_GROUP_HEADER, false, 4); 20407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(4, ITEM_TYPE_GROUP_HEADER, false, 6); 20507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(5, ITEM_TYPE_STANDALONE, false, 8); 20607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 20707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 20807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testGroupingWithMultipleExpandedGroups() { 20907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor("1", "2", "2", "3", "4", "4", "5", "5", "6"); 21007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 21107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.toggleGroup(1); 21207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 21307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee // Note that expanding the group of 2's shifted the group of 5's down from the 21407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee // 4th to the 6th position 21507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.toggleGroup(6); 21607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 217492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(10, mAdapter.getItemCount()); 21807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0); 21907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, true, 1); 22007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_IN_GROUP, false, 1); 22107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(3, ITEM_TYPE_IN_GROUP, false, 2); 22207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(4, ITEM_TYPE_STANDALONE, false, 3); 22307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(5, ITEM_TYPE_GROUP_HEADER, false, 4); 22407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(6, ITEM_TYPE_GROUP_HEADER, true, 6); 22507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(7, ITEM_TYPE_IN_GROUP, false, 6); 22607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(8, ITEM_TYPE_IN_GROUP, false, 7); 22707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(9, ITEM_TYPE_STANDALONE, false, 8); 22807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 22907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 23007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testPositionCache() { 23107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor("1", "2", "2", "3", "4", "4", "5", "5", "6"); 23207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 23307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 23407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee // First pass - building up cache 235492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(6, mAdapter.getItemCount()); 23607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0); 23707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, false, 1); 23807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_STANDALONE, false, 3); 23907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(3, ITEM_TYPE_GROUP_HEADER, false, 4); 24007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(4, ITEM_TYPE_GROUP_HEADER, false, 6); 24107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(5, ITEM_TYPE_STANDALONE, false, 8); 24207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 24307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee // Second pass - using cache 244492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(6, mAdapter.getItemCount()); 24507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0); 24607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, false, 1); 24707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_STANDALONE, false, 3); 24807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(3, ITEM_TYPE_GROUP_HEADER, false, 4); 24907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(4, ITEM_TYPE_GROUP_HEADER, false, 6); 25007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(5, ITEM_TYPE_STANDALONE, false, 8); 25107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 25207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee // Invalidate cache by expanding a group 25307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.toggleGroup(1); 25407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 25507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee // First pass - building up cache 25607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0); 25707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, true, 1); 25807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_IN_GROUP, false, 1); 25907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(3, ITEM_TYPE_IN_GROUP, false, 2); 26007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(4, ITEM_TYPE_STANDALONE, false, 3); 26107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(5, ITEM_TYPE_GROUP_HEADER, false, 4); 26207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(6, ITEM_TYPE_GROUP_HEADER, false, 6); 26307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(7, ITEM_TYPE_STANDALONE, false, 8); 26407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 26507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee // Second pass - using cache 26607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0); 26707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, true, 1); 26807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(2, ITEM_TYPE_IN_GROUP, false, 1); 26907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(3, ITEM_TYPE_IN_GROUP, false, 2); 27007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(4, ITEM_TYPE_STANDALONE, false, 3); 27107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(5, ITEM_TYPE_GROUP_HEADER, false, 4); 27207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(6, ITEM_TYPE_GROUP_HEADER, false, 6); 27307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertPositionMetadata(7, ITEM_TYPE_STANDALONE, false, 8); 27407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 27507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 27607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee public void testGroupDescriptorArrayGrowth() { 27707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee String[] numbers = new String[500]; 27807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee for (int i = 0; i < numbers.length; i++) { 27907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 28007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee // Make groups of 2 28107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee numbers[i] = String.valueOf((i / 2) * 2); 28207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 28307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 28407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee buildCursor(numbers); 28507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.changeCursor(mCursor); 28607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 287492cd7371c6d8fddc4de85887a4ed9a89d602767Andrew Lee assertEquals(250, mAdapter.getItemCount()); 28807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 28907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee 29007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee private void assertPositionMetadata(int position, int itemType, boolean isExpanded, 29107a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee int cursorPosition) { 29207a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee GroupingListAdapter.PositionMetadata metadata = new GroupingListAdapter.PositionMetadata(); 29307a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee mAdapter.obtainPositionMetadata(metadata, position); 29407a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertEquals(itemType, metadata.itemType); 29507a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee if (metadata.itemType == ITEM_TYPE_GROUP_HEADER) { 29607a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertEquals(isExpanded, metadata.isExpanded); 29707a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 29807a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee assertEquals(cursorPosition, metadata.cursorPosition); 29907a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee } 30007a5e0a68e95bc7e8098bb018004910dc97fa608Andrew Lee} 301