/* * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/* * @test * @bug 4904140 * @summary Unit test for EnumMap * @author Josh Bloch * @author Yo Yo Ma
*/
import java.util.*; import java.io.*;
publicclass EnumMapBash { static Random rnd = new Random();
// Linked List test for (int i=0; i<numItr; i++) { int mapSize = universe.length * 7 / 8;
// Build the linked list
Map<T, T> m = new EnumMap<T, T>(enumClass); if (!m.isEmpty())
fail("New instance non empty."); Enum[] perm = (Enum[]) universe.clone();
Collections.shuffle(Arrays.asList(perm));
T head = (T) perm[0]; for (int j = 0; j < mapSize; j++)
m.put((T)perm[j], (T)perm[j + 1]);
T nil = (T)perm[mapSize];
if (m.size() != mapSize)
fail("Size not as expected.");
Map<T, T> tm = new TreeMap<T, T>(m);
if (m.hashCode() != tm.hashCode())
fail("Incorrect hashCode computation."); if (!m.toString().equals(tm.toString()))
fail("Incorrect toString computation."); if (!tm.equals(m))
fail("Incorrect equals (1)."); if (!m.equals(tm))
fail("Incorrect equals (2).");
Map<T, T> m2 = new EnumMap<T, T>(enumClass); m2.putAll(m);
m2.values().removeAll(m.keySet()); if (m2.size()!= 1 || !m2.containsValue(nil))
fail("Collection views test failed.");
int j=0; while (head != nil) { if (!m.containsKey(head))
fail("Linked list doesn't contain a link.");
T newHead = m.get(head); if (newHead == null)
fail("Could not retrieve a link.");
m.remove(head);
head = newHead;
j++;
} if (!m.isEmpty())
fail("Map nonempty after removing all links."); if (j != mapSize)
fail("Linked list size not as expected.");
}
EnumMap<T, T> m = new EnumMap<T, T>(enumClass); int mapSize = 0; for (int i=0; i<universe.length; i += 2) { if (m.put((T)universe[i], (T)universe[i]) != null)
fail("put returns a non-null value erroenously.");
mapSize++;
} for (int i=0; i<universe.length; i++) if (m.containsValue(universe[i]) != (i%2==0))
fail("contains value "+i); if (m.put((T)universe[0], (T)universe[0]) == null)
fail("put returns a null value erroenously.");
Map<T, T> m2 = m.clone();
cloneTest(m, m2);
m2 = new EnumMap<T,T>(enumClass);
m2.putAll(m);
cloneTest(m, m2);
m2 = new EnumMap<T, T>(m);
cloneTest(m, m2);
m2 = new EnumMap<T, T>((Map<T, T>) m);
cloneTest(m, m2); if (!m.isEmpty()) {
m2 = new EnumMap<T, T>(new HashMap<T, T>(m));
cloneTest(m, m2);
}
m2 = deepCopy(m);
cloneTest(m, m2);
if (!m.equals(m2))
fail("Clone not equal to original. (1)"); if (!m2.equals(m))
fail("Clone not equal to original. (2)");
Set<Map.Entry<T,T>> s = m.entrySet(), s2 = m2.entrySet();
if (!s.equals(s2))
fail("Clone not equal to original. (3)"); if (!s2.equals(s))
fail("Clone not equal to original. (4)"); if (!s.containsAll(s2))
fail("Original doesn't contain clone!"); if (!s2.containsAll(s))
fail("Clone doesn't contain original!");
s2.removeAll(s); if (!m2.isEmpty()) {
System.out.println(m2.size());
System.out.println(m2);
fail("entrySet().removeAll failed.");
}
m2.putAll(m);
m2.clear(); if (!m2.isEmpty())
fail("clear failed.");
Iterator i = m.entrySet().iterator(); while(i.hasNext()) {
i.next();
i.remove();
} if (!m.isEmpty())
fail("Iterator.remove() failed");
}
// Done inefficiently so as to exercise various functions static <K, V> void cloneTest(Map<K, V> m, Map<K, V> clone) { if (!m.equals(clone))
fail("Map not equal to copy."); if (!clone.equals(m))
fail("Copy not equal to map."); if (!m.entrySet().containsAll(clone.entrySet()))
fail("Set does not contain copy."); if (!clone.entrySet().containsAll(m.entrySet()))
fail("Copy does not contain set."); if (!m.entrySet().equals(clone.entrySet()))
fail("Set not equal clone set"); if (!clone.entrySet().equals(m.entrySet()))
fail("Clone set not equal set");
}
// Utility method to do a deep copy of an object *very slowly* using // serialization/deserialization static <T> T deepCopy(T oldObj) { try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(oldObj);
oos.flush();
ByteArrayInputStream bin = new ByteArrayInputStream(
bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bin); return (T) ois.readObject();
} catch(Exception e) { thrownew IllegalArgumentException(e.toString());
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.