Revision: 7332
Author: [email protected]
Date: Thu Dec 17 20:58:44 2009
Log: Fix a bug where Collections.unmodifiableMap's entrySet toArray method  
tries
to wrap extra elements in the array, including the null marking the end of
the elements.

Also, fixed a bug where toArray() went through the array twice and cleaned
up CollectionsTest (generics, sort order).

Patch by: hhchan, jat
Review by: jat

http://code.google.com/p/google-web-toolkit/source/detail?r=7332

Modified:
  /trunk/user/super/com/google/gwt/emul/java/util/Collections.java
  /trunk/user/test/com/google/gwt/emultest/java/util/CollectionsTest.java

=======================================
--- /trunk/user/super/com/google/gwt/emul/java/util/Collections.java    Fri  
Oct  9 15:22:16 2009
+++ /trunk/user/super/com/google/gwt/emul/java/util/Collections.java    Thu  
Dec 17 20:58:44 2009
@@ -230,20 +230,32 @@
        }

        @Override
-      @SuppressWarnings("unchecked")
        public Object[] toArray() {
-        return toArray(super.toArray());
+        Object[] array = super.toArray();
+        wrap(array, array.length);
+        return array;
        }

        @Override
        @SuppressWarnings("unchecked")
        public <T> T[] toArray(T[] a) {
          Object[] result = super.toArray(a);
-        for (int i = 0, c = result.length; i < c; ++i) {
-          result[i] = new UnmodifiableEntry<K, V>((Map.Entry<K, V>)  
result[i]);
-        }
+        wrap(result, coll.size());
          return (T[]) result;
        }
+
+      /**
+       * Wrap an array of Map.Entries as UnmodifiableEntries.
+       *
+       * @param array array to wrap
+       * @param size number of entries to wrap
+       */
+      @SuppressWarnings("unchecked")
+      private void wrap(Object[] array, int size) {
+        for (int i = 0; i < size; ++i) {
+          array[i] = new UnmodifiableEntry<K, V>((Map.Entry<K, V>)  
array[i]);
+        }
+      }
      }

      private transient UnmodifiableSet<Map.Entry<K, V>> entrySet;
=======================================
--- /trunk/user/test/com/google/gwt/emultest/java/util/CollectionsTest.java     
 
Tue Apr 29 11:01:50 2008
+++ /trunk/user/test/com/google/gwt/emultest/java/util/CollectionsTest.java     
 
Thu Dec 17 20:58:44 2009
@@ -19,34 +19,36 @@
  import java.util.Arrays;
  import java.util.Collections;
  import java.util.Comparator;
-import java.util.LinkedHashMap;
+import java.util.HashMap;
  import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;

  /**
- * TODO: document me.
+ * Test various collections.
   */
  public class CollectionsTest extends EmulTestBase {

-  LinkedHashMap dummy() {
-    return new LinkedHashMap();
+  public static List<Integer> createRandomList() {
+    ArrayList<Integer> l = new ArrayList<Integer>();
+    l.add(new Integer(5));
+    l.add(new Integer(2));
+    l.add(new Integer(3));
+    l.add(new Integer(1));
+    l.add(new Integer(4));
+    return l;
    }

-  public static List createSortedList() {
-    ArrayList l = new ArrayList();
+  public static List<String> createSortedList() {
+    ArrayList<String> l = new ArrayList<String>();
      l.add("a");
      l.add("b");
      l.add("c");
      return l;
    }

-  public static List createRandomList() {
-    ArrayList l = new ArrayList();
-    l.add(new Integer(5));
-    l.add(new Integer(2));
-    l.add(new Integer(3));
-    l.add(new Integer(1));
-    l.add(new Integer(4));
-    return l;
+  private static Entry<String, String> dummyEntry() {
+    return  
Collections.singletonMap("foo", "bar").entrySet().iterator().next();
    }

    /**
@@ -57,15 +59,17 @@
     * smaller than all elements
     */
    public void testBinarySearchObject() {
-    List a1 = new ArrayList();
+    List<String> a1 = new ArrayList<String>();
      int ret = Collections.binarySearch(a1, "");
      assertEquals(-1, ret);
-    List a2 = new ArrayList(Arrays.asList(new String[] {"a", "g", "y"}));
+    List<String> a2 = new ArrayList<String>(Arrays.asList(new String[] {
+        "a", "g", "y"}));
      ret = Collections.binarySearch(a2, "c");
      assertEquals(-2, ret);
      ret = Collections.binarySearch(a2, "y");
      assertEquals(2, ret);
-    List a3 = new ArrayList(Arrays.asList(new String[]  
{"b", "c", "x", "y"}));
+    List<String> a3 = new ArrayList<String>(Arrays.asList(new String[] {
+        "b", "c", "x", "y"}));
      ret = Collections.binarySearch(a3, "z");
      assertEquals(-5, ret);
      ret = Collections.binarySearch(a3, "a");
@@ -82,20 +86,22 @@
     * smaller than all elements null Comparator uses natural ordering
     */
    public void testBinarySearchObjectComparator() {
-    Comparator inverseSort = new Comparator() {
-      public int compare(Object o1, Object o2) {
-        return ((Comparable) o2).compareTo(o1);
+    Comparator<String> inverseSort = new Comparator<String>() {
+      public int compare(String o1, String o2) {
+        return o2.compareTo(o1);
        }
      };
-    List a1 = new ArrayList();
+    List<String> a1 = new ArrayList<String>();
      int ret = Collections.binarySearch(a1, "", inverseSort);
      assertEquals(-1, ret);
-    List a2 = new ArrayList(Arrays.asList(new String[] {"y", "g", "a"}));
+    List<String> a2 = new ArrayList<String>(Arrays.asList(new String[] {
+        "y", "g", "a"}));
      ret = Collections.binarySearch(a2, "c", inverseSort);
      assertEquals(-3, ret);
      ret = Collections.binarySearch(a2, "a", inverseSort);
      assertEquals(2, ret);
-    List a3 = new ArrayList(Arrays.asList(new String[]  
{"y", "x", "c", "b"}));
+    List<String> a3 = new ArrayList<String>(Arrays.asList(new String[] {
+        "y", "x", "c", "b"}));
      ret = Collections.binarySearch(a3, "a", inverseSort);
      assertEquals(-5, ret);
      ret = Collections.binarySearch(a3, "z", inverseSort);
@@ -103,51 +109,68 @@
      ret = Collections.binarySearch(a3, "y", inverseSort);
      assertEquals(0, ret);

-    List a4 = new ArrayList(
-        Arrays.asList(new String[] {"a", "b", "c", "d", "e"}));
+    List<String> a4 = new ArrayList<String>(Arrays.asList(new String[] {
+        "a", "b", "c", "d", "e"}));
      ret = Collections.binarySearch(a4, "d", null); // should not NPE
      assertEquals(3, ret);
    }
+
+  public void testEntrySetToArrayOversized() {
+    Map<String, String> delegate = new HashMap<String, String>();
+    delegate.put("key", "value");
+    Map<String, String> unmodifiable =  
Collections.unmodifiableMap(delegate);
+
+    @SuppressWarnings("unchecked")
+    Entry<String, String>[] oversizedArray = new Entry[3];
+    oversizedArray[0] = dummyEntry();
+    oversizedArray[1] = dummyEntry();
+    oversizedArray[2] = dummyEntry();
+
+    Entry<String, String>[] result = unmodifiable.entrySet().toArray(
+        oversizedArray);
+    assertSame(result, oversizedArray);
+    assertEquals("key", result[0].getKey());
+    assertEquals("value", result[0].getValue());
+    assertNull("The element after last should be null.", result[1]);
+  }

    public void testFill() {
-    List a = createSortedList();
+    List<String> a = createSortedList();
      Collections.fill(a, null);
      assertEquals(new Object[a.size()], a);

-    List b = createRandomList();
+    List<Integer> b = createRandomList();
      Collections.fill(b, null);
      assertEquals(new Object[b.size()], b);
    }

    public void testReverse() {
-    List a = createSortedList();
+    List<String> a = createSortedList();
      Collections.reverse(a);
      Object[] x = {"c", "b", "a"};
      assertEquals(x, a);

-    List b = createRandomList();
+    List<Integer> b = createRandomList();
      Collections.reverse(b);
      Collections.reverse(b);
      assertEquals(b, createRandomList());
    }

    public void testSort() {
-    List a = createSortedList();
+    List<String> a = createSortedList();
      Collections.reverse(a);
      Collections.sort(a);
      assertEquals(createSortedList(), a);
    }

    public void testSortWithComparator() {
-    Comparator x = new Comparator() {
-      public int compare(Object o1, Object o2) {
-        String s1 = (String) o1;
-        String s2 = (String) o2;
+    Comparator<String> x = new Comparator<String>() {
+      public int compare(String s1, String s2) {
          // sort into reverse order
          return s2.compareTo(s1);
        }
      };
-    List a = createSortedList();
+    List<String> a = createSortedList();
      Collections.sort(a, x);
      Object[] expected = {"c", "b", "a"};
      assertEquals(expected, a);
@@ -162,5 +185,4 @@
        assertEquals(val, testArray[i]);
      }
    }
-
-}
+}

-- 
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to