blob: b619786ac63d44faa55393cfddfeaecf9b960341 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.emultest.java.util;
import com.google.gwt.junit.client.GWTTestCase;
import java.util.HashSet;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.Set;
/**
* Tests EnumSet. TODO(tobyr) Consider using Apache collections tests.
*/
public class EnumSetTest extends GWTTestCase {
enum FalseEnum {
Zero, One,
}
enum Numbers {
Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Eleven, Twelve, Thirteen, Fourteen, Fifteen, Sixteen, Seventeen, Eighteen, Nineteen, Twenty, TwentyOne, TwentyTwo, TwentyThree, TwentyFour, TwentyFive, TwentySix, TwentySeven, TwentyEight, TwentyNine, Thirty, ThirtyOne, ThirtyTwo, ThirtyThree, Thirtyfour,
}
enum ClinitRace {
Zero, One, Two, Three;
public static final Set<ClinitRace> set = EnumSet.allOf(ClinitRace.class);
}
@Override
public String getModuleName() {
return "com.google.gwt.emultest.EmulSuite";
}
/**
* Tests that an EnumSet can be statically initialized in an enum.
*/
public void testClinitRace() {
assertEquals(4, ClinitRace.set.size());
assertTrue(ClinitRace.set.contains(ClinitRace.Zero));
assertTrue(ClinitRace.set.contains(ClinitRace.One));
assertTrue(ClinitRace.set.contains(ClinitRace.Two));
assertTrue(ClinitRace.set.contains(ClinitRace.Three));
}
/**
* 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(2, set.size());
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(2, array.length);
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);
}
private <E extends Enum<E>> void enumTest(Class<E> e) {
E[] enums = e.getEnumConstants();
EnumSet<E> numbers = EnumSet.of(enums[1], enums[2]);
HashSet<E> numberSet = new HashSet<E>();
numberSet.add(enums[1]);
numberSet.add(enums[2]);
assertEquals(numberSet, numbers);
numbers.add(enums[23]);
numberSet.add(enums[23]);
assertEquals(numberSet, numbers);
numbers.remove(enums[1]);
numberSet.remove(enums[1]);
assertEquals(numberSet, numbers);
// Attempt an add at the beginning
numbers.add(enums[0]);
numberSet.add(enums[0]);
assertEquals(numberSet, numbers);
// Attempt an add at the end
numbers.add(enums[enums.length - 1]);
numberSet.add(enums[enums.length - 1]);
assertEquals(numberSet, numbers);
// Attempt to remove something bogus
numbers.remove(enums[15]);
numberSet.remove(enums[15]);
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();
numberSet.addAll(Arrays.asList(enums));
assertEquals(numberSet, numbers);
numbers = EnumSet.noneOf(e);
numberSet.clear();
assertEquals(numberSet, numbers);
numbers = EnumSet.complementOf(EnumSet.allOf(e));
numberSet.clear();
assertEquals(numberSet, numbers);
numbers = EnumSet.complementOf(EnumSet.noneOf(e));
numberSet.clear();
numberSet.addAll(Arrays.asList(enums));
assertEquals(numberSet, numbers);
numbers = EnumSet.allOf(e);
numbers.remove(enums[20]);
numbers.remove(enums[17]);
numbers = EnumSet.complementOf(numbers);
numberSet.clear();
numberSet.add(enums[20]);
numberSet.add(enums[17]);
assertEquals(numberSet, numbers);
numbers = EnumSet.range(enums[0], enums[enums.length - 1]);
numberSet.clear();
numberSet.addAll(Arrays.asList(enums));
assertEquals(numberSet, numbers);
numbers = EnumSet.range(enums[5], enums[5]);
numberSet.clear();
numberSet.add(enums[5]);
assertEquals(numberSet, numbers);
numbers = EnumSet.range(enums[5], enums[10]);
numberSet.clear();
for (int i = 5, end = 10; i <= end; ++i) {
numberSet.add(enums[i]);
}
assertEquals(numberSet, numbers);
// Test duplicates
List<E> numberList = new ArrayList<E>();
for (int i = 5, end = 10; i <= end; ++i) {
numberList.add(enums[i]);
}
for (int i = 5, end = 10; i <= end; ++i) {
numberList.add(enums[i]);
}
numbers = EnumSet.copyOf(numberList);
numberSet = new HashSet<E>(numberList);
assertEquals(numberSet, numbers);
try {
numbers.add(null);
fail("Expected NullPointerException");
} catch (NullPointerException expected) {
}
// Try testing for null
assertFalse("EnumSet should allow testing for null", numbers.contains(null));
// Try testing for an Enum that looks the same, but has different type
numbers.clear();
numbers.add(enums[1]);
assertFalse("EnumSet should test for correct type.",
numbers.contains(FalseEnum.One));
// Same type testing, but on remove.
numbers.remove(FalseEnum.One);
assertTrue("EnumSet should test for correct type on remove",
numbers.contains(enums[1]));
}
}