You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by py...@apache.org on 2006/08/25 09:57:41 UTC
svn commit: r436704 - in
/incubator/harmony/enhanced/classlib/trunk/modules/luni/src:
main/java/java/util/EnumMap.java
test/java/tests/api/java/util/EnumMapTest.java
Author: pyang
Date: Fri Aug 25 00:57:40 2006
New Revision: 436704
URL: http://svn.apache.org/viewvc?rev=436704&view=rev
Log:
Patch applied for HARMONY-1277 ([classlib][luni] new method keySet() in java.util.EnumMap)
Modified:
incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/EnumMap.java
incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/EnumMapTest.java
Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/EnumMap.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/EnumMap.java?rev=436704&r1=436703&r2=436704&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/EnumMap.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/EnumMap.java Fri Aug 25 00:57:40 2006
@@ -35,6 +35,112 @@
transient int enumSize;
+ private static class EnumMapIterator<E, KT extends Enum<KT>, VT> implements
+ Iterator<E> {
+ private int position = 0;
+
+ private int prePosition = -1;
+
+ private final EnumMap<KT, VT> enumMap;
+
+ private final MapEntry.Type<E, KT, VT> type;
+
+ EnumMapIterator(MapEntry.Type<E, KT, VT> value, EnumMap<KT, VT> em) {
+ enumMap = em;
+ type = value;
+ }
+
+ public boolean hasNext() {
+ int length = enumMap.enumSize;
+ for (; position < length; position++) {
+ if (enumMap.hasMapping[position]) {
+ break;
+ }
+ }
+ return position != length;
+ }
+
+ @SuppressWarnings("unchecked")
+ public E next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException();
+ }
+ prePosition = position++;
+ return type.get(new MapEntry(enumMap.keys[prePosition],
+ enumMap.values[prePosition]));
+ }
+
+ public void remove() {
+ checkStatus();
+ if (enumMap.hasMapping[prePosition]) {
+ enumMap.remove(enumMap.keys[prePosition]);
+ }
+ prePosition = -1;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public String toString() {
+ if (-1 == prePosition) {
+ return super.toString();
+ }
+ return type.get(
+ new MapEntry(enumMap.keys[prePosition],
+ enumMap.values[prePosition])).toString();
+ }
+
+ void checkStatus() {
+ if (-1 == prePosition) {
+ throw new IllegalStateException();
+ }
+ }
+ }
+
+ private static class EnumMapKeySet<KT extends Enum<KT>, VT> extends
+ AbstractSet<KT> {
+ private final EnumMap<KT, VT> enumMap;
+
+ EnumMapKeySet(EnumMap<KT, VT> em) {
+ enumMap = em;
+ }
+
+ @Override
+ public void clear() {
+ enumMap.clear();
+ }
+
+ @Override
+ public boolean contains(Object object) {
+ return enumMap.containsKey(object);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public Iterator iterator() {
+ return new EnumMapIterator<KT, KT, VT>(
+ new MapEntry.Type<KT, KT, VT>() {
+ public KT get(MapEntry<KT, VT> entry) {
+ return entry.key;
+ }
+ }, enumMap);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public boolean remove(Object object) {
+ if (contains(object)) {
+ enumMap.remove(object);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int size() {
+ return enumMap.size();
+ }
+ }
+
/**
* Constructs an empty enum map using the given key type.
*
@@ -205,8 +311,12 @@
*
* @return a set view of the keys contained in this map.
*/
+ @Override
public Set<K> keySet() {
- throw new NotYetImplementedException();
+ if (null == keySet) {
+ keySet = new EnumMapKeySet<K, V>(this);
+ }
+ return keySet;
}
/**
Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/EnumMapTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/EnumMapTest.java?rev=436704&r1=436703&r2=436704&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/EnumMapTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/EnumMapTest.java Fri Aug 25 00:57:40 2006
@@ -15,9 +15,14 @@
package tests.api.java.util;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.EnumMap;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
import org.apache.harmony.luni.util.NotYetImplementedException;
@@ -257,6 +262,163 @@
enumSizeMap.put(Size.Big, null);
assertTrue("Returned false for contained value", enumSizeMap //$NON-NLS-1$
.containsValue(null));
+ }
+
+ /**
+ * @tests java.util.EnumMap#keySet()
+ */
+ @SuppressWarnings( { "unchecked", "boxing" })
+ public void test_keySet() {
+ EnumMap enumSizeMap = new EnumMap(Size.class);
+ enumSizeMap.put(Size.Middle, 2);
+ enumSizeMap.put(Size.Big, null);
+ Set set = enumSizeMap.keySet();
+
+ Set set1 = enumSizeMap.keySet();
+ assertSame("Should be same", set1, set); //$NON-NLS-1$
+ try {
+ set.add(Size.Big);
+ fail("Should throw UnsupportedOperationException"); //$NON-NLS-1$
+ } catch (UnsupportedOperationException e) {
+ // Expected
+ }
+
+ assertTrue("Returned false for contained object", set//$NON-NLS-1$
+ .contains(Size.Middle));
+ assertTrue("Returned false for contained object", set//$NON-NLS-1$
+ .contains(Size.Big));
+ assertFalse("Returned true for uncontained object", set //$NON-NLS-1$
+ .contains(Size.Small));
+ assertFalse("Returned true for uncontained object", set //$NON-NLS-1$
+ .contains(new Integer(1)));
+ assertTrue("Returned false when the object can be removed", set //$NON-NLS-1$
+ .remove(Size.Big));
+ assertFalse("Returned true for uncontained object", set //$NON-NLS-1$
+ .contains(Size.Big));
+ assertFalse("Returned true when the object cann't be removed", set //$NON-NLS-1$
+ .remove(Size.Big));
+ assertFalse("Returned true when the object cann't be removed", set //$NON-NLS-1$
+ .remove(new Integer(1)));
+
+ // The set is backed by the map so changes to one are reflected by the
+ // other.
+ enumSizeMap.put(Size.Big, 3);
+ assertTrue("Returned false for contained object", set//$NON-NLS-1$
+ .contains(Size.Big));
+ enumSizeMap.remove(Size.Big);
+ assertFalse("Returned true for uncontained object", set //$NON-NLS-1$
+ .contains(Size.Big));
+
+ assertEquals("Wrong size", 1, set.size()); //$NON-NLS-1$
+ set.clear();
+ assertEquals("Wrong size", 0, set.size()); //$NON-NLS-1$
+
+ enumSizeMap = new EnumMap(Size.class);
+ enumSizeMap.put(Size.Middle, 1);
+ enumSizeMap.put(Size.Big, null);
+ set = enumSizeMap.keySet();
+ Collection c = new ArrayList();
+ c.add(Size.Big);
+ assertTrue("Should return true", set.containsAll(c)); //$NON-NLS-1$
+ c.add(Size.Small);
+ assertFalse("Should return false", set.containsAll(c)); //$NON-NLS-1$
+ assertTrue("Should return true", set.removeAll(c)); //$NON-NLS-1$
+ assertEquals("Wrong size", 1, set.size()); //$NON-NLS-1$
+ assertFalse("Should return false", set.removeAll(c)); //$NON-NLS-1$
+ assertEquals("Wrong size", 1, set.size()); //$NON-NLS-1$
+ try {
+ set.addAll(c);
+ fail("Should throw UnsupportedOperationException"); //$NON-NLS-1$
+ } catch (UnsupportedOperationException e) {
+ // Expected
+ }
+
+ enumSizeMap.put(Size.Big, null);
+ assertEquals("Wrong size", 2, set.size()); //$NON-NLS-1$
+ assertTrue("Should return true", set.retainAll(c)); //$NON-NLS-1$
+ assertEquals("Wrong size", 1, set.size()); //$NON-NLS-1$
+ assertFalse("Should return false", set.retainAll(c)); //$NON-NLS-1$
+ assertEquals(1, set.size());
+ Object[] array = set.toArray();
+ assertEquals("Wrong length", 1, array.length); //$NON-NLS-1$
+ assertEquals("Wrong key", Size.Big, array[0]); //$NON-NLS-1$
+
+ enumSizeMap = new EnumMap(Size.class);
+ enumSizeMap.put(Size.Middle, 1);
+ enumSizeMap.put(Size.Big, null);
+ set = enumSizeMap.keySet();
+ c = new ArrayList();
+ c.add(Color.Blue);
+ assertFalse("Should return false", set.remove(c)); //$NON-NLS-1$
+ assertEquals("Wrong size", 2, set.size()); //$NON-NLS-1$
+ assertTrue("Should return true", set.retainAll(c)); //$NON-NLS-1$
+ assertEquals("Wrong size", 0, set.size()); //$NON-NLS-1$
+
+ enumSizeMap = new EnumMap(Size.class);
+ enumSizeMap.put(Size.Middle, 1);
+ enumSizeMap.put(Size.Big, null);
+ set = enumSizeMap.keySet();
+
+ Iterator iter = set.iterator();
+ Enum enumKey = (Enum) iter.next();
+ assertTrue("Returned false for contained object", set.contains(enumKey)); //$NON-NLS-1$
+ enumKey = (Enum) iter.next();
+ assertTrue("Returned false for contained object", set.contains(enumKey)); //$NON-NLS-1$
+
+ enumSizeMap.remove(Size.Big);
+ assertFalse("Returned true for uncontained object", set //$NON-NLS-1$
+ .contains(enumKey));
+ iter.remove();
+ try {
+ iter.remove();
+ fail("Should throw IllegalStateException"); //$NON-NLS-1$
+ } catch (IllegalStateException e) {
+ // Expected
+ }
+ assertFalse("Returned true for uncontained object", set //$NON-NLS-1$
+ .contains(enumKey));
+
+ iter = set.iterator();
+ enumKey = (Enum) iter.next();
+ assertTrue("Returned false for contained object", set.contains(enumKey)); //$NON-NLS-1$
+ enumSizeMap.put(Size.Middle, 3);
+ assertTrue("Returned false for contained object", set.contains(enumKey)); //$NON-NLS-1$
+
+ enumSizeMap = new EnumMap(Size.class);
+ enumSizeMap.put(Size.Middle, 1);
+ enumSizeMap.put(Size.Big, null);
+ set = enumSizeMap.keySet();
+ iter = set.iterator();
+ try {
+ iter.remove();
+ fail("Should throw IllegalStateException"); //$NON-NLS-1$
+ } catch (IllegalStateException e) {
+ // Expected
+ }
+ enumKey = (Enum) iter.next();
+ assertEquals("Wrong key", Size.Middle, enumKey); //$NON-NLS-1$
+ assertSame("Wrong key", Size.Middle, enumKey); //$NON-NLS-1$
+ assertFalse("Returned true for unequal object", iter.equals(enumKey)); //$NON-NLS-1$
+ iter.remove();
+ assertFalse("Returned true for uncontained object", set //$NON-NLS-1$
+ .contains(enumKey));
+ try {
+ iter.remove();
+ fail("Should throw IllegalStateException"); //$NON-NLS-1$
+ } catch (IllegalStateException e) {
+ // Expected
+ }
+
+ assertEquals("Wrong size", 1, set.size()); //$NON-NLS-1$
+ enumKey = (Enum) iter.next();
+ assertEquals("Wrong key", Size.Big, enumKey); //$NON-NLS-1$
+ iter.remove();
+ try {
+ iter.next();
+ fail("Should throw NoSuchElementException"); //$NON-NLS-1$
+ } catch (NoSuchElementException e) {
+ // Expected
+ }
}
/**