Revision: 5876
Author: [email protected]
Date: Tue Aug  4 13:49:52 2009
Log: Fix incorrect size calculated by EnumSet.of(varargs) in web mode.

Review by: scottb


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

Modified:
  /trunk/user/super/com/google/gwt/emul/java/util/EnumSet.java
  /trunk/user/test/com/google/gwt/emultest/java/util/EnumSetTest.java

=======================================
--- /trunk/user/super/com/google/gwt/emul/java/util/EnumSet.java        Thu Apr 
17  
15:59:53 2008
+++ /trunk/user/super/com/google/gwt/emul/java/util/EnumSet.java        Tue Aug 
 4  
13:49:52 2009
@@ -229,10 +229,15 @@
      E[] all = first.getDeclaringClass().getEnumConstants();
      E[] set = Array.createFrom(all);
      set[first.ordinal()] = first;
+    int size = 1;
      for (E e : rest) {
-      set[e.ordinal()] = e;
-    }
-    return new EnumSetImpl<E>(all, set, rest.length + 1);
+      int ordinal = e.ordinal();
+      if (set[ordinal] == null) {
+        set[ordinal] = e;
+        ++size; // count only new elements
+      }
+    }
+    return new EnumSetImpl<E>(all, set, size);
    }

    public static <E extends Enum<E>> EnumSet<E> range(E from, E to) {
=======================================
--- /trunk/user/test/com/google/gwt/emultest/java/util/EnumSetTest.java Thu  
Apr 17 15:52:13 2008
+++ /trunk/user/test/com/google/gwt/emultest/java/util/EnumSetTest.java Tue  
Aug  4 13:49:52 2009
@@ -22,6 +22,7 @@
  import java.util.List;
  import java.util.ArrayList;
  import java.util.EnumSet;
+import java.util.NoSuchElementException;

  /**
   * Tests EnumSet. TODO(tobyr) Consider using Apache collections tests.
@@ -39,6 +40,32 @@
    public String getModuleName() {
      return "com.google.gwt.emultest.EmulSuite";
    }
+
+  /**
+   * Test failure mode from issue 3605.  Previously resulted in an  
incorrect size.
+   */
+  public void testDuplicates() {
+    EnumSet<Numbers> set = EnumSet.of(Numbers.Two, Numbers.One,  
Numbers.Two, Numbers.One);
+    assertEquals(set.size(), 2);
+    assertTrue(set.contains(Numbers.One));
+    assertTrue(set.contains(Numbers.Two));
+  }
+
+  /**
+   * Test failure mode from issue 3605.  Previously resulted in a  
NoSuchElementException.
+   */
+  public void testDuplicatesToArray() {
+    EnumSet<Numbers> set = EnumSet.of(Numbers.Two, Numbers.One,  
Numbers.Two, Numbers.One);
+    Numbers[] array = set.toArray(new Numbers[set.size()]);
+    assertNotNull(array);
+    assertEquals(array.length, 2);
+    if (array[0] != Numbers.One && array[1] != Numbers.One) {
+      fail("Numbers.One not found");
+    }
+    if (array[0] != Numbers.Two && array[1] != Numbers.Two) {
+      fail("Numbers.Two not found");
+    }
+  }

    public void testNumbers() {
      enumTest(Numbers.class);
@@ -77,9 +104,14 @@
      assertEquals(numberSet, numbers);

      // Attempt to add a duplicate value
+    int numbersSize = numbers.size();
+    int numberSetSize = numberSet.size();
      numbers.add(enums[23]);
      numberSet.add(enums[23]);
      assertEquals(numberSet, numbers);
+    // Check sizes haven't changed
+    assertEquals(numbersSize, numbers.size());
+    assertEquals(numberSetSize, numberSet.size());

      numbers = EnumSet.allOf(e);
      numberSet.clear();

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

Reply via email to