/* * Copyright (C) 2010 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.contacts.widget; import com.google.android.collect.Lists; import android.content.Context; import android.database.DataSetObserver; import android.test.AndroidTestCase; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; /** * Tests for {@link CompositeListAdapter}. */ public class CompositeListAdapterTest extends AndroidTestCase { private final class MockAdapter extends ArrayAdapter<String> { boolean allItemsEnabled = true; HashSet<Integer> enabledItems = new HashSet<Integer>(); int viewTypeCount = 1; HashMap<Integer, Integer> viewTypes = new HashMap<Integer, Integer>(); private MockAdapter(Context context, List<String> objects) { super(context, android.R.layout.simple_list_item_1, objects); for (int i = 0; i < objects.size(); i++) { viewTypes.put(i, 0); } } @Override public View getView(int position, View convertView, ViewGroup parent) { return new MockView(getContext(), position); } @Override public boolean areAllItemsEnabled() { return allItemsEnabled; } @Override public boolean isEnabled(int position) { return enabledItems.contains(position); } @Override public int getViewTypeCount() { return viewTypeCount; } @Override public int getItemViewType(int position) { return viewTypes.get(position); } } private final class MockView extends View { public MockView(Context context, int position) { super(context); setTag(position); } } private final class TestDataSetObserver extends DataSetObserver { public int changeCount; public int invalidationCount; @Override public void onChanged() { changeCount++; } @Override public void onInvalidated() { invalidationCount++; } } private MockAdapter mAdapter1; private MockAdapter mAdapter2; private MockAdapter mAdapter3; @Override protected void setUp() throws Exception { super.setUp(); mAdapter1 = new MockAdapter(getContext(), Lists.newArrayList("A", "B")); mAdapter2 = new MockAdapter(getContext(), new ArrayList<String>()); mAdapter3 = new MockAdapter(getContext(), Lists.newArrayList("C", "D", "E")); } public void testGetCount() { CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); adapter.addAdapter(mAdapter2); adapter.addAdapter(mAdapter3); assertEquals(5, adapter.getCount()); } public void testGetCountWithInvalidation() { CompositeListAdapter adapter = new CompositeListAdapter(); assertEquals(0, adapter.getCount()); adapter.addAdapter(mAdapter1); assertEquals(2, adapter.getCount()); adapter.addAdapter(mAdapter2); assertEquals(2, adapter.getCount()); adapter.addAdapter(mAdapter3); assertEquals(5, adapter.getCount()); } public void testGetItem() { CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); adapter.addAdapter(mAdapter2); adapter.addAdapter(mAdapter3); assertEquals("A", adapter.getItem(0)); assertEquals("B", adapter.getItem(1)); assertEquals("C", adapter.getItem(2)); assertEquals("D", adapter.getItem(3)); assertEquals("E", adapter.getItem(4)); } public void testGetItemId() { CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); adapter.addAdapter(mAdapter2); adapter.addAdapter(mAdapter3); assertEquals(0, adapter.getItemId(0)); assertEquals(1, adapter.getItemId(1)); assertEquals(0, adapter.getItemId(2)); assertEquals(1, adapter.getItemId(3)); assertEquals(2, adapter.getItemId(4)); } public void testGetView() { CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); adapter.addAdapter(mAdapter2); adapter.addAdapter(mAdapter3); assertEquals(0, adapter.getView(0, null, null).getTag()); assertEquals(1, adapter.getView(1, null, null).getTag()); assertEquals(0, adapter.getView(2, null, null).getTag()); assertEquals(1, adapter.getView(3, null, null).getTag()); assertEquals(2, adapter.getView(4, null, null).getTag()); } public void testGetViewTypeCount() { mAdapter1.viewTypeCount = 2; mAdapter2.viewTypeCount = 3; CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); adapter.addAdapter(mAdapter2); adapter.addAdapter(mAdapter3); // Note that mAdapter2 adds an implicit +1 assertEquals(6, adapter.getViewTypeCount()); } public void testGetItemViewType() { mAdapter1.viewTypeCount = 2; mAdapter1.viewTypes.put(0, 1); mAdapter1.viewTypes.put(1, 0); mAdapter3.viewTypeCount = 3; mAdapter3.viewTypes.put(0, 1); mAdapter3.viewTypes.put(1, 2); mAdapter3.viewTypes.put(2, 0); CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); adapter.addAdapter(mAdapter2); adapter.addAdapter(mAdapter3); assertEquals(1, adapter.getItemViewType(0)); assertEquals(0, adapter.getItemViewType(1)); // Note: mAdapter2 throws in a +1 assertEquals(4, adapter.getItemViewType(2)); assertEquals(5, adapter.getItemViewType(3)); assertEquals(3, adapter.getItemViewType(4)); } public void testNotifyDataSetChangedPropagated() { CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); adapter.addAdapter(mAdapter2); TestDataSetObserver observer = new TestDataSetObserver(); adapter.registerDataSetObserver(observer); mAdapter1.add("X"); assertEquals(1, observer.changeCount); assertEquals(0, observer.invalidationCount); assertEquals(3, adapter.getCount()); assertEquals("A", adapter.getItem(0)); assertEquals("B", adapter.getItem(1)); assertEquals("X", adapter.getItem(2)); mAdapter2.add("Y"); assertEquals(2, observer.changeCount); assertEquals(0, observer.invalidationCount); assertEquals(4, adapter.getCount()); assertEquals("A", adapter.getItem(0)); assertEquals("B", adapter.getItem(1)); assertEquals("X", adapter.getItem(2)); assertEquals("Y", adapter.getItem(3)); } public void testNotifyDataSetChangedOnAddingAdapter() { CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); TestDataSetObserver observer = new TestDataSetObserver(); adapter.registerDataSetObserver(observer); adapter.addAdapter(mAdapter3); assertEquals(1, observer.changeCount); assertEquals(0, observer.invalidationCount); assertEquals(5, adapter.getCount()); assertEquals("A", adapter.getItem(0)); assertEquals("B", adapter.getItem(1)); assertEquals("C", adapter.getItem(2)); assertEquals("D", adapter.getItem(3)); assertEquals("E", adapter.getItem(4)); } public void testNotifyDataSetInvalidated() { CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); TestDataSetObserver observer = new TestDataSetObserver(); adapter.registerDataSetObserver(observer); mAdapter1.remove("A"); assertEquals(1, observer.changeCount); assertEquals(0, observer.invalidationCount); assertEquals(1, adapter.getCount()); mAdapter1.remove("B"); assertEquals(1, observer.changeCount); assertEquals(1, observer.invalidationCount); assertEquals(0, adapter.getCount()); } public void testAreAllItemsEnabled() { CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); adapter.addAdapter(mAdapter3); assertTrue(adapter.areAllItemsEnabled()); } public void testAreAllItemsEnabledWithInvalidation() { CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); assertTrue(adapter.areAllItemsEnabled()); mAdapter3.allItemsEnabled = false; adapter.addAdapter(mAdapter3); assertFalse(adapter.areAllItemsEnabled()); } public void testIsEnabled() { mAdapter1.allItemsEnabled = false; mAdapter1.enabledItems.add(1); CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); adapter.addAdapter(mAdapter2); adapter.addAdapter(mAdapter3); assertFalse(adapter.isEnabled(0)); assertTrue(adapter.isEnabled(1)); assertTrue(adapter.isEnabled(2)); assertTrue(adapter.isEnabled(3)); assertTrue(adapter.isEnabled(4)); } public void testIsEnabledWhenAllEnabledAtLeastOneAdapter() { mAdapter1.allItemsEnabled = false; mAdapter1.enabledItems.add(1); mAdapter3.allItemsEnabled = false; mAdapter3.enabledItems.add(1); CompositeListAdapter adapter = new CompositeListAdapter(); adapter.addAdapter(mAdapter1); adapter.addAdapter(mAdapter3); assertFalse(adapter.isEnabled(0)); assertTrue(adapter.isEnabled(1)); assertFalse(adapter.isEnabled(2)); assertTrue(adapter.isEnabled(3)); assertFalse(adapter.isEnabled(4)); } }