/* * Copyright (C) 2011 Google Inc. * Licensed to The Android Open Source Project. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.mailcommon; import com.android.mailcommon.MergedAdapter.ListSpinnerAdapter; import com.android.mailcommon.MergedAdapter.LocalAdapterPosition; import android.database.DataSetObserver; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import java.util.HashSet; import java.util.Set; @SmallTest public class MergedAdapterTest extends AndroidTestCase { private class TestAdapter extends BaseAdapter implements ListSpinnerAdapter { private int mOffset; private int mCount; private int mViewTypeCount; public TestAdapter(int count) { mCount = count; } @Override public int getCount() { return mCount; } public void setCount(int count) { mCount = count; notifyDataSetChanged(); } @Override public Object getItem(int position) { return Integer.toString(mOffset + position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = new View(mContext); v.setTag(getItem(position)); return v; } public TestAdapter setOffset(int i) { mOffset = i; return this; } public TestAdapter setViewTypeCount(int i) { mViewTypeCount = i; return this; } @Override public int getViewTypeCount() { return mViewTypeCount; } @Override public int getItemViewType(int position) { return position % mViewTypeCount; } } private TestAdapter mFirst; private TestAdapter mSecond; boolean mChanged; @Override protected void setUp() throws Exception { super.setUp(); mFirst = new TestAdapter(10).setViewTypeCount(2); mSecond = new TestAdapter(5).setOffset(10).setViewTypeCount(3); } public void testGetSubAdapters() { MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>(); adapter.setAdapters(mFirst, mSecond); assertEquals(2, adapter.getSubAdapterCount()); assertEquals(mFirst, adapter.getSubAdapter(0)); assertEquals(mSecond, adapter.getSubAdapter(1)); } public void testGetSubAdapterOffset() { MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>(); adapter.setAdapters(mFirst, mSecond); LocalAdapterPosition<ListSpinnerAdapter> p = adapter.getAdapterOffsetForItem(13); assertEquals(p.mAdapter, mSecond); assertEquals(p.mLocalPosition, 3); } public void testGetItemAndCount() { MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>(); adapter.setAdapters(mFirst, mSecond); assertEquals(15, adapter.getCount()); for (int i = 0; i < adapter.getCount(); i++) { assertEquals(Integer.toString(i), adapter.getItem(i)); } } public void testGetDropDownView() { MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>(); adapter.setAdapters(mFirst, mSecond); for (int i = 0; i < adapter.getCount(); i++) { View v = adapter.getDropDownView(i, null, null); assertEquals(Integer.toString(i), v.getTag()); } } public void testViewTypeCount() { MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>(); adapter.setAdapters(mFirst, mSecond); assertEquals(2 + 3, adapter.getViewTypeCount()); for (int i = 0; i < mFirst.getCount(); i++) { assertTrue(adapter.getItemViewType(i) < adapter.getViewTypeCount()); } } public void testViewTypesDoNotOverlap() { MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>(); adapter.setAdapters(mFirst, mSecond); Set<Integer> firstTypes = new HashSet<Integer>(); for (int i = 0; i < mFirst.getCount(); i++) { firstTypes.add(mFirst.getItemViewType(i)); } for (int i = mFirst.getCount(); i < adapter.getCount(); i++) { int secondType = adapter.getItemViewType(i); assertFalse(firstTypes.contains(secondType)); } } public void testChange() { MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>(); mChanged = false; adapter.setAdapters(mFirst, mSecond); adapter.registerDataSetObserver(new DataSetObserver() { @Override public void onChanged() { mChanged = true; } }); mSecond.setCount(3); assertEquals(13, adapter.getCount()); assertTrue(mChanged); } public void testStopNotifyingChangeAfterRemoval() { MergedAdapter<ListSpinnerAdapter> adapter = new MergedAdapter<ListSpinnerAdapter>(); mChanged = false; adapter.setAdapters(mFirst, mSecond); adapter.registerDataSetObserver(new DataSetObserver() { @Override public void onChanged() { mChanged = true; } }); adapter.setAdapters(mFirst); mSecond.setCount(3); assertFalse(mChanged); } }