1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage tests.api.java.util;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetNew;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestLevel;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetClass;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.AbstractMap;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.AbstractSet;
2672e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilsonimport java.util.Collection;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Collections;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Comparator;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.HashMap;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.HashSet;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Hashtable;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.IdentityHashMap;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Iterator;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.LinkedHashMap;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Map;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Set;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.TreeMap;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Vector;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.WeakHashMap;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@TestTargetClass(AbstractMap.class)
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class AbstractMapTest extends junit.framework.TestCase {
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static final String specialKey = "specialKey".intern();
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static final String specialValue = "specialValue".intern();
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // The impl of MyMap is not realistic, but serves to create a type
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // that uses the default remove behavior.
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    class MyMap extends AbstractMap {
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Set mySet = new HashSet(1);
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MyMap() {
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mySet.add(new Map.Entry() {
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public Object getKey() {
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return specialKey;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public Object getValue() {
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return specialValue;
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public Object setValue(Object object) {
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return null;
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            });
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Object put(Object key, Object value) {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Set entrySet() {
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return mySet;
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.util.AbstractMap#keySet()
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "Doesn't verify returned set of keys.",
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "keySet",
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_keySet() {
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map1 = new HashMap(0);
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("HashMap(0)", map1.keySet(), map1.keySet());
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map2 = new HashMap(10);
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("HashMap(10)", map2.keySet(), map2.keySet());
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Map map3 = Collections.EMPTY_MAP;
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("EMPTY_MAP", map3.keySet(), map3.keySet());
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map4 = new IdentityHashMap(1);
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("IdentityHashMap", map4.keySet(), map4.keySet());
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map5 = new LinkedHashMap(122);
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("LinkedHashMap", map5.keySet(), map5.keySet());
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map6 = new TreeMap();
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("TreeMap", map6.keySet(), map6.keySet());
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map7 = new WeakHashMap();
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("WeakHashMap", map7.keySet(), map7.keySet());
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.util.AbstractMap#remove(java.lang.Object)
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "Doesn't verify UnsupportedOperationException.",
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "remove",
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.Object.class}
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_removeLjava_lang_Object() {
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object key = new Object();
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object value = new Object();
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map1 = new HashMap(0);
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        map1.put("key", value);
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("HashMap(0)", map1.remove("key"), value);
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map4 = new IdentityHashMap(1);
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        map4.put(key, value);
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("IdentityHashMap", map4.remove(key), value);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map5 = new LinkedHashMap(122);
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        map5.put(key, value);
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("LinkedHashMap", map5.remove(key), value);
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map6 = new TreeMap(new Comparator() {
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Bogus comparator
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public int compare(Object object1, Object object2) {
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return 0;
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        });
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        map6.put(key, value);
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("TreeMap", map6.remove(key), value);
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map7 = new WeakHashMap();
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        map7.put(key, value);
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("WeakHashMap", map7.remove(key), value);
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap aSpecialMap = new MyMap();
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        aSpecialMap.put(specialKey, specialValue);
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object valueOut = aSpecialMap.remove(specialKey);
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("MyMap", valueOut, specialValue);
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.util.AbstractMap#values()
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "Doesn't verify returned Collection.",
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "values",
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_values() {
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map1 = new HashMap(0);
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("HashMap(0)", map1.values(), map1.values());
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map2 = new HashMap(10);
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("HashMap(10)", map2.values(), map2.values());
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Map map3 = Collections.EMPTY_MAP;
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("EMPTY_MAP", map3.values(), map3.values());
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map4 = new IdentityHashMap(1);
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("IdentityHashMap", map4.values(), map4.values());
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map5 = new LinkedHashMap(122);
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("IdentityHashMap", map5.values(), map5.values());
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map6 = new TreeMap();
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("TreeMap", map6.values(), map6.values());
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap map7 = new WeakHashMap();
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertSame("WeakHashMap", map7.values(), map7.values());
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.util.AbstractMap#clone()
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "Doesn't verify CloneNotSupportedException.",
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "clone",
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_clone() {
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        class MyMap extends AbstractMap implements Cloneable {
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            private Map map = new HashMap();
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public Set entrySet() {
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return map.entrySet();
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public Object put(Object key, Object value) {
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return map.put(key, value);
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public Map getMap() {
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return map;
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public Object clone() {
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return super.clone();
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (CloneNotSupportedException e) {
215a0ebf91e58c17487a8bd1be6e64193193deae26fJesse Wilson                    throw new AssertionError(e); // android-changed
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ;
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MyMap map = new MyMap();
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        map.put("one", "1");
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Map.Entry entry = (Map.Entry) map.entrySet().iterator().next();
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("entry not added", entry.getKey() == "one"
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                && entry.getValue() == "1");
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MyMap mapClone = (MyMap) map.clone();
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("clone not shallow", map.getMap() == mapClone.getMap());
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public class AMT extends AbstractMap {
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Very crude AbstractMap implementation
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Vector values = new Vector();
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Vector keys   = new Vector();
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Set entrySet() {
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new AbstractSet() {
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public Iterator iterator() {
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return new Iterator() {
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        int index = 0;
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public boolean hasNext() {
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return index < values.size();
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public Object next() {
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            if (index < values.size()) {
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                Map.Entry me = new Map.Entry() {
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    Object v = values.elementAt(index);
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    Object k = keys.elementAt(index);
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    public Object getKey() {
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                        return k;
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    }
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    public Object getValue() {
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                        return v;
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    }
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    public Object setValue(Object value) {
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                        return null;
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    }
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                };
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                index++;
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                return me;
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            }
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return null;
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public void remove() {
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    };
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public int size() {
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return values.size();
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Object put(Object k, Object v) {
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keys.add(k);
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            values.add(v);
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return v;
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests {@link java.util.AbstractMap#putAll(Map)}
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "Doesn't verify exceptions.",
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "putAll",
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.util.Map.class}
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_putAllLMap() {
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Hashtable ht  = new Hashtable();
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AMT amt = new AMT();
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ht.put("this", "that");
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        amt.putAll(ht);
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertEquals("Should be equal", amt, ht);
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30672e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson    public void testEqualsWithNullValues() {
30772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        Map<String, String> a = new HashMap<String, String>();
30872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        a.put("a", null);
30972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        a.put("b", null);
31072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
31172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        Map<String, String> b = new HashMap<String, String>();
31272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        a.put("c", "cat");
31372e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        a.put("d", "dog");
31472e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
31572e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        assertFalse(a.equals(b));
31672e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        assertFalse(b.equals(a));
31772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson    }
31872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
31972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson    public void testNullsOnViews() {
32072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        Map<String, String> nullHostile = new Hashtable<String, String>();
32172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
32272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        nullHostile.put("a", "apple");
32372e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        testNullsOnView(nullHostile.entrySet());
32472e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
32572e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        nullHostile.put("a", "apple");
32672e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        testNullsOnView(nullHostile.keySet());
32772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
32872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        nullHostile.put("a", "apple");
32972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        testNullsOnView(nullHostile.values());
33072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson    }
33172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
33272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson    private void testNullsOnView(Collection<?> view) {
33372e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        try {
33472e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            assertFalse(view.contains(null));
33572e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        } catch (NullPointerException optional) {
33672e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        }
33772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
33872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        try {
33972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            assertFalse(view.remove(null));
34072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        } catch (NullPointerException optional) {
34172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        }
34272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
34372e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        Set<Object> setOfNull = Collections.singleton(null);
34472e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        assertFalse(view.equals(setOfNull));
34572e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
34672e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        try {
34772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            assertFalse(view.removeAll(setOfNull));
34872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        } catch (NullPointerException optional) {
34972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        }
35072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
35172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        try {
35272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            assertTrue(view.retainAll(setOfNull)); // destructive
35372e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        } catch (NullPointerException optional) {
35472e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        }
35572e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson    }
35672e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void setUp() {
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void tearDown() {
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
363