• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
18 package com.android.mailcommon;
19 
20 import com.android.mailcommon.MergedAdapter.ListSpinnerAdapter;
21 import com.android.mailcommon.MergedAdapter.LocalAdapterPosition;
22 
23 import android.database.DataSetObserver;
24 import android.test.AndroidTestCase;
25 import android.test.suitebuilder.annotation.SmallTest;
26 import android.view.View;
27 import android.view.ViewGroup;
28 import android.widget.BaseAdapter;
29 
30 import java.util.HashSet;
31 import java.util.Set;
32 
33 @SmallTest
34 public 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 
TestAdapter(int count)42         public TestAdapter(int count) {
43             mCount = count;
44         }
45 
46         @Override
getCount()47         public int getCount() {
48             return mCount;
49         }
50 
setCount(int count)51         public void setCount(int count) {
52             mCount = count;
53             notifyDataSetChanged();
54         }
55 
56         @Override
getItem(int position)57         public Object getItem(int position) {
58             return Integer.toString(mOffset + position);
59         }
60 
61         @Override
getItemId(int position)62         public long getItemId(int position) {
63             return position;
64         }
65 
66         @Override
getView(int position, View convertView, ViewGroup parent)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 
setOffset(int i)73         public TestAdapter setOffset(int i) {
74             mOffset = i;
75             return this;
76         }
77 
setViewTypeCount(int i)78         public TestAdapter setViewTypeCount(int i) {
79             mViewTypeCount = i;
80             return this;
81         }
82 
83         @Override
getViewTypeCount()84         public int getViewTypeCount() {
85             return mViewTypeCount;
86         }
87 
88         @Override
getItemViewType(int position)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
setUp()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 
testGetSubAdapters()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 
testGetSubAdapterOffset()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 
testGetItemAndCount()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 
testGetDropDownView()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 
testViewTypeCount()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