diff --git a/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java b/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionServiceTests.java
similarity index 90%
rename from spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java
rename to spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionServiceTests.java
index 9cec877ccc..cc075f71e4 100644
--- a/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java
+++ b/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionServiceTests.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.EnumSet;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
@@ -36,6 +37,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.Properties;
import java.util.Set;
+import java.util.UUID;
import java.util.stream.Stream;
import org.junit.Test;
@@ -46,17 +48,27 @@ import org.springframework.core.convert.ConverterNotFoundException;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterRegistry;
+import org.springframework.tests.Assume;
+import org.springframework.tests.TestGroup;
import org.springframework.util.ClassUtils;
+import org.springframework.util.StopWatch;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
/**
+ * Unit tests for the {@link DefaultConversionService}.
+ *
+ *
For tests involving the {@link GenericConversionService}, see
+ * {@link GenericConversionServiceTests}.
+ *
* @author Keith Donald
* @author Juergen Hoeller
* @author Stephane Nicoll
+ * @author Sam Brannen
+ * @see GenericConversionServiceTests
*/
-public class DefaultConversionTests {
+public class DefaultConversionServiceTests {
private final DefaultConversionService conversionService = new DefaultConversionService();
@@ -229,6 +241,15 @@ public class DefaultConversionTests {
assertEquals("BAR", conversionService.convert(Foo.BAR, String.class));
}
+ @Test
+ public void testStringToEnumSet() throws Exception {
+ assertEquals(EnumSet.of(Foo.BAR), conversionService.convert("BAR", TypeDescriptor.valueOf(String.class),
+ new TypeDescriptor(getClass().getField("enumSet"))));
+ }
+
+ public EnumSet enumSet;
+
+
public enum Foo {
BAR, BAZ
}
@@ -262,6 +283,14 @@ public class DefaultConversionTests {
assertSame(str, conversionService.convert(str, String.class));
}
+ @Test
+ public void testUuidToStringAndStringToUuid() {
+ UUID uuid = UUID.randomUUID();
+ String convertToString = conversionService.convert(uuid, String.class);
+ UUID convertToUUID = conversionService.convert(convertToString, UUID.class);
+ assertEquals(uuid, convertToUUID);
+ }
+
@Test
public void testNumberToNumber() {
assertEquals(Long.valueOf(1), conversionService.convert(1, Long.class));
@@ -575,6 +604,13 @@ public class DefaultConversionTests {
assertEquals(3, result[2]);
}
+ @Test
+ public void convertArrayToWrapperArray() {
+ byte[] byteArray = new byte[] { 1, 2, 3 };
+ Byte[] converted = conversionService.convert(byteArray, Byte[].class);
+ assertTrue(Arrays.equals(converted, new Byte[] { 1, 2, 3 }));
+ }
+
@Test
public void convertArrayToArrayAssignable() {
int[] result = conversionService.convert(new int[] { 1, 2, 3 }, int[].class);
@@ -583,6 +619,16 @@ public class DefaultConversionTests {
assertEquals(3, result[2]);
}
+ @Test
+ public void convertListOfListToString() {
+ List list1 = Arrays.asList("Foo", "Bar");
+ List list2 = Arrays.asList("Baz", "Boop");
+ List> list = Arrays.asList(list1, list2);
+ String result = conversionService.convert(list, String.class);
+ assertNotNull(result);
+ assertEquals("Foo,Bar,Baz,Boop", result);
+ }
+
@Test
public void convertCollectionToCollection() throws Exception {
Set foo = new LinkedHashSet();
@@ -660,6 +706,16 @@ public class DefaultConversionTests {
assertEquals(FooEnum.BAZ, map.get(2));
}
+ @Test
+ @SuppressWarnings({ "rawtypes" })
+ public void convertHashMapValuesToList() {
+ Map hashMap = new LinkedHashMap();
+ hashMap.put("1", 1);
+ hashMap.put("2", 2);
+ List converted = conversionService.convert(hashMap.values(), List.class);
+ assertEquals(Arrays.asList(1, 2), converted);
+ }
+
@Test
public void map() {
Map strings = new HashMap();
@@ -794,6 +850,21 @@ public class DefaultConversionTests {
assertArrayEquals(grid, convertedBack);
}
+ @Test
+ public void convertCannotOptimizeArray() {
+ conversionService.addConverter(new Converter() {
+
+ @Override
+ public Byte convert(Byte source) {
+ return (byte) (source + 1);
+ }
+ });
+ byte[] byteArray = new byte[] { 1, 2, 3 };
+ byte[] converted = conversionService.convert(byteArray, byte[].class);
+ assertNotSame(byteArray, converted);
+ assertTrue(Arrays.equals(new byte[] { 2, 3, 4 }, converted));
+ }
+
@Test
@SuppressWarnings("unchecked")
public void convertObjectToOptional() {
@@ -819,6 +890,22 @@ public class DefaultConversionTests {
assertSame(Optional.empty(), conversionService.convert(Optional.empty(), Optional.class));
}
+ @Test
+ public void testPerformance1() {
+ Assume.group(TestGroup.PERFORMANCE);
+ StopWatch watch = new StopWatch("integer->string conversionPerformance");
+ watch.start("convert 4,000,000 with conversion service");
+ for (int i = 0; i < 4000000; i++) {
+ conversionService.convert(3, String.class);
+ }
+ watch.stop();
+ watch.start("convert 4,000,000 manually");
+ for (int i = 0; i < 4000000; i++) {
+ new Integer(3).toString();
+ }
+ watch.stop();
+ // System.out.println(watch.prettyPrint());
+ }
@SuppressWarnings("serial")
public static class CustomNumber extends Number {
diff --git a/spring-core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java b/spring-core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java
index 68e0509f8d..03192f7414 100644
--- a/spring-core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java
+++ b/spring-core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java
@@ -24,16 +24,13 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.UUID;
import org.junit.Test;
@@ -51,18 +48,27 @@ import org.springframework.tests.TestGroup;
import org.springframework.util.StopWatch;
import org.springframework.util.StringUtils;
+import static java.util.Comparator.*;
+import static java.util.stream.Collectors.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
/**
+ * Unit tests for the {@link GenericConversionService}.
+ *
+ * For tests involving the {@link DefaultConversionService}, see
+ * {@link DefaultConversionServiceTests}.
+ *
* @author Keith Donald
* @author Juergen Hoeller
* @author Phillip Webb
* @author David Haraburda
+ * @author Sam Brannen
+ * @see DefaultConversionServiceTests
*/
public class GenericConversionServiceTests {
- private GenericConversionService conversionService = new GenericConversionService();
+ private final GenericConversionService conversionService = new GenericConversionService();
@Test
@@ -80,20 +86,14 @@ public class GenericConversionServiceTests {
assertTrue(conversionService.canConvert(boolean.class, Boolean.class));
}
- @Test
- public void canConvertIllegalArgumentNullTargetType() {
- try {
- assertFalse(conversionService.canConvert(String.class, null));
- fail("Should have failed");
- }
- catch (IllegalArgumentException ex) {
- }
- try {
- assertFalse(conversionService.canConvert(TypeDescriptor.valueOf(String.class), null));
- fail("Should have failed");
- }
- catch (IllegalArgumentException ex) {
- }
+ @Test(expected = IllegalArgumentException.class)
+ public void canConvertFromClassSourceTypeToNullTargetType() {
+ conversionService.canConvert(String.class, null);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void canConvertFromTypeDescriptorSourceTypeToNullTargetType() {
+ conversionService.canConvert(TypeDescriptor.valueOf(String.class), null);
}
@Test
@@ -115,7 +115,7 @@ public class GenericConversionServiceTests {
@Test(expected = ConversionFailedException.class)
public void convertNullSourcePrimitiveTarget() {
- assertEquals(null, conversionService.convert(null, int.class));
+ conversionService.convert(null, int.class);
}
@Test(expected = ConversionFailedException.class)
@@ -134,41 +134,23 @@ public class GenericConversionServiceTests {
assertEquals(Boolean.FALSE, conversionService.convert(false, Boolean.class));
}
- @Test
+ @Test(expected = ConverterNotFoundException.class)
public void converterNotFound() {
- try {
- conversionService.convert("3", Integer.class);
- fail("Should have thrown an exception");
- }
- catch (ConverterNotFoundException e) {
- }
+ conversionService.convert("3", Integer.class);
}
- @Test
- @SuppressWarnings("rawtypes")
+ @Test(expected = IllegalArgumentException.class)
public void addConverterNoSourceTargetClassInfoAvailable() {
- try {
- conversionService.addConverter(new Converter() {
- @Override
- public Object convert(Object source) {
- return source;
- }
- });
- fail("Should have failed");
- }
- catch (IllegalArgumentException ex) {
- }
+ conversionService.addConverter(new UntypedConverter());
}
@Test
public void sourceTypeIsVoid() {
- GenericConversionService conversionService = new GenericConversionService();
assertFalse(conversionService.canConvert(void.class, String.class));
}
@Test
public void targetTypeIsVoid() {
- GenericConversionService conversionService = new GenericConversionService();
assertFalse(conversionService.canConvert(String.class, void.class));
}
@@ -178,14 +160,13 @@ public class GenericConversionServiceTests {
}
@Test(expected = IllegalArgumentException.class)
- public void convertNullTargetClass() {
- assertNull(conversionService.convert("3", (Class>) null));
- assertNull(conversionService.convert("3", TypeDescriptor.valueOf(String.class), null));
+ public void convertToNullTargetClass() {
+ conversionService.convert("3", (Class>) null);
}
@Test(expected = IllegalArgumentException.class)
- public void convertNullTypeDescriptor() {
- assertNull(conversionService.convert("3", TypeDescriptor.valueOf(String.class), null));
+ public void convertToNullTargetTypeDescriptor() {
+ conversionService.convert("3", TypeDescriptor.valueOf(String.class), null);
}
@Test(expected = IllegalArgumentException.class)
@@ -193,16 +174,10 @@ public class GenericConversionServiceTests {
conversionService.convert("3", TypeDescriptor.valueOf(Integer.class), TypeDescriptor.valueOf(Long.class));
}
- @Test
+ @Test(expected = ConversionFailedException.class)
public void convertWrongTypeArgument() {
conversionService.addConverterFactory(new StringToNumberConverterFactory());
- try {
- conversionService.convert("BOGUS", Integer.class);
- fail("Should have failed");
- }
- catch (ConversionFailedException e) {
-
- }
+ conversionService.convert("BOGUS", Integer.class);
}
@Test
@@ -224,21 +199,16 @@ public class GenericConversionServiceTests {
conversionService.convert("#000000", SystemColor.class);
}
- public class ColorConverter implements Converter {
- @Override
- public Color convert(String source) { if (!source.startsWith("#")) source = "#" + source; return Color.decode(source); }
- }
-
@Test
public void convertObjectToPrimitive() {
assertFalse(conversionService.canConvert(String.class, boolean.class));
conversionService.addConverter(new StringToBooleanConverter());
assertTrue(conversionService.canConvert(String.class, boolean.class));
Boolean b = conversionService.convert("true", boolean.class);
- assertEquals(Boolean.TRUE, b);
+ assertTrue(b);
assertTrue(conversionService.canConvert(TypeDescriptor.valueOf(String.class), TypeDescriptor.valueOf(boolean.class)));
b = (Boolean) conversionService.convert("true", TypeDescriptor.valueOf(String.class), TypeDescriptor.valueOf(boolean.class));
- assertEquals(Boolean.TRUE, b);
+ assertTrue(b);
}
@Test
@@ -250,21 +220,15 @@ public class GenericConversionServiceTests {
assertEquals(3, three.intValue());
}
- @Test
+ @Test(expected = ConverterNotFoundException.class)
public void genericConverterDelegatingBackToConversionServiceConverterNotFound() {
conversionService.addConverter(new ObjectToArrayConverter(conversionService));
assertFalse(conversionService.canConvert(String.class, Integer[].class));
- try {
- conversionService.convert("3,4,5", Integer[].class);
- fail("should have failed");
- }
- catch (ConverterNotFoundException ex) {
- }
+ conversionService.convert("3,4,5", Integer[].class);
}
@Test
public void testListToIterableConversion() {
- GenericConversionService conversionService = new GenericConversionService();
List