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