Consistent support for EnumSet subclasses in CollectionFactory
Issue: SPR-17619
(cherry picked from commit 31a24720a6)
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -189,7 +189,7 @@ public abstract class CollectionFactory {
|
||||
throw new IllegalArgumentException("Unsupported Collection interface: " + collectionType.getName());
|
||||
}
|
||||
}
|
||||
else if (EnumSet.class == collectionType) {
|
||||
else if (EnumSet.class.isAssignableFrom(collectionType)) {
|
||||
Assert.notNull(elementType, "Cannot create EnumSet for unknown element type");
|
||||
// Cast is necessary for compilation in Eclipse 4.4.1.
|
||||
return (Collection<E>) EnumSet.noneOf(asEnumType(elementType));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2014 the original author or authors.
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -35,10 +35,11 @@ import java.util.TreeMap;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.hamcrest.Matchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.springframework.core.CollectionFactory.*;
|
||||
|
||||
@@ -103,7 +104,7 @@ public class CollectionFactoryTests {
|
||||
* {@link CollectionFactory#createApproximateMap(Object, int)}
|
||||
* is not type-safe.
|
||||
* <p>The reasoning is similar that described in
|
||||
* {@link #createApproximateCollectionIsNotTypeSafe()}.
|
||||
* {@link #createApproximateCollectionIsNotTypeSafeForEnumSet}.
|
||||
*/
|
||||
@Test
|
||||
public void createApproximateMapIsNotTypeSafeForEnumMap() {
|
||||
@@ -165,27 +166,27 @@ public class CollectionFactoryTests {
|
||||
@Test
|
||||
public void createApproximateCollectionFromEmptyHashSet() {
|
||||
Collection<String> set = createApproximateCollection(new HashSet<String>(), 2);
|
||||
assertThat(set.size(), is(0));
|
||||
assertThat(set, is(empty()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createApproximateCollectionFromNonEmptyHashSet() {
|
||||
HashSet<String> hashSet = new HashSet<String>();
|
||||
HashSet<String> hashSet = new HashSet<>();
|
||||
hashSet.add("foo");
|
||||
Collection<String> set = createApproximateCollection(hashSet, 2);
|
||||
assertThat(set.size(), is(0));
|
||||
assertThat(set, is(empty()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createApproximateCollectionFromEmptyEnumSet() {
|
||||
Collection<Color> colors = createApproximateCollection(EnumSet.noneOf(Color.class), 2);
|
||||
assertThat(colors.size(), is(0));
|
||||
assertThat(colors, is(empty()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createApproximateCollectionFromNonEmptyEnumSet() {
|
||||
Collection<Color> colors = createApproximateCollection(EnumSet.of(Color.BLUE), 2);
|
||||
assertThat(colors.size(), is(0));
|
||||
assertThat(colors, is(empty()));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -196,7 +197,7 @@ public class CollectionFactoryTests {
|
||||
|
||||
@Test
|
||||
public void createApproximateMapFromNonEmptyHashMap() {
|
||||
Map<String, String> hashMap = new HashMap<String, String>();
|
||||
Map<String, String> hashMap = new HashMap<>();
|
||||
hashMap.put("foo", "bar");
|
||||
Map<String, String> map = createApproximateMap(hashMap, 2);
|
||||
assertThat(map.size(), is(0));
|
||||
@@ -210,7 +211,7 @@ public class CollectionFactoryTests {
|
||||
|
||||
@Test
|
||||
public void createApproximateMapFromNonEmptyEnumMap() {
|
||||
EnumMap<Color, String> enumMap = new EnumMap<Color, String>(Color.class);
|
||||
EnumMap<Color, String> enumMap = new EnumMap<>(Color.class);
|
||||
enumMap.put(Color.BLUE, "blue");
|
||||
Map<Color, String> colors = createApproximateMap(enumMap, 2);
|
||||
assertThat(colors.size(), is(0));
|
||||
@@ -241,6 +242,12 @@ public class CollectionFactoryTests {
|
||||
assertThat(createCollection(EnumSet.class, Color.class, 0), is(instanceOf(EnumSet.class)));
|
||||
}
|
||||
|
||||
@Test // SPR-17619
|
||||
public void createsEnumSetSubclass() {
|
||||
EnumSet<Color> enumSet = EnumSet.noneOf(Color.class);
|
||||
assertThat(createCollection(enumSet.getClass(), Color.class, 0), is(instanceOf(enumSet.getClass())));
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void rejectsInvalidElementTypeForEnumSet() {
|
||||
createCollection(EnumSet.class, Object.class, 0);
|
||||
@@ -296,7 +303,8 @@ public class CollectionFactoryTests {
|
||||
}
|
||||
|
||||
|
||||
static enum Color {
|
||||
enum Color {
|
||||
RED, BLUE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user