1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamathpackage org.apache.harmony.tests.java.util;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.AbstractMap;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.AbstractSet;
2255392539fea537abfb6581b474918f9d611fba27Jesse Wilsonimport java.util.Collection;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collections;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Comparator;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.HashMap;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.HashSet;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Hashtable;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.IdentityHashMap;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Iterator;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.LinkedHashMap;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Map;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Set;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.TreeMap;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.WeakHashMap;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class AbstractMapTest extends junit.framework.TestCase {
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final String specialKey = "specialKey".intern();
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final String specialValue = "specialValue".intern();
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // The impl of MyMap is not realistic, but serves to create a type
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // that uses the default remove behavior.
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    class MyMap extends AbstractMap {
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final Set mySet = new HashSet(1);
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMap() {
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mySet.add(new Map.Entry() {
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                public Object getKey() {
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return specialKey;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                public Object getValue() {
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return specialValue;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                public Object setValue(Object object) {
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            });
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Object put(Object key, Object value) {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Set entrySet() {
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return mySet;
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
74229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.AbstractMap#keySet()
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_keySet() {
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map1 = new HashMap(0);
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("HashMap(0)", map1.keySet(), map1.keySet());
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map2 = new HashMap(10);
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("HashMap(10)", map2.keySet(), map2.keySet());
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Map map3 = Collections.EMPTY_MAP;
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("EMPTY_MAP", map3.keySet(), map3.keySet());
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map4 = new IdentityHashMap(1);
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("IdentityHashMap", map4.keySet(), map4.keySet());
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map5 = new LinkedHashMap(122);
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("LinkedHashMap", map5.keySet(), map5.keySet());
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map6 = new TreeMap();
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("TreeMap", map6.keySet(), map6.keySet());
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map7 = new WeakHashMap();
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("WeakHashMap", map7.keySet(), map7.keySet());
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
100229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.AbstractMap#remove(java.lang.Object)
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_removeLjava_lang_Object() {
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Object key = new Object();
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Object value = new Object();
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map1 = new HashMap(0);
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map1.put("key", value);
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("HashMap(0)", map1.remove("key"), value);
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map4 = new IdentityHashMap(1);
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map4.put(key, value);
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("IdentityHashMap", map4.remove(key), value);
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map5 = new LinkedHashMap(122);
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map5.put(key, value);
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("LinkedHashMap", map5.remove(key), value);
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map6 = new TreeMap(new Comparator() {
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Bogus comparator
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public int compare(Object object1, Object object2) {
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return 0;
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        });
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map6.put(key, value);
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("TreeMap", map6.remove(key), value);
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map7 = new WeakHashMap();
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map7.put(key, value);
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("WeakHashMap", map7.remove(key), value);
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap aSpecialMap = new MyMap();
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        aSpecialMap.put(specialKey, specialValue);
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Object valueOut = aSpecialMap.remove(specialKey);
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("MyMap", valueOut, specialValue);
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
138ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath     * java.util.AbstractMap#clear()
139ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath     */
140ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    public void test_clear() {
141ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        // normal clear()
142ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        AbstractMap map = new HashMap();
143ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.put(1, 1);
144ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.clear();
145ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertTrue(map.isEmpty());
146ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
147ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        // Special entrySet return a Set with no clear method.
148ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        AbstractMap myMap = new MocAbstractMap();
149ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        try {
150ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath            myMap.clear();
151ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath            fail("Should throw UnsupportedOprationException");
152ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        } catch (UnsupportedOperationException e) {
153ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath            // expected
154ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        }
155ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    }
156ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
157ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    class MocAbstractMap<K, V> extends AbstractMap {
158ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
159ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        public Set entrySet() {
160ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath            Set set = new MySet();
161ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath            return set;
162ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        }
163ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
164ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        class MySet extends HashSet {
165ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath            public void clear() {
166ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath                throw new UnsupportedOperationException();
167ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath            }
168ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        }
169ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    }
170ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
171ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    /**
172ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath     * java.util.AbstractMap#containsKey(Object)
173ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath     */
174ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    public void test_containsKey() {
175ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        AbstractMap map = new AMT();
176ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
177ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertFalse(map.containsKey("k"));
178ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertFalse(map.containsKey(null));
179ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
180ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.put("k", "v");
181ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.put("key", null);
182ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.put(null, "value");
183ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.put(null, null);
184ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
185ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertTrue(map.containsKey("k"));
186ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertTrue(map.containsKey("key"));
187ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertTrue(map.containsKey(null));
188ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    }
189ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
190ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    /**
191ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath     * java.util.AbstractMap#containsValue(Object)
192ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath     */
193ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    public void test_containValue() {
194ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        AbstractMap map = new AMT();
195ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
196ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertFalse(map.containsValue("v"));
197ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertFalse(map.containsValue(null));
198ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
199ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.put("k", "v");
200ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.put("key", null);
201ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.put(null, "value");
202ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
203ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertTrue(map.containsValue("v"));
204ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertTrue(map.containsValue("value"));
205ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertTrue(map.containsValue(null));
206ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    }
207ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
208ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    /**
209ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath     * java.util.AbstractMap#get(Object)
210ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath     */
211ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    public void test_get() {
212ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        AbstractMap map = new AMT();
213ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertNull(map.get("key"));
214ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertNull(map.get(null));
215ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
216ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.put("k", "v");
217ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.put("key", null);
218ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        map.put(null, "value");
219ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
220ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertEquals("v", map.get("k"));
221ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertNull(map.get("key"));
222ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        assertEquals("value", map.get(null));
223ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    }
224ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath
225ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath    /**
226229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.AbstractMap#values()
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_values() {
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map1 = new HashMap(0);
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("HashMap(0)", map1.values(), map1.values());
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map2 = new HashMap(10);
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("HashMap(10)", map2.values(), map2.values());
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Map map3 = Collections.EMPTY_MAP;
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("EMPTY_MAP", map3.values(), map3.values());
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map4 = new IdentityHashMap(1);
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("IdentityHashMap", map4.values(), map4.values());
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map5 = new LinkedHashMap(122);
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("IdentityHashMap", map5.values(), map5.values());
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map6 = new TreeMap();
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("TreeMap", map6.values(), map6.values());
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap map7 = new WeakHashMap();
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame("WeakHashMap", map7.values(), map7.values());
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
252229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.AbstractMap#clone()
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_clone() {
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        class MyMap extends AbstractMap implements Cloneable {
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private Map map = new HashMap();
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Set entrySet() {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return map.entrySet();
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Object put(Object key, Object value) {
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return map.put(key, value);
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Map getMap() {
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return map;
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Object clone() {
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return super.clone();
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (CloneNotSupportedException e) {
274ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath                    fail("Clone must be supported");
275ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath                    return null;
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMap map = new MyMap();
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map.put("one", "1");
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Map.Entry entry = (Map.Entry) map.entrySet().iterator().next();
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue("entry not added", entry.getKey() == "one"
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && entry.getValue() == "1");
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMap mapClone = (MyMap) map.clone();
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue("clone not shallow", map.getMap() == mapClone.getMap());
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
287f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public class AMT extends AbstractMap {
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Very crude AbstractMap implementation
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Vector values = new Vector();
292ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        Vector keys = new Vector();
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Set entrySet() {
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new AbstractSet() {
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                public Iterator iterator() {
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return new Iterator() {
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        int index = 0;
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        public boolean hasNext() {
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            return index < values.size();
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        public Object next() {
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            if (index < values.size()) {
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                Map.Entry me = new Map.Entry() {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    Object v = values.elementAt(index);
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    Object k = keys.elementAt(index);
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    public Object getKey() {
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                        return k;
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    }
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    public Object getValue() {
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                        return v;
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    public Object setValue(Object value) {
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                        return null;
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    }
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                };
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                index++;
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                return me;
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            }
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            return null;
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        public void remove() {
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    };
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                public int size() {
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return values.size();
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            };
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Object put(Object k, Object v) {
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            keys.add(k);
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            values.add(v);
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return v;
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
348229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * {@link java.util.AbstractMap#putAll(Map)}
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_putAllLMap() {
351ba45f538a14c08015021e899f5883f07ed2ff237Narayan Kamath        Hashtable ht = new Hashtable();
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AMT amt = new AMT();
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ht.put("this", "that");
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        amt.putAll(ht);
355f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Should be equal", amt, ht);
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35955392539fea537abfb6581b474918f9d611fba27Jesse Wilson    public void testEqualsWithNullValues() {
36055392539fea537abfb6581b474918f9d611fba27Jesse Wilson        Map<String, String> a = new HashMap<String, String>();
36155392539fea537abfb6581b474918f9d611fba27Jesse Wilson        a.put("a", null);
36255392539fea537abfb6581b474918f9d611fba27Jesse Wilson        a.put("b", null);
36355392539fea537abfb6581b474918f9d611fba27Jesse Wilson
36455392539fea537abfb6581b474918f9d611fba27Jesse Wilson        Map<String, String> b = new HashMap<String, String>();
36555392539fea537abfb6581b474918f9d611fba27Jesse Wilson        a.put("c", "cat");
36655392539fea537abfb6581b474918f9d611fba27Jesse Wilson        a.put("d", "dog");
36755392539fea537abfb6581b474918f9d611fba27Jesse Wilson
36855392539fea537abfb6581b474918f9d611fba27Jesse Wilson        assertFalse(a.equals(b));
36955392539fea537abfb6581b474918f9d611fba27Jesse Wilson        assertFalse(b.equals(a));
37055392539fea537abfb6581b474918f9d611fba27Jesse Wilson    }
37155392539fea537abfb6581b474918f9d611fba27Jesse Wilson
37255392539fea537abfb6581b474918f9d611fba27Jesse Wilson    public void testNullsOnViews() {
37355392539fea537abfb6581b474918f9d611fba27Jesse Wilson        Map<String, String> nullHostile = new Hashtable<String, String>();
37455392539fea537abfb6581b474918f9d611fba27Jesse Wilson
37555392539fea537abfb6581b474918f9d611fba27Jesse Wilson        nullHostile.put("a", "apple");
37655392539fea537abfb6581b474918f9d611fba27Jesse Wilson        testNullsOnView(nullHostile.entrySet());
37755392539fea537abfb6581b474918f9d611fba27Jesse Wilson
37855392539fea537abfb6581b474918f9d611fba27Jesse Wilson        nullHostile.put("a", "apple");
37955392539fea537abfb6581b474918f9d611fba27Jesse Wilson        testNullsOnView(nullHostile.keySet());
38055392539fea537abfb6581b474918f9d611fba27Jesse Wilson
38155392539fea537abfb6581b474918f9d611fba27Jesse Wilson        nullHostile.put("a", "apple");
38255392539fea537abfb6581b474918f9d611fba27Jesse Wilson        testNullsOnView(nullHostile.values());
38355392539fea537abfb6581b474918f9d611fba27Jesse Wilson    }
38455392539fea537abfb6581b474918f9d611fba27Jesse Wilson
38555392539fea537abfb6581b474918f9d611fba27Jesse Wilson    private void testNullsOnView(Collection<?> view) {
38655392539fea537abfb6581b474918f9d611fba27Jesse Wilson        try {
38755392539fea537abfb6581b474918f9d611fba27Jesse Wilson            assertFalse(view.contains(null));
38855392539fea537abfb6581b474918f9d611fba27Jesse Wilson        } catch (NullPointerException optional) {
38955392539fea537abfb6581b474918f9d611fba27Jesse Wilson        }
39055392539fea537abfb6581b474918f9d611fba27Jesse Wilson
39155392539fea537abfb6581b474918f9d611fba27Jesse Wilson        try {
39255392539fea537abfb6581b474918f9d611fba27Jesse Wilson            assertFalse(view.remove(null));
39355392539fea537abfb6581b474918f9d611fba27Jesse Wilson        } catch (NullPointerException optional) {
39455392539fea537abfb6581b474918f9d611fba27Jesse Wilson        }
39555392539fea537abfb6581b474918f9d611fba27Jesse Wilson
39655392539fea537abfb6581b474918f9d611fba27Jesse Wilson        Set<Object> setOfNull = Collections.singleton(null);
39755392539fea537abfb6581b474918f9d611fba27Jesse Wilson        assertFalse(view.equals(setOfNull));
39855392539fea537abfb6581b474918f9d611fba27Jesse Wilson
39955392539fea537abfb6581b474918f9d611fba27Jesse Wilson        try {
40055392539fea537abfb6581b474918f9d611fba27Jesse Wilson            assertFalse(view.removeAll(setOfNull));
40155392539fea537abfb6581b474918f9d611fba27Jesse Wilson        } catch (NullPointerException optional) {
40255392539fea537abfb6581b474918f9d611fba27Jesse Wilson        }
40355392539fea537abfb6581b474918f9d611fba27Jesse Wilson
40455392539fea537abfb6581b474918f9d611fba27Jesse Wilson        try {
40555392539fea537abfb6581b474918f9d611fba27Jesse Wilson            assertTrue(view.retainAll(setOfNull)); // destructive
40655392539fea537abfb6581b474918f9d611fba27Jesse Wilson        } catch (NullPointerException optional) {
40755392539fea537abfb6581b474918f9d611fba27Jesse Wilson        }
40855392539fea537abfb6581b474918f9d611fba27Jesse Wilson    }
40955392539fea537abfb6581b474918f9d611fba27Jesse Wilson
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void setUp() {
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void tearDown() {
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
416