Reviewers: scottb,

Description:
The web mode implementation of EnumSet.of(varargs) was not computing the
set size properly, leading to problems further on.


Please review this at http://gwt-code-reviews.appspot.com/55803

Affected files:
   user/super/com/google/gwt/emul/java/util/EnumSet.java
   user/test/com/google/gwt/emultest/java/util/EnumSetTest.java


Index: user/super/com/google/gwt/emul/java/util/EnumSet.java
===================================================================
--- user/super/com/google/gwt/emul/java/util/EnumSet.java       (revision 5867)
+++ user/super/com/google/gwt/emul/java/util/EnumSet.java       (working copy)
@@ -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;
+      int ordinal = e.ordinal();
+      if (set[ordinal] == null) {
+        set[ordinal] = e;
+        ++size; // count only new elements
+      }
      }
-    return new EnumSetImpl<E>(all, set, rest.length + 1);
+    return new EnumSetImpl<E>(all, set, size);
    }

    public static <E extends Enum<E>> EnumSet<E> range(E from, E to) {
Index: user/test/com/google/gwt/emultest/java/util/EnumSetTest.java
===================================================================
--- user/test/com/google/gwt/emultest/java/util/EnumSetTest.java        
(revision  
5867)
+++ user/test/com/google/gwt/emultest/java/util/EnumSetTest.java        
(working  
copy)
@@ -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,27 @@
    public String getModuleName() {
      return "com.google.gwt.emultest.EmulSuite";
    }
+
+  /**
+   * Test failure mode from issue 3605.
+   */
+  public void testDuplicates() {
+    EnumSet<Numbers> set = EnumSet.of(Numbers.Two, Numbers.One,  
Numbers.Two, Numbers.One);
+    assertEquals(set.size(), 2);
+    try {
+      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 present");
+      }
+      if (array[0] != Numbers.Two && array[1] != Numbers.Two) {
+        fail("Numbers.Two not present");
+      }
+    } catch (NoSuchElementException bug) {
+      fail("Got NoSuchElementException converting to array");
+    }
+  }

    public void testNumbers() {
      enumTest(Numbers.class);
@@ -77,9 +99,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