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 18 package org.apache.harmony.luni.tests.java.util; 19 20 import java.io.ByteArrayInputStream; 21 import java.io.ByteArrayOutputStream; 22 import java.io.IOException; 23 import java.io.ObjectInputStream; 24 import java.io.ObjectOutputStream; 25 import java.lang.reflect.Method; 26 import java.util.Collection; 27 import java.util.HashMap; 28 import java.util.Iterator; 29 import java.util.Map; 30 import java.util.NoSuchElementException; 31 import java.util.Random; 32 import java.util.Set; 33 import java.util.SortedMap; 34 import java.util.TreeMap; 35 36 import junit.framework.TestCase; 37 38 public abstract class SortedMapTestBase extends TestCase { 39 40 final int N = 1000; 41 final int TRIES = 100; 42 43 SortedMap<Integer, Integer> map; 44 SortedMap<Integer, Integer> ref; 45 46 Random rnd; 47 48 protected void setUp() throws Exception { 49 rnd = new Random(-1); 50 for (int i = 0; i < N ; i++) { 51 ref.put(rnd.nextInt(N) * 2, rnd.nextBoolean() ? null : rnd.nextInt(N) * 2); 52 } 53 } 54 55 public final void testClear() { 56 map.clear(); 57 assertTrue(map.isEmpty()); 58 } 59 60 public final void testContainsKey() { 61 for (int i = 0; i < TRIES; i++) { 62 int key = rnd.nextInt(N); 63 assertEquals(ref.containsKey(key), map.containsKey(key)); 64 } 65 } 66 67 68 public final void testContainsValue() { 69 for (int i = 0; i < TRIES; i++) { 70 int value = rnd.nextInt(N); 71 assertEquals(ref.containsValue(value), map.containsValue(value)); 72 } 73 } 74 75 76 public final void testEntrySet() { 77 Set<Map.Entry<Integer,Integer>> refSet = ref.entrySet(); 78 Set<Map.Entry<Integer,Integer>> mapSet = map.entrySet(); 79 for (Map.Entry<Integer,Integer> e : refSet) { 80 assertTrue(mapSet.contains(e)); 81 } 82 for (Map.Entry<Integer,Integer> e : mapSet) { 83 assertTrue(refSet.contains(e)); 84 } 85 assertEquals(ref.entrySet(), map.entrySet()); 86 } 87 88 89 public final void testGet() { 90 for (int i = 0; i < TRIES; i++) { 91 int key = rnd.nextInt(N); 92 assertEquals(ref.get(key), map.get(key)); 93 } 94 } 95 96 97 public final void testKeySet() { 98 assertEquals(ref.keySet(), map.keySet()); 99 Iterator<Integer> i = ref.keySet().iterator(); 100 Iterator<Integer> j = map.keySet().iterator(); 101 while (i.hasNext()) { 102 assertEquals(i.next(), j.next()); 103 if (rnd.nextBoolean()) { 104 j.remove(); 105 i.remove(); 106 } 107 } 108 } 109 110 111 public final void testPut() { 112 for (int i = 0; i < TRIES; i++) { 113 int key = rnd.nextInt(N); 114 int value = rnd.nextInt(N); 115 assertEquals(ref.put(key, value), map.put(key, value)); 116 assertEquals(ref.get(key), map.get(key)); 117 assertEquals(ref, map); 118 } 119 } 120 121 public final void testPut0() { 122 ref.clear(); 123 map.clear(); 124 for (int i = 0; i < N; i++) { 125 int key = rnd.nextInt(N); 126 int value = rnd.nextInt(N); 127 assertEquals(ref.put(key, value), map.put(key, value)); 128 assertEquals(ref.get(key), map.get(key)); 129 } 130 } 131 132 public final void testPutAll() { 133 Map<Integer, Integer> mixin = new HashMap<Integer, Integer>(TRIES); 134 for (int i = 0; i < TRIES; i++) { 135 mixin.put(rnd.nextInt(N), rnd.nextInt(N)); 136 } 137 ref.putAll(mixin); 138 map.putAll(mixin); 139 assertEquals(ref, map); 140 } 141 142 143 public final void testRemove() { 144 for (int i = 0; i < N; i++) { 145 int key = rnd.nextInt(N); 146 assertEquals(ref.remove(key), map.remove(key)); 147 if (i % (N / TRIES) == 0) { 148 assertEquals(ref, map); 149 } 150 } 151 } 152 153 public final void testRemove0() { 154 while (!ref.isEmpty()) { 155 int key = ref.tailMap((ref.firstKey() + ref.lastKey()) / 2) 156 .firstKey(); 157 assertEquals(ref.remove(key), map.remove(key)); 158 } 159 } 160 161 public final void testSize() { 162 assertEquals(ref.size(), map.size()); 163 } 164 165 166 public final void testValues() { 167 assertEquals(ref.values().size(), map.values().size()); 168 assertTrue(ref.values().containsAll(map.values())); 169 assertTrue(map.values().containsAll(ref.values())); 170 171 Iterator<Integer> i = ref.values().iterator(); 172 Iterator<Integer> j = map.values().iterator(); 173 while (i.hasNext()) { 174 assertEquals(i.next(), j.next()); 175 if (rnd.nextBoolean()) { 176 j.remove(); 177 i.remove(); 178 } 179 } 180 } 181 182 public final void testComparator() { 183 assertEquals(ref.comparator(), map.comparator()); 184 } 185 186 187 public final void testFirstKey() { 188 assertEquals(ref.firstKey(), map.firstKey()); 189 } 190 191 192 public final void testHeadMap() { 193 for (int i = 0; i < TRIES; i++) { 194 int key = rnd.nextInt(N); 195 checkSubMap(ref.headMap(key), map.headMap(key)); 196 } 197 checkSubMap(ref.headMap(-1), map.headMap(-1)); 198 } 199 200 public final void testLastKey() { 201 assertEquals(ref.lastKey(), map.lastKey()); 202 } 203 204 public final void testSubMap() { 205 for (int i = 0; i < TRIES; i++) { 206 int key0 = rnd.nextInt(N/2); 207 int key1 = rnd.nextInt(N/2) + N/2; 208 if (ref.comparator() != null && 209 ref.comparator().compare(key0, key1) > 0) { 210 211 int tmp = key0; 212 key0 = key1; 213 key1 = tmp; 214 } 215 checkSubMap(ref.subMap(key0, key1), map.subMap(key0, key1)); 216 } 217 boolean caught = false; 218 try { 219 if (ref.comparator() != null && ref.comparator().compare(100, 0) < 0) { 220 map.subMap(0, 100); 221 } else { 222 map.subMap(100, 0); 223 } 224 } catch (IllegalArgumentException e) { 225 caught = true; 226 } 227 assertTrue(caught); 228 229 int firstKey = ref.firstKey(); 230 Map.Entry<Integer, Integer> refE = ref.entrySet().iterator().next(); 231 Map.Entry<Integer, Integer> mapE = map.entrySet().iterator().next(); 232 mapE.setValue(-1); 233 refE.setValue(-1); 234 assertEquals(ref.get(firstKey), map.get(firstKey)); 235 } 236 237 238 public final void testTailMap() { 239 for (int i = 0; i < TRIES; i++) { 240 int key = rnd.nextInt(2 * N); 241 checkSubMap(ref.tailMap(key), map.tailMap(key)); 242 } 243 checkSubMap(ref.tailMap(2 * N + 1), map.tailMap(2 * N + 1)); 244 } 245 246 247 public final void testHashCode() { 248 assertEquals(ref.hashCode(), map.hashCode()); 249 } 250 251 public final void testEqualsObject() { 252 assertTrue(map.equals(ref)); 253 map.put(N + 1, N + 1); 254 assertFalse(map.equals(ref)); 255 } 256 257 258 public final void testIsEmpty() { 259 assertEquals(ref.isEmpty(), map.isEmpty()); 260 } 261 262 public final void testIsEmpty2() { 263 TreeMap<String, String> map = new TreeMap<String, String>(); 264 map.put("one", "1"); 265 assertEquals("size should be one", 1, map.size()); 266 map.clear(); 267 assertEquals("size should be zero", 0, map.size()); 268 assertTrue("Should not have entries", !map.entrySet().iterator() 269 .hasNext()); 270 271 map.put("one", "1"); 272 assertEquals("size should be one", 1, map.size()); 273 map.remove("one"); 274 assertEquals("size should be zero", 0, map.size()); 275 assertTrue("Should not have entries", !map.entrySet().iterator() 276 .hasNext()); 277 278 map.clear(); 279 map.put("0", "1"); 280 map.clear(); 281 assertTrue(map.isEmpty()); 282 assertFalse(map.entrySet().iterator().hasNext()); 283 assertFalse(map.keySet().iterator().hasNext()); 284 assertFalse(map.values().iterator().hasNext()); 285 } 286 287 public final void testToString() { 288 assertEquals(ref.toString(), map.toString()); 289 } 290 291 private void checkSubMap(SortedMap<Integer, Integer> ref, 292 SortedMap<Integer, Integer> map) { 293 294 assertEquals(ref.size(), map.size()); 295 assertEquals(ref, map); 296 assertEquals(ref.isEmpty(), map.isEmpty()); 297 if (!ref.isEmpty()) { 298 assertEquals(ref.firstKey(), map.firstKey()); 299 assertEquals(ref.lastKey(), map.lastKey()); 300 301 testViews(ref, map); 302 } else { 303 boolean caught = false; 304 try { 305 map.firstKey(); 306 } catch (NoSuchElementException e) { 307 caught = true; 308 } 309 caught = false; 310 try { 311 map.lastKey(); 312 } catch (NoSuchElementException e) { 313 caught = true; 314 } 315 assertTrue(caught); 316 } 317 318 } 319 320 public final void testViews() { 321 testViews(ref, map); 322 } 323 324 private void testViews(SortedMap<Integer, Integer> ref, SortedMap<Integer, Integer> map) { 325 assertEquals(ref.keySet().size(), map.keySet().size()); 326 assertEquals(ref.keySet(), map.keySet()); 327 compareIterators(ref.keySet(), map.keySet()); 328 329 assertEquals(ref.values().size(), map.values().size()); 330 compareIterators(ref.values(), map.values()); 331 332 assertEquals(ref.entrySet(), map.entrySet()); 333 compareIterators(ref.entrySet(), map.entrySet()); 334 } 335 336 private void compareIterators(Collection ref, Collection map) { 337 Iterator i = ref.iterator(); 338 Iterator j = map.iterator(); 339 while (i.hasNext()) { 340 assertEquals(i.next(), j.next()); 341 if (rnd.nextBoolean()) { 342 j.remove(); 343 i.remove(); 344 assertEquals(ref.size(), map.size()); 345 } 346 } 347 } 348 349 @SuppressWarnings("unchecked") 350 public final void testSerialization() throws IOException, ClassNotFoundException { 351 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 352 ObjectOutputStream oos = new ObjectOutputStream(baos); 353 oos.writeObject(map); 354 oos.close(); 355 ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())); 356 Object read = ois.readObject(); 357 assertEquals(ref, read); 358 } 359 360 public final void testClone() throws Exception { 361 Method refClone = ref.getClass().getMethod("clone", null); 362 Method mapClone = map.getClass().getMethod("clone", null); 363 SortedMap<Integer, Integer> map2 = (SortedMap<Integer, Integer>) mapClone.invoke(map, null); 364 assertEquals(refClone.invoke(ref, null), map2); 365 map2.remove(map2.lastKey()); 366 assertFalse(ref.equals(map2)); 367 } 368 369 } 370