blob: f7dc08e27c0c410f795abf0209119788b9ab7c5b [file] [log] [blame]
/*
* 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 android.content.Context;
import android.database.DataSetObserver;
import android.test.AndroidTestCase;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import com.google.common.collect.Lists;
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));
}
}