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