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