IdentityHashMapTest.java revision 2ad60cfc28e14ee8f0bb038720836a4696c478ad
1/* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18package org.apache.harmony.luni.tests.java.util; 19 20import java.io.Serializable; 21import java.util.Collection; 22import java.util.HashSet; 23import java.util.IdentityHashMap; 24import java.util.Iterator; 25import java.util.Map; 26import java.util.Set; 27import java.util.TreeSet; 28 29import org.apache.harmony.testframework.serialization.SerializationTest; 30import org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert; 31 32public class IdentityHashMapTest extends junit.framework.TestCase { 33 34 /** 35 * @tests java.util.IdentityHashMap#containsKey(java.lang.Object) 36 * @tests java.util.IdentityHashMap#containsValue(java.lang.Object) 37 * @tests java.util.IdentityHashMap#put(java.lang.Object, java.lang.Object) 38 * @tests java.util.IdentityHashMap#get(java.lang.Object) 39 */ 40 public void test_null_Keys_and_Values() { 41 // tests with null keys and values 42 IdentityHashMap map = new IdentityHashMap(); 43 Object result; 44 45 // null key and null value 46 result = map.put(null, null); 47 assertTrue("testA can not find null key", map.containsKey(null)); 48 assertTrue("testA can not find null value", map.containsValue(null)); 49 assertNull("testA can not get null value for null key", 50 map.get(null)); 51 assertNull("testA put returned wrong value", result); 52 53 // null value 54 String value = "a value"; 55 result = map.put(null, value); 56 assertTrue("testB can not find null key", map.containsKey(null)); 57 assertTrue("testB can not find a value with null key", map 58 .containsValue(value)); 59 assertTrue("testB can not get value for null key", 60 map.get(null) == value); 61 assertNull("testB put returned wrong value", result); 62 63 // a null key 64 String key = "a key"; 65 result = map.put(key, null); 66 assertTrue("testC can not find a key with null value", map 67 .containsKey(key)); 68 assertTrue("testC can not find null value", map.containsValue(null)); 69 assertNull("testC can not get null value for key", map.get(key)); 70 assertNull("testC put returned wrong value", result); 71 72 // another null key 73 String anothervalue = "another value"; 74 result = map.put(null, anothervalue); 75 assertTrue("testD can not find null key", map.containsKey(null)); 76 assertTrue("testD can not find a value with null key", map 77 .containsValue(anothervalue)); 78 assertTrue("testD can not get value for null key", 79 map.get(null) == anothervalue); 80 assertTrue("testD put returned wrong value", result == value); 81 82 // remove a null key 83 result = map.remove(null); 84 assertTrue("testE remove returned wrong value", result == anothervalue); 85 assertTrue("testE should not find null key", !map.containsKey(null)); 86 assertTrue("testE should not find a value with null key", !map 87 .containsValue(anothervalue)); 88 assertNull("testE should not get value for null key", 89 map.get(null)); 90 } 91 92 /** 93 * @tests java.util.IdentityHashMap#put(java.lang.Object, java.lang.Object) 94 */ 95 public void test_putLjava_lang_ObjectLjava_lang_Object() { 96 IdentityHashMap<Object, Object> map = new IdentityHashMap<Object, Object>(); 97 98 // Test null as a key. 99 Object value = "Some value"; 100 map.put(null, value); 101 assertSame("Assert 0: Failure getting null key", value, map.get(null)); 102 103 // Test null as a value 104 Object key = "Some key"; 105 map.put(key, null); 106 assertNull("Assert 1: Failure getting null value", map.get(key)); 107 } 108 109 /** 110 * @tests java.util.IdentityHashMap#remove(java.lang.Object) 111 * @tests java.util.IdentityHashMap#keySet() 112 */ 113 public void test_remove() { 114 IdentityHashMap map = new IdentityHashMap(); 115 map.put(null, null); 116 map.put("key1", "value1"); 117 map.put("key2", "value2"); 118 map.remove("key1"); 119 120 assertTrue("Did not remove key1", !map.containsKey("key1")); 121 assertTrue("Did not remove the value for key1", !map 122 .containsValue("value1")); 123 124 assertTrue("Modified key2", map.get("key2") != null 125 && map.get("key2") == "value2"); 126 assertNull("Modified null entry", map.get(null)); 127 } 128 129 /** 130 * @tests java.util.IdentityHashMapTest#remove(java.lang.Object) 131 */ 132 public void test_removeLjava_lang_Object() { 133 // Regression for HARMONY-37 134 IdentityHashMap<String, String> hashMap = new IdentityHashMap<String, String>(); 135 hashMap.remove("absent"); 136 assertEquals("Assert 0: Size is incorrect", 0, hashMap.size()); 137 138 hashMap.put("key", "value"); 139 hashMap.remove("key"); 140 assertEquals("Assert 1: After removing non-null element size is incorrect", 0, hashMap.size()); 141 142 hashMap.put(null, null); 143 assertEquals("Assert 2: adding literal null failed", 1, hashMap.size()); 144 hashMap.remove(null); 145 assertEquals("Assert 3: After removing null element size is incorrect", 0, hashMap.size()); 146 } 147 148 /** 149 * @tests java.util.IdentityHashMap#entrySet() 150 * @tests java.util.IdentityHashMap#keySet() 151 * @tests java.util.IdentityHashMap#values() 152 */ 153 public void test_sets() { 154 // tests with null keys and values 155 IdentityHashMap map = new IdentityHashMap(); 156 157 // null key and null value 158 map.put("key", "value"); 159 map.put(null, null); 160 map.put("a key", null); 161 map.put("another key", null); 162 163 Set keyset = map.keySet(); 164 Collection valueset = map.values(); 165 Set entries = map.entrySet(); 166 Iterator it = entries.iterator(); 167 while (it.hasNext()) { 168 Map.Entry entry = (Map.Entry) it.next(); 169 assertTrue("EntrySetIterator can not find entry ", entries 170 .contains(entry)); 171 172 assertTrue("entry key not found in map", map.containsKey(entry 173 .getKey())); 174 assertTrue("entry value not found in map", map.containsValue(entry 175 .getValue())); 176 177 assertTrue("entry key not found in the keyset", keyset 178 .contains(entry.getKey())); 179 assertTrue("entry value not found in the valueset", valueset 180 .contains(entry.getValue())); 181 } 182 } 183 184 /** 185 * @tests java.util.IdentityHashMap#entrySet() 186 * @tests java.util.IdentityHashMap#remove(java.lang.Object) 187 */ 188 public void test_entrySet_removeAll() { 189 IdentityHashMap map = new IdentityHashMap(); 190 for (int i = 0; i < 1000; i++) { 191 map.put(new Integer(i), new Integer(i)); 192 } 193 Set set = map.entrySet(); 194 195 set.removeAll(set); 196 assertEquals("did not remove all elements in the map", 0, map.size()); 197 assertTrue("did not remove all elements in the entryset", set.isEmpty()); 198 199 Iterator it = set.iterator(); 200 assertTrue("entrySet iterator still has elements", !it.hasNext()); 201 } 202 203 /** 204 * @tests java.util.IdentityHashMap#keySet() 205 * @tests java.util.IdentityHashMap#clear() 206 */ 207 public void test_keySet_clear() { 208 IdentityHashMap map = new IdentityHashMap(); 209 for (int i = 0; i < 1000; i++) { 210 map.put(new Integer(i), new Integer(i)); 211 } 212 Set set = map.keySet(); 213 set.clear(); 214 215 assertEquals("did not remove all elements in the map", 0, map.size()); 216 assertTrue("did not remove all elements in the keyset", set.isEmpty()); 217 218 Iterator it = set.iterator(); 219 assertTrue("keySet iterator still has elements", !it.hasNext()); 220 } 221 222 /** 223 * @tests java.util.IdentityHashMap#values() 224 */ 225 public void test_values() { 226 227 IdentityHashMap map = new IdentityHashMap(); 228 for (int i = 0; i < 10; i++) { 229 map.put(new Integer(i), new Integer(i)); 230 } 231 232 Integer key = new Integer(20); 233 Integer value = new Integer(40); 234 map.put(key, value); 235 236 Collection vals = map.values(); 237 boolean result = vals.remove(key); 238 assertTrue("removed entries incorrectly", map.size() == 11 && !result); 239 assertTrue("removed key incorrectly", map.containsKey(key)); 240 assertTrue("removed value incorrectly", map.containsValue(value)); 241 242 result = vals.remove(value); 243 assertTrue("Did not remove entry as expected", map.size() == 10 244 && result); 245 assertTrue("Did not remove key as expected", !map.containsKey(key)); 246 assertTrue("Did not remove value as expected", !map 247 .containsValue(value)); 248 249 // put an equivalent key to a value 250 key = new Integer(1); 251 value = new Integer(100); 252 map.put(key, value); 253 254 result = vals.remove(key); 255 assertTrue("TestB. removed entries incorrectly", map.size() == 11 256 && !result); 257 assertTrue("TestB. removed key incorrectly", map.containsKey(key)); 258 assertTrue("TestB. removed value incorrectly", map.containsValue(value)); 259 260 result = vals.remove(value); 261 assertTrue("TestB. Did not remove entry as expected", map.size() == 10 262 && result); 263 assertTrue("TestB. Did not remove key as expected", !map 264 .containsKey(key)); 265 assertTrue("TestB. Did not remove value as expected", !map 266 .containsValue(value)); 267 268 vals.clear(); 269 assertEquals("Did not remove all entries as expected", 0, map.size()); 270 } 271 272 /** 273 * @tests java.util.IdentityHashMap#keySet() 274 * @tests java.util.IdentityHashMap#remove(java.lang.Object) 275 */ 276 public void test_keySet_removeAll() { 277 IdentityHashMap map = new IdentityHashMap(); 278 for (int i = 0; i < 1000; i++) { 279 map.put(new Integer(i), new Integer(i)); 280 } 281 Set set = map.keySet(); 282 set.removeAll(set); 283 284 assertEquals("did not remove all elements in the map", 0, map.size()); 285 assertTrue("did not remove all elements in the keyset", set.isEmpty()); 286 287 Iterator it = set.iterator(); 288 assertTrue("keySet iterator still has elements", !it.hasNext()); 289 } 290 291 /** 292 * @tests java.util.IdentityHashMap#keySet() 293 */ 294 public void test_keySet_retainAll() { 295 IdentityHashMap map = new IdentityHashMap(); 296 for (int i = 0; i < 1000; i++) { 297 map.put(new Integer(i), new Integer(i)); 298 } 299 Set set = map.keySet(); 300 301 // retain all the elements 302 boolean result = set.retainAll(set); 303 assertTrue("retain all should return false", !result); 304 assertEquals("did not retain all", 1000, set.size()); 305 306 // send empty set to retainAll 307 result = set.retainAll(new TreeSet()); 308 assertTrue("retain all should return true", result); 309 assertEquals("did not remove all elements in the map", 0, map.size()); 310 assertTrue("did not remove all elements in the keyset", set.isEmpty()); 311 312 Iterator it = set.iterator(); 313 assertTrue("keySet iterator still has elements", !it.hasNext()); 314 } 315 316 /** 317 * @tests java.util.IdentityHashMap#keySet() 318 * @tests java.util.IdentityHashMap#remove(java.lang.Object) 319 */ 320 public void test_keyset_remove() { 321 IdentityHashMap map = new IdentityHashMap(); 322 323 Integer key = new Integer(21); 324 325 map.put(new Integer(1), null); 326 map.put(new Integer(11), null); 327 map.put(key, null); 328 map.put(new Integer(31), null); 329 map.put(new Integer(41), null); 330 map.put(new Integer(51), null); 331 map.put(new Integer(61), null); 332 map.put(new Integer(71), null); 333 map.put(new Integer(81), null); 334 map.put(new Integer(91), null); 335 336 Set set = map.keySet(); 337 338 Set newset = new HashSet(); 339 Iterator it = set.iterator(); 340 while (it.hasNext()) { 341 Object element = it.next(); 342 if (element == key) { 343 it.remove(); 344 } else 345 newset.add(element); 346 } 347 int size = newset.size(); 348 assertTrue("keyset and newset don't have same size", 349 newset.size() == size); 350 assertTrue("element is in newset ", !newset.contains(key)); 351 assertTrue("element not removed from keyset", !set.contains(key)); 352 assertTrue("element not removed from map", !map.containsKey(key)); 353 354 assertTrue("newset and keyset do not have same elements 1", newset 355 .equals(set)); 356 assertTrue("newset and keyset do not have same elements 2", set 357 .equals(newset)); 358 } 359 360 // comparator for IdentityHashMap objects 361 private static final SerializableAssert COMPARATOR = new SerializableAssert() { 362 public void assertDeserialized(Serializable initial, 363 Serializable deserialized) { 364 365 IdentityHashMap init = (IdentityHashMap) initial; 366 IdentityHashMap desr = (IdentityHashMap) deserialized; 367 368 assertEquals("Size", init.size(), desr.size()); 369 } 370 }; 371 372 /** 373 * @tests serialization/deserialization compatibility with RI. 374 */ 375 public void testSerializationCompatibility() throws Exception { 376 IdentityHashMap<String, String> identityHashMap = new IdentityHashMap<String, String>(); 377 identityHashMap.put("key1", "value1"); 378 identityHashMap.put("key2", "value2"); 379 identityHashMap.put("key3", "value3"); 380 381 SerializationTest.verifyGolden(this, identityHashMap, COMPARATOR); 382 } 383} 384