1/*
2 * Copyright (C) 2011 Google Inc.
3 * Licensed to The Android Open Source Project.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package com.android.mailcommon;
19
20import com.android.mailcommon.MergedAdapter.ListSpinnerAdapter;
21import com.android.mailcommon.MergedAdapter.LocalAdapterPosition;
22
23import android.database.DataSetObserver;
24import android.test.AndroidTestCase;
25import android.test.suitebuilder.annotation.SmallTest;
26import android.view.View;
27import android.view.ViewGroup;
28import android.widget.BaseAdapter;
29
30import java.util.HashSet;
31import java.util.Set;
32
33@SmallTest
34public class MergedAdapterTest extends AndroidTestCase {
35
36    private class TestAdapter extends BaseAdapter implements ListSpinnerAdapter {
37
38        private int mOffset;
39        private int mCount;
40        private int mViewTypeCount;
41
42        public TestAdapter(int count) {
43            mCount = count;
44        }
45
46        @Override
47        public int getCount() {
48            return mCount;
49        }
50
51        public void setCount(int count) {
52            mCount = count;
53            notifyDataSetChanged();
54        }
55
56        @Override
57        public Object getItem(int position) {
58            return Integer.toString(mOffset + position);
59        }
60
61        @Override
62        public long getItemId(int position) {
63            return position;
64        }
65
66        @Override
67        public View getView(int position, View convertView, ViewGroup parent) {
68            View v = new View(mContext);
69            v.setTag(getItem(position));
70            return v;
71        }
72
73        public TestAdapter setOffset(int i) {
74            mOffset = i;
75            return this;
76        }
77
78        public TestAdapter setViewTypeCount(int i) {
79            mViewTypeCount = i;
80            return this;
81        }
82
83        @Override
84        public int getViewTypeCount() {
85            return mViewTypeCount;
86        }
87
88        @Override
89        public int getItemViewType(int position) {
90            return position % mViewTypeCount;
91        }
92
93    }
94
95    private TestAdapter mFirst;
96    private TestAdapter mSecond;
97    boolean mChanged;
98
99    @Override
100    protected void setUp() throws Exception {
101        super.setUp();
102
103        mFirst = new TestAdapter(10).setViewTypeCount(2);
104        mSecond = new TestAdapter(5).setOffset(10).setViewTypeCount(3);
105    }
106
107    public void testGetSubAdapters() {
108        MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>();
109
110        adapter.setAdapters(mFirst, mSecond);
111        assertEquals(2, adapter.getSubAdapterCount());
112        assertEquals(mFirst, adapter.getSubAdapter(0));
113        assertEquals(mSecond, adapter.getSubAdapter(1));
114    }
115
116    public void testGetSubAdapterOffset() {
117        MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>();
118
119        adapter.setAdapters(mFirst, mSecond);
120        LocalAdapterPosition<ListSpinnerAdapter> p = adapter.getAdapterOffsetForItem(13);
121        assertEquals(p.mAdapter, mSecond);
122        assertEquals(p.mLocalPosition, 3);
123    }
124
125    public void testGetItemAndCount() {
126        MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>();
127
128        adapter.setAdapters(mFirst, mSecond);
129        assertEquals(15, adapter.getCount());
130        for (int i = 0; i < adapter.getCount(); i++) {
131            assertEquals(Integer.toString(i), adapter.getItem(i));
132        }
133    }
134
135    public void testGetDropDownView() {
136        MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>();
137
138        adapter.setAdapters(mFirst, mSecond);
139        for (int i = 0; i < adapter.getCount(); i++) {
140            View v = adapter.getDropDownView(i, null, null);
141            assertEquals(Integer.toString(i), v.getTag());
142        }
143    }
144
145    public void testViewTypeCount() {
146        MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>();
147
148        adapter.setAdapters(mFirst, mSecond);
149        assertEquals(2 + 3, adapter.getViewTypeCount());
150        for (int i = 0; i < mFirst.getCount(); i++) {
151            assertTrue(adapter.getItemViewType(i) < adapter.getViewTypeCount());
152        }
153    }
154
155    public void testViewTypesDoNotOverlap() {
156        MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>();
157
158        adapter.setAdapters(mFirst, mSecond);
159
160        Set<Integer> firstTypes = new HashSet<Integer>();
161        for (int i = 0; i < mFirst.getCount(); i++) {
162            firstTypes.add(mFirst.getItemViewType(i));
163        }
164
165        for (int i = mFirst.getCount(); i < adapter.getCount(); i++) {
166            int secondType = adapter.getItemViewType(i);
167            assertFalse(firstTypes.contains(secondType));
168        }
169    }
170
171    public void testChange() {
172        MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>();
173
174        mChanged = false;
175
176        adapter.setAdapters(mFirst, mSecond);
177        adapter.registerDataSetObserver(new DataSetObserver() {
178            @Override
179            public void onChanged() {
180                mChanged = true;
181            }
182        });
183        mSecond.setCount(3);
184
185        assertEquals(13, adapter.getCount());
186        assertTrue(mChanged);
187    }
188
189    public void testStopNotifyingChangeAfterRemoval() {
190        MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>();
191
192        mChanged = false;
193
194        adapter.setAdapters(mFirst, mSecond);
195        adapter.registerDataSetObserver(new DataSetObserver() {
196            @Override
197            public void onChanged() {
198                mChanged = true;
199            }
200        });
201        adapter.setAdapters(mFirst);
202        mSecond.setCount(3);
203
204        assertFalse(mChanged);
205    }
206
207}
208