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 -~----------~----~----~----~------~----~------~--~---
