more generic converters

This commit is contained in:
Keith Donald
2009-09-22 20:28:23 +00:00
parent ed611be838
commit e6c3227d2d
7 changed files with 457 additions and 106 deletions

View File

@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
@@ -32,7 +33,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.core.convert.ConversionFailedException;
import org.springframework.core.convert.ConverterNotFoundException;
@@ -44,28 +44,28 @@ import org.springframework.core.convert.converter.Converter;
*/
public class GenericConversionServiceTests {
private GenericConversionService converter = new GenericConversionService();
private GenericConversionService conversionService = new GenericConversionService();
@Test
public void executeConversion() {
converter.addConverterFactory(new StringToNumberConverterFactory());
assertEquals(new Integer(3), converter.convert("3", Integer.class));
conversionService.addConverterFactory(new StringToNumberConverterFactory());
assertEquals(new Integer(3), conversionService.convert("3", Integer.class));
}
@Test
public void executeConversionNullSource() {
assertEquals(null, converter.convert(null, Integer.class));
assertEquals(null, conversionService.convert(null, Integer.class));
}
@Test
public void executeCompatibleSource() {
assertEquals(Boolean.FALSE, converter.convert(false, boolean.class));
assertEquals(Boolean.FALSE, conversionService.convert(false, boolean.class));
}
@Test
public void converterNotFound() {
try {
converter.convert("3", Integer.class);
conversionService.convert("3", Integer.class);
fail("Should have thrown an exception");
} catch (ConverterNotFoundException e) {
}
@@ -74,7 +74,7 @@ public class GenericConversionServiceTests {
@Test
public void addConverterNoSourceTargetClassInfoAvailable() {
try {
converter.addConverter(new Converter() {
conversionService.addConverter(new Converter() {
public Object convert(Object source) {
return source;
}
@@ -87,24 +87,24 @@ public class GenericConversionServiceTests {
@Test
public void convertNull() {
assertNull(converter.convert(null, Integer.class));
assertNull(conversionService.convert(null, Integer.class));
}
@Test(expected = IllegalArgumentException.class)
public void convertNullTargetClass() {
assertEquals("3", converter.convert("3", (Class<?>) null));
assertEquals("3", conversionService.convert("3", (Class<?>) null));
}
@Test
public void convertNullTypeDescriptor() {
assertEquals(null, converter.convert(3, TypeDescriptor.valueOf(String.class), TypeDescriptor.NULL));
assertEquals(null, conversionService.convert(3, TypeDescriptor.valueOf(String.class), TypeDescriptor.NULL));
}
@Test
public void convertWrongTypeArgument() {
converter.addConverterFactory(new StringToNumberConverterFactory());
conversionService.addConverterFactory(new StringToNumberConverterFactory());
try {
converter.convert("BOGUS", Integer.class);
conversionService.convert("BOGUS", Integer.class);
fail("Should have failed");
} catch (ConversionFailedException e) {
@@ -113,26 +113,26 @@ public class GenericConversionServiceTests {
@Test
public void convertSuperSourceType() {
converter.addConverter(new Converter<CharSequence, Integer>() {
conversionService.addConverter(new Converter<CharSequence, Integer>() {
public Integer convert(CharSequence source) {
return Integer.valueOf(source.toString());
}
});
Integer result = converter.convert("3", Integer.class);
Integer result = conversionService.convert("3", Integer.class);
assertEquals(new Integer(3), result);
}
@Test
public void convertObjectToPrimitive() {
converter.addConverterFactory(new StringToNumberConverterFactory());
Integer three = converter.convert("3", int.class);
conversionService.addConverterFactory(new StringToNumberConverterFactory());
Integer three = conversionService.convert("3", int.class);
assertEquals(3, three.intValue());
}
@Test
public void convertArrayToArray() {
converter.addConverterFactory(new StringToNumberConverterFactory());
Integer[] result = converter.convert(new String[] { "1", "2", "3" }, Integer[].class);
conversionService.addConverterFactory(new StringToNumberConverterFactory());
Integer[] result = conversionService.convert(new String[] { "1", "2", "3" }, Integer[].class);
assertEquals(new Integer(1), result[0]);
assertEquals(new Integer(2), result[1]);
assertEquals(new Integer(3), result[2]);
@@ -140,8 +140,8 @@ public class GenericConversionServiceTests {
@Test
public void convertArrayToPrimitiveArray() {
converter.addConverterFactory(new StringToNumberConverterFactory());
int[] result = converter.convert(new String[] { "1", "2", "3" }, int[].class);
conversionService.addConverterFactory(new StringToNumberConverterFactory());
int[] result = conversionService.convert(new String[] { "1", "2", "3" }, int[].class);
assertEquals(1, result[0]);
assertEquals(2, result[1]);
assertEquals(3, result[2]);
@@ -149,7 +149,7 @@ public class GenericConversionServiceTests {
@Test
public void convertArrayToArrayAssignable() {
int[] result = converter.convert(new int[] { 1, 2, 3 }, int[].class);
int[] result = conversionService.convert(new int[] { 1, 2, 3 }, int[].class);
assertEquals(1, result[0]);
assertEquals(2, result[1]);
assertEquals(3, result[2]);
@@ -157,7 +157,7 @@ public class GenericConversionServiceTests {
@Test
public void convertArrayToListInterface() {
List<?> result = converter.convert(new String[] { "1", "2", "3" }, List.class);
List<?> result = conversionService.convert(new String[] { "1", "2", "3" }, List.class);
assertEquals("1", result.get(0));
assertEquals("2", result.get(1));
assertEquals("3", result.get(2));
@@ -167,8 +167,8 @@ public class GenericConversionServiceTests {
@Test
public void convertArrayToListGenericTypeConversion() throws Exception {
converter.addConverterFactory(new StringToNumberConverterFactory());
List<Integer> result = (List<Integer>) converter.convert(new String[] { "1", "2", "3" }, TypeDescriptor
conversionService.addConverterFactory(new StringToNumberConverterFactory());
List<Integer> result = (List<Integer>) conversionService.convert(new String[] { "1", "2", "3" }, TypeDescriptor
.valueOf(String[].class), new TypeDescriptor(getClass().getDeclaredField("genericList")));
assertEquals(new Integer("1"), result.get(0));
assertEquals(new Integer("2"), result.get(1));
@@ -177,7 +177,7 @@ public class GenericConversionServiceTests {
@Test
public void convertArrayToListImpl() {
LinkedList<?> result = converter.convert(new String[] { "1", "2", "3" }, LinkedList.class);
LinkedList<?> result = conversionService.convert(new String[] { "1", "2", "3" }, LinkedList.class);
assertEquals("1", result.get(0));
assertEquals("2", result.get(1));
assertEquals("3", result.get(2));
@@ -185,29 +185,63 @@ public class GenericConversionServiceTests {
@Test(expected = ConversionFailedException.class)
public void convertArrayToAbstractList() {
converter.convert(new String[] { "1", "2", "3" }, AbstractList.class);
conversionService.convert(new String[] { "1", "2", "3" }, AbstractList.class);
}
@Test
public void convertListToArray() {
public void convertArrayToString() {
String result = conversionService.convert(new String[] { "1", "2", "3" }, String.class);
assertEquals("1,2,3", result);
}
@Test
public void convertArrayToStringWithElementConversion() {
conversionService.addConverter(new ObjectToStringConverter());
String result = conversionService.convert(new Integer[] { 1, 2, 3 }, String.class);
assertEquals("1,2,3", result);
}
@Test
public void convertEmptyArrayToString() {
String result = conversionService.convert(new String[0], String.class);
assertEquals("", result);
}
@Test
public void convertArrayToObject() {
Object[] array = new Object[] { 3L };
Object result = conversionService.convert(array, Object.class);
assertEquals(3L, result);
}
@Test
public void convertArrayToObjectWithElementConversion() {
conversionService.addConverterFactory(new StringToNumberConverterFactory());
String[] array = new String[] { "3" };
Integer result = conversionService.convert(array, Integer.class);
assertEquals(new Integer(3), result);
}
@Test
public void convertCollectionToArray() {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
String[] result = converter.convert(list, String[].class);
String[] result = conversionService.convert(list, String[].class);
assertEquals("1", result[0]);
assertEquals("2", result[1]);
assertEquals("3", result[2]);
}
@Test
public void convertListToArrayWithComponentConversion() {
converter.addConverterFactory(new StringToNumberConverterFactory());
public void convertCollectionToArrayWithElementConversion() {
conversionService.addConverterFactory(new StringToNumberConverterFactory());
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
Integer[] result = converter.convert(list, Integer[].class);
Integer[] result = conversionService.convert(list, Integer[].class);
assertEquals(new Integer(1), result[0]);
assertEquals(new Integer(2), result[1]);
assertEquals(new Integer(3), result[2]);
@@ -215,18 +249,48 @@ public class GenericConversionServiceTests {
@Test
public void convertCollectionToCollection() throws Exception {
converter.addConverterFactory(new StringToNumberConverterFactory());
conversionService.addConverterFactory(new StringToNumberConverterFactory());
Set<String> foo = new LinkedHashSet<String>();
foo.add("1");
foo.add("2");
foo.add("3");
List<Integer> bar = (List<Integer>) converter.convert(foo, TypeDescriptor.valueOf(List.class),
List<Integer> bar = (List<Integer>) conversionService.convert(foo, TypeDescriptor.valueOf(List.class),
new TypeDescriptor(getClass().getField("genericList")));
assertEquals(new Integer(1), bar.get(0));
assertEquals(new Integer(2), bar.get(1));
assertEquals(new Integer(3), bar.get(2));
}
@Test
public void convertCollectionToString() {
List<String> list = Arrays.asList(new String[] { "foo", "bar" });
String result = conversionService.convert(list, String.class);
assertEquals("foo,bar", result);
}
@Test
public void convertCollectionToStringWithElementConversion() throws Exception {
conversionService.addConverter(new ObjectToStringConverter());
List<Integer> list = Arrays.asList(new Integer[] { 3, 5 });
String result = (String) conversionService.convert(list, new TypeDescriptor(getClass().getField("genericList")), TypeDescriptor.valueOf(String.class));
assertEquals("3,5", result);
}
@Test
public void convertCollectionToObject() {
List<Long> list = Collections.singletonList(3L);
Long result = conversionService.convert(list, Long.class);
assertEquals(new Long(3), result);
}
@Test
public void convertCollectionToObjectWithElementConversion() {
conversionService.addConverterFactory(new StringToNumberConverterFactory());
List<String> list = Collections.singletonList("3");
Integer result = conversionService.convert(list, Integer.class);
assertEquals(new Integer(3), result);
}
public Map<Integer, FooEnum> genericMap = new HashMap<Integer, FooEnum>();
@Test
@@ -234,89 +298,103 @@ public class GenericConversionServiceTests {
Map<String, String> foo = new HashMap<String, String>();
foo.put("1", "BAR");
foo.put("2", "BAZ");
converter.addConverterFactory(new StringToNumberConverterFactory());
converter.addConverterFactory(new StringToEnumConverterFactory());
Map<String, FooEnum> map = (Map<String, FooEnum>) converter.convert(foo, TypeDescriptor.valueOf(Map.class),
new TypeDescriptor(getClass().getField("genericMap")));
conversionService.addConverterFactory(new StringToNumberConverterFactory());
conversionService.addConverterFactory(new StringToEnumConverterFactory());
Map<String, FooEnum> map = (Map<String, FooEnum>) conversionService.convert(foo, TypeDescriptor
.valueOf(Map.class), new TypeDescriptor(getClass().getField("genericMap")));
assertEquals(map.get(1), FooEnum.BAR);
assertEquals(map.get(2), FooEnum.BAZ);
}
@Test
public void convertObjectToCollection() {
List<String> result = (List<String>) converter.convert("test", List.class);
assertEquals(1, result.size());
assertEquals("test", result.get(0));
public void convertStringToArray() {
conversionService.addConverterFactory(new StringToNumberConverterFactory());
String[] result = conversionService.convert("1,2,3", String[].class);
assertEquals(3, result.length);
assertEquals("1", result[0]);
assertEquals("2", result[1]);
assertEquals("3", result[2]);
}
@Test
public void convertObjectToCollectionWithElementConversion() throws Exception {
converter.addConverterFactory(new StringToNumberConverterFactory());
List<Integer> result = (List<Integer>) converter.convert("3", TypeDescriptor.valueOf(String.class),
new TypeDescriptor(getClass().getField("genericList")));
assertEquals(1, result.size());
assertEquals(new Integer(3), result.get(0));
}
@Test
public void convertCollectionToObject() {
List<String> list = Collections.singletonList("test");
String result = converter.convert(list, String.class);
assertEquals("test", result);
}
@Test
public void convertCollectionToObjectWithElementConversion() {
converter.addConverterFactory(new StringToNumberConverterFactory());
List<String> list = Collections.singletonList("3");
Integer result = converter.convert(list, Integer.class);
assertEquals(new Integer(3), result);
}
@Test
public void convertObjectToArray() {
String[] result = converter.convert("test", String[].class);
assertEquals(1, result.length);
assertEquals("test", result[0]);
}
@Test
public void convertObjectToArrayWithElementConversion() {
converter.addConverterFactory(new StringToNumberConverterFactory());
Integer[] result = converter.convert("1", Integer[].class);
assertEquals(1, result.length);
assertEquals(new Integer(1), result[0]);
}
@Test
public void convertArrayToObject() {
String[] array = new String[] { "test" };
String result = converter.convert(array, String.class);
assertEquals("test", result);
}
@Test
public void convertArrayToObjectWithElementConversion() {
converter.addConverterFactory(new StringToNumberConverterFactory());
String[] array = new String[] { "3" };
Integer result = converter.convert(array, Integer.class);
assertEquals(new Integer(3), result);
}
@Test
public void convertStringToArrayWithElementConversion() {
converter.addConverterFactory(new StringToNumberConverterFactory());
Integer[] result = converter.convert("1,2,3", Integer[].class);
conversionService.addConverterFactory(new StringToNumberConverterFactory());
Integer[] result = conversionService.convert("1,2,3", Integer[].class);
assertEquals(3, result.length);
assertEquals(new Integer(1), result[0]);
assertEquals(new Integer(2), result[1]);
assertEquals(new Integer(3), result[2]);
}
@Test
public void convertEmptyStringToArray() {
conversionService.addConverterFactory(new StringToNumberConverterFactory());
String[] result = conversionService.convert("", String[].class);
assertEquals(0, result.length);
}
@Test
public void convertStringToCollection() {
conversionService.addConverterFactory(new StringToNumberConverterFactory());
List result = conversionService.convert("1,2,3", List.class);
assertEquals(3, result.size());
assertEquals("1", result.get(0));
assertEquals("2", result.get(1));
assertEquals("3", result.get(2));
}
@Test
public void convertStringToCollectionWithElementConversion() throws Exception {
conversionService.addConverterFactory(new StringToNumberConverterFactory());
List result = (List) conversionService.convert("1,2,3", TypeDescriptor.valueOf(String.class), new TypeDescriptor(getClass().getField("genericList")));
assertEquals(3, result.size());
assertEquals(new Integer(1), result.get(0));
assertEquals(new Integer(2), result.get(1));
assertEquals(new Integer(3), result.get(2));
}
@Test
public void convertEmptyStringToCollection() {
conversionService.addConverterFactory(new StringToNumberConverterFactory());
String[] result = conversionService.convert("", String[].class);
assertEquals(0, result.length);
}
@Test
public void convertObjectToCollection() {
List<String> result = (List<String>) conversionService.convert(3L, List.class);
assertEquals(1, result.size());
assertEquals(3L, result.get(0));
}
@Test
public void convertObjectToCollectionWithElementConversion() throws Exception {
conversionService.addConverterFactory(new NumberToNumberConverterFactory());
List<Integer> result = (List<Integer>) conversionService.convert(3L, TypeDescriptor.valueOf(Long.class),
new TypeDescriptor(getClass().getField("genericList")));
assertEquals(1, result.size());
assertEquals(new Integer(3), result.get(0));
}
@Test
public void convertObjectToArray() {
Object[] result = conversionService.convert(3L, Object[].class);
assertEquals(1, result.length);
assertEquals(3L, result[0]);
}
@Test
public void convertObjectToArrayWithElementConversion() {
conversionService.addConverterFactory(new NumberToNumberConverterFactory());
Integer[] result = conversionService.convert(3L, Integer[].class);
assertEquals(1, result.length);
assertEquals(new Integer(3), result[0]);
}
@Test
public void genericConverterDelegatingBackToConversionServiceConverterNotFound() {
try {
converter.convert("1", Integer[].class);
conversionService.convert("1", Integer[].class);
} catch (ConversionFailedException e) {
assertTrue(e.getCause() instanceof ConverterNotFoundException);
}
@@ -325,10 +403,10 @@ public class GenericConversionServiceTests {
@Test
public void parent() {
GenericConversionService parent = new GenericConversionService();
converter.setParent(parent);
assertFalse(converter.canConvert(String.class, Integer.class));
conversionService.setParent(parent);
assertFalse(conversionService.canConvert(String.class, Integer.class));
try {
converter.convert("3", Integer.class);
conversionService.convert("3", Integer.class);
} catch (ConverterNotFoundException e) {
}