OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / cts / tests / tests / widget / src / android / widget / cts / ArrayAdapterTest.java
diff --git a/cts/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java b/cts/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
new file mode 100644 (file)
index 0000000..4541e9d
--- /dev/null
@@ -0,0 +1,647 @@
+/*
+ * Copyright (C) 2008 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 android.widget.cts;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import android.database.DataSetObserver;
+import android.test.AndroidTestCase;
+import android.widget.ArrayAdapter;
+import android.widget.Filter;
+import android.widget.TextView;
+
+import com.android.cts.stub.R;
+
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
+
+@TestTargetClass(ArrayAdapter.class)
+public class ArrayAdapterTest extends AndroidTestCase {
+
+    private static final int INVALD_ID = -1;
+    private static final String STR1 = "string1";
+    private static final String STR2 = "string2";
+    private static final String STR3 = "string3";
+
+    private ArrayAdapter<String> mArrayAdapter;
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+          mArrayAdapter = new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line);
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "ArrayAdapter",
+            args = {android.content.Context.class, int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "ArrayAdapter",
+            args = {android.content.Context.class, int.class, int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "ArrayAdapter",
+            args = {android.content.Context.class, int.class, int.class, java.util.List.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "ArrayAdapter",
+            args = {android.content.Context.class, int.class, java.util.List.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "ArrayAdapter",
+            args = {android.content.Context.class, int.class, int.class, java.lang.Object[].class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "ArrayAdapter",
+            args = {android.content.Context.class, int.class, java.lang.Object[].class}
+        )
+    })
+    @ToBeFixed(bug = "1695243", explanation = "should add NullPointerException @throws"
+        + " clause into javadoc.")
+    public void testConstructor() {
+
+        new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line);
+        new ArrayAdapter<String>(mContext, INVALD_ID);// invalid resource id
+
+        new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line, R.id.text1);
+        new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line, INVALD_ID);
+
+        new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line,
+                new String[] {"str1", "str2"});
+
+        new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line, R.id.text1,
+                new String[] {"str1", "str2"});
+
+        List<String> list = new ArrayList<String>();
+        list.add(STR1);
+        list.add(STR2);
+
+        new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line, list);
+
+        new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line, R.id.text1, list);
+
+        // invalid input
+        try {
+            new ArrayAdapter<String>(null, R.layout.simple_dropdown_item_1line);
+            fail("should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected exception
+        }
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setNotifyOnChange",
+            args = {boolean.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "notifyDataSetChanged",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "add",
+            args = {java.lang.Object.class}
+        ),
+        @TestTargetNew(
+                level = TestLevel.COMPLETE,
+                method = "clear",
+                args = {}
+        )
+
+    })
+    public void testDataChangeEvent() {
+        final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
+        mArrayAdapter.registerDataSetObserver(mockDataSetObserver);
+
+        // enable automatically notifying.
+        mArrayAdapter.setNotifyOnChange(true);
+        assertEquals(0, mockDataSetObserver.getCalledOnChangedCount());
+        mArrayAdapter.add(STR1);
+        assertEquals(1, mArrayAdapter.getCount());
+        assertEquals(1, mockDataSetObserver.getCalledOnChangedCount());
+        mArrayAdapter.add(STR2);
+        assertEquals(2, mArrayAdapter.getCount());
+        assertEquals(2, mockDataSetObserver.getCalledOnChangedCount());
+
+        // reset data
+        mArrayAdapter.clear();
+        // clear notify changed
+        assertEquals(3, mockDataSetObserver.getCalledOnChangedCount());
+        assertEquals(0, mArrayAdapter.getCount());
+        // if empty before, clear also notify changed
+        mArrayAdapter.clear();
+        assertEquals(4, mockDataSetObserver.getCalledOnChangedCount());
+        mockDataSetObserver.clearCount();
+        assertEquals(0, mockDataSetObserver.getCalledOnChangedCount());
+
+        // disable auto notify
+        mArrayAdapter.setNotifyOnChange(false);
+
+        mArrayAdapter.add(STR3);
+        assertEquals(1, mArrayAdapter.getCount());
+        assertEquals(0, mockDataSetObserver.getCalledOnChangedCount());
+
+        // manually notify
+        mArrayAdapter.notifyDataSetChanged();
+        assertEquals(1, mockDataSetObserver.getCalledOnChangedCount());
+        // no data changed, but force notify
+        mArrayAdapter.notifyDataSetChanged();
+        assertEquals(2, mockDataSetObserver.getCalledOnChangedCount());
+        // once called notify, auto notify enabled
+        mArrayAdapter.add(STR3);
+        assertEquals(3, mockDataSetObserver.getCalledOnChangedCount());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+                level = TestLevel.COMPLETE,
+                method = "getContext",
+                args = {}
+            ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "getCount",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "getView",
+            args = {int.class, android.view.View.class, android.view.ViewGroup.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "getDropDownView",
+            args = {int.class, android.view.View.class, android.view.ViewGroup.class}
+        )
+    })
+    @ToBeFixed(bug = "1695243", explanation = "should add NullPointerException @throws"
+        + " clause into javadoc.")
+    public void testAccessView() {
+        final TextView textView = new TextView(mContext);
+        textView.setText(STR3);
+
+        assertNotNull(mArrayAdapter.getContext());
+
+        assertEquals(0, mArrayAdapter.getCount());
+
+        mArrayAdapter.add(STR1);
+        mArrayAdapter.add(STR2);
+        mArrayAdapter.add(STR3);
+
+        assertEquals(3, mArrayAdapter.getCount());
+
+        assertEquals(STR1, ((TextView) mArrayAdapter.getView(0, null, null)).getText());
+        assertEquals(STR2, ((TextView) mArrayAdapter.getView(1, null, null)).getText());
+        assertEquals(STR3, ((TextView) mArrayAdapter.getDropDownView(2, null, null)).getText());
+
+        assertEquals(STR3, textView.getText());
+        assertSame(textView, mArrayAdapter.getView(0, textView, null));
+        assertSame(textView, mArrayAdapter.getDropDownView(0, textView, null));
+        assertEquals(STR1, textView.getText());
+
+        try {
+            assertEquals(textView, mArrayAdapter.getView(-1, textView, null));
+            fail("should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+        try {
+            assertEquals(textView, mArrayAdapter.getDropDownView(-1, textView, null));
+            fail("should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+        try {
+            assertEquals(textView,
+                    mArrayAdapter.getView(mArrayAdapter.getCount(), textView, null));
+            fail("should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+        try {
+            assertEquals(textView,
+                    mArrayAdapter.getDropDownView(mArrayAdapter.getCount(), textView, null));
+            fail("should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "getFilter",
+        args = {}
+    )
+    @ToBeFixed(bug = "", explanation = "Can not check the filter's filting result.")
+    public void testGetFilter() {
+        Filter filter = mArrayAdapter.getFilter();
+
+        assertNotNull(mArrayAdapter.getFilter());
+        assertSame(filter, mArrayAdapter.getFilter());
+    }
+
+    /**
+     * just simple change the resource id from which the drop view inflate from
+     * we set a xml that not contain a textview, so exception should throw to lete us know
+     * sucessfully change the dropdown xml, but should not affect the normal view by getview
+     */
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "setDropDownViewResource",
+        args = {int.class}
+    )
+    public void testSetDropDownViewResouce() {
+        mArrayAdapter.add(STR1);
+
+        mArrayAdapter.getDropDownView(0, null, null);
+
+        mArrayAdapter.setDropDownViewResource(R.layout.tabhost_layout);
+        // getview is ok
+        mArrayAdapter.getView(0, null, null);
+        // getDropDownView error for it changed
+        try {
+            mArrayAdapter.getDropDownView(0, null, null);
+            fail("should throw IllegalStateException");
+        } catch (IllegalStateException e) {
+            // expected exception
+        }
+
+        mArrayAdapter.setDropDownViewResource(INVALD_ID);
+    }
+
+    /**
+     * insert the item to the specific position, notify data changed
+     * check -1, normal, > count
+     */
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "insert",
+            args = {java.lang.Object.class, int.class}
+        )
+    })
+    public void testInsert() {
+        mArrayAdapter.setNotifyOnChange(true);
+        final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
+        mArrayAdapter.registerDataSetObserver(mockDataSetObserver);
+
+        mArrayAdapter.insert(STR1, 0);
+        assertEquals(1, mArrayAdapter.getCount());
+        assertEquals(0, mArrayAdapter.getPosition(STR1));
+        assertEquals(1, mockDataSetObserver.getCalledOnChangedCount());
+
+        mArrayAdapter.insert(STR2, 0);
+        assertEquals(2, mArrayAdapter.getCount());
+        assertEquals(1, mArrayAdapter.getPosition(STR1));
+        assertEquals(0, mArrayAdapter.getPosition(STR2));
+
+        mArrayAdapter.insert(STR3, mArrayAdapter.getCount());
+        assertEquals(mArrayAdapter.getCount() - 1, mArrayAdapter.getPosition(STR3));
+
+        mArrayAdapter.insert(null, 0);
+        assertEquals(0, mArrayAdapter.getPosition(null));
+
+        try {
+            mArrayAdapter.insert(STR1, -1);
+            fail("should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+            // expected exception
+        }
+
+        try {
+            mArrayAdapter.insert(STR1, mArrayAdapter.getCount() + 1);
+            fail("should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+            // expected exception
+        }
+    }
+
+    /**
+     * return the given position obj
+     * test range: -1, normal, > count
+     */
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "getItem",
+        args = {int.class}
+    )
+    public void testGetItem() {
+        mArrayAdapter.add(STR1);
+        mArrayAdapter.add(STR2);
+        mArrayAdapter.add(STR3);
+
+        assertSame(STR1, mArrayAdapter.getItem(0));
+        assertSame(STR2, mArrayAdapter.getItem(1));
+        assertSame(STR3, mArrayAdapter.getItem(2));
+
+        // test invalid input
+        try {
+            mArrayAdapter.getItem(-1);
+            fail("should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+            // expected exception
+        }
+
+        try {
+            mArrayAdapter.getItem(mArrayAdapter.getCount());
+            fail("should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+            // expected exception
+        }
+    }
+
+    /**
+     * just return the given position
+     */
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "getItemId",
+        args = {int.class}
+    )
+    public void testGetItemId() {
+        mArrayAdapter.add(STR1);
+        mArrayAdapter.add(STR2);
+        mArrayAdapter.add(STR3);
+
+        assertEquals(0, mArrayAdapter.getItemId(0));
+        assertEquals(1, mArrayAdapter.getItemId(1));
+        assertEquals(2, mArrayAdapter.getItemId(2));
+
+        // test invalid input
+        assertEquals(-1, mArrayAdapter.getItemId(-1));
+        assertEquals(mArrayAdapter.getCount(),
+                mArrayAdapter.getItemId(mArrayAdapter.getCount()));
+    }
+
+    /*
+     * return the obj position that in the array, if there are same objs, return the first one
+     */
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "getPosition",
+        args = {java.lang.Object.class}
+    )
+    public void testGetPosition() {
+        mArrayAdapter.add(STR1);
+        mArrayAdapter.add(STR2);
+        mArrayAdapter.add(STR1);
+
+        assertEquals(0, mArrayAdapter.getPosition(STR1));
+        assertEquals(1, mArrayAdapter.getPosition(STR2));
+        // return the first one if same obj exsit
+        assertEquals(0, mArrayAdapter.getPosition(STR1));
+
+        assertEquals(-1, mArrayAdapter.getPosition(STR3));
+
+        // test invalid input
+        assertEquals(-1, mArrayAdapter.getPosition(null));
+    }
+
+    /**
+     * Removes the specified object from the array. notify data changed
+     * remove first one if duplicated string in the array
+     */
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "remove",
+        args = {java.lang.Object.class}
+    )
+    public void testRemove() {
+        final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
+        mArrayAdapter.registerDataSetObserver(mockDataSetObserver);
+        mArrayAdapter.setNotifyOnChange(true);
+
+        // remove the not exist one
+        assertEquals(0, mArrayAdapter.getCount());
+        assertEquals(0, mockDataSetObserver.getCalledOnChangedCount());
+        // remove the item not exist also notify change
+        mArrayAdapter.remove(STR1);
+        assertEquals(1, mockDataSetObserver.getCalledOnChangedCount());
+
+        mArrayAdapter.add(STR1);
+        mArrayAdapter.add(STR2);
+        mArrayAdapter.add(STR3);
+        mArrayAdapter.add(STR2);
+        mockDataSetObserver.clearCount();
+        assertEquals(0, mockDataSetObserver.getCalledOnChangedCount());
+        assertEquals(4, mArrayAdapter.getCount());
+
+        mArrayAdapter.remove(STR1);
+        assertEquals(3, mArrayAdapter.getCount());
+        assertEquals(-1, mArrayAdapter.getPosition(STR1));
+        assertEquals(0, mArrayAdapter.getPosition(STR2));
+        assertEquals(1, mArrayAdapter.getPosition(STR3));
+        assertEquals(1, mockDataSetObserver.getCalledOnChangedCount());
+
+        mArrayAdapter.remove(STR2);
+        assertEquals(2, mArrayAdapter.getCount());
+        // remove the first one if dumplicated
+        assertEquals(1, mArrayAdapter.getPosition(STR2));
+        assertEquals(0, mArrayAdapter.getPosition(STR3));
+
+        mArrayAdapter.remove(STR2);
+        assertEquals(1, mArrayAdapter.getCount());
+        assertEquals(-1, mArrayAdapter.getPosition(STR2));
+        assertEquals(0, mArrayAdapter.getPosition(STR3));
+    }
+
+    /*
+     * Creates a new ArrayAdapter from external resources. The content of the array is
+     * obtained through {@link android.content.res.Resources#getTextArray(int)}.
+     */
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "createFromResource",
+        args = {android.content.Context.class, int.class, int.class}
+    )
+    @ToBeFixed(bug = "1695243", explanation = "should add NullPointerException @throws"
+        + " clause into javadoc.")
+    public void testCreateFromResource() {
+        ArrayAdapter.createFromResource(mContext, R.array.string, R.layout.simple_spinner_item);
+
+        // invalid input
+        try {
+            ArrayAdapter.createFromResource(null, R.array.string, R.layout.simple_spinner_item);
+            fail("should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected exception
+        }
+
+        try {
+            ArrayAdapter.createFromResource(mContext, INVALD_ID, R.layout.simple_spinner_item);
+            fail("should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected exception
+        }
+
+       ArrayAdapter.createFromResource(mContext, R.array.string, INVALD_ID);
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "createFromResource",
+        args = {android.content.Context.class, int.class, int.class}
+    )
+    public void testSort() {
+        final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
+        mArrayAdapter.registerDataSetObserver(mockDataSetObserver);
+        mArrayAdapter.setNotifyOnChange(true);
+        assertEquals(0, mockDataSetObserver.getCalledOnChangedCount());
+
+        mArrayAdapter.sort( new Comparator<String>() {
+            public int compare(String o1, String o2) {
+                return 0;
+            }
+        });
+        assertEquals(1, mockDataSetObserver.getCalledOnChangedCount());
+
+        mArrayAdapter.sort(null);
+        assertEquals(2, mockDataSetObserver.getCalledOnChangedCount());
+    }
+
+    /**
+     * insert multiple items via add, notify data changed
+     * check count and content
+     */
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "add",
+            args = {Object.class}
+        )
+    })
+    public void testAdd() {
+        mArrayAdapter.setNotifyOnChange(true);
+        final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
+        mArrayAdapter.registerDataSetObserver(mockDataSetObserver);
+
+        mArrayAdapter.clear();
+        assertEquals(mArrayAdapter.getCount(), 0);
+
+        mArrayAdapter.add("testing");
+        mArrayAdapter.add("android");
+        assertEquals(mArrayAdapter.getCount(), 2);
+        assertEquals(mArrayAdapter.getItem(0), "testing");
+        assertEquals(mArrayAdapter.getItem(1), "android");
+    }
+
+    /**
+     * insert multiple items via addAll, notify data changed
+     * check count and content
+     */
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "addAll",
+            args = {java.util.Collection.class}
+        )
+    })
+    public void testAddAllCollection() {
+        mArrayAdapter.setNotifyOnChange(true);
+        final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
+        mArrayAdapter.registerDataSetObserver(mockDataSetObserver);
+
+        List<String> list = new ArrayList<String>();
+        list.add("");
+        list.add("hello");
+        list.add("android");
+        list.add("!");
+
+        mArrayAdapter.clear();
+        assertEquals(mArrayAdapter.getCount(), 0);
+
+        mArrayAdapter.addAll(list);
+        assertEquals(mArrayAdapter.getCount(), list.size());
+
+        assertEquals(mArrayAdapter.getItem(0), list.get(0));
+        assertEquals(mArrayAdapter.getItem(1), list.get(1));
+        assertEquals(mArrayAdapter.getItem(2), list.get(2));
+        assertEquals(mArrayAdapter.getItem(3), list.get(3));
+    }
+
+    /**
+     * insert multiple items via addAll, notify data changed
+     * check count and content
+     */
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "addAll",
+            args = {Object[].class}
+        )
+    })
+    public void testAddAllParams() {
+        mArrayAdapter.setNotifyOnChange(true);
+        final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
+        mArrayAdapter.registerDataSetObserver(mockDataSetObserver);
+
+        mArrayAdapter.clear();
+        assertEquals(mArrayAdapter.getCount(), 0);
+
+        mArrayAdapter.addAll("this", "is", "a", "unit", "test");
+        assertEquals(mArrayAdapter.getCount(), 5);
+        assertEquals(mArrayAdapter.getItem(0), "this");
+        assertEquals(mArrayAdapter.getItem(1), "is");
+        assertEquals(mArrayAdapter.getItem(2), "a");
+        assertEquals(mArrayAdapter.getItem(3), "unit");
+        assertEquals(mArrayAdapter.getItem(4), "test");
+    }
+
+    private static class MockDataSetObserver extends DataSetObserver {
+
+        private int mCalledOnChangedCount;
+        private int mOnCalledInvalidatedCount;
+
+        public MockDataSetObserver() {
+            clearCount();
+        }
+
+        public int getCalledOnChangedCount() {
+            return mCalledOnChangedCount;
+        }
+
+        public int getCalledOnInvalidatedCount() {
+            return mOnCalledInvalidatedCount;
+        }
+
+        public void clearCount() {
+            mCalledOnChangedCount = 0;
+            mOnCalledInvalidatedCount = 0;
+        }
+
+        public void onChanged() {
+            mCalledOnChangedCount++;
+        }
+
+        public void onInvalidated() {
+            mOnCalledInvalidatedCount++;
+        }
+    }
+}