提交 c693f216 编写于 作者: K Keith Donald

Beefed up test suite

上级 e9416db4
...@@ -37,7 +37,7 @@ final class ArrayToArrayGenericConverter implements GenericConverter { ...@@ -37,7 +37,7 @@ final class ArrayToArrayGenericConverter implements GenericConverter {
Object target = Array.newInstance(targetElementType.getType(), Array.getLength(source)); Object target = Array.newInstance(targetElementType.getType(), Array.getLength(source));
GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetElementType); GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetElementType);
if (converter == null) { if (converter == null) {
throw new ConverterNotFoundException(sourceType, targetType); throw new ConverterNotFoundException(sourceElementType, targetElementType);
} }
for (int i = 0; i < Array.getLength(target); i++) { for (int i = 0; i < Array.getLength(target); i++) {
Array.set(target, i, converter.convert(Array.get(source, i), sourceElementType, targetElementType)); Array.set(target, i, converter.convert(Array.get(source, i), sourceElementType, targetElementType));
......
...@@ -42,7 +42,7 @@ final class ArrayToCollectionGenericConverter implements GenericConverter { ...@@ -42,7 +42,7 @@ final class ArrayToCollectionGenericConverter implements GenericConverter {
} else { } else {
GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetElementType); GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetElementType);
if (converter == null) { if (converter == null) {
throw new ConverterNotFoundException(sourceType, targetType); throw new ConverterNotFoundException(sourceElementType, targetElementType);
} }
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
collection.add(converter.convert(Array.get(source, i), sourceElementType, targetElementType)); collection.add(converter.convert(Array.get(source, i), sourceElementType, targetElementType));
......
...@@ -39,7 +39,7 @@ final class ArrayToObjectGenericConverter implements GenericConverter { ...@@ -39,7 +39,7 @@ final class ArrayToObjectGenericConverter implements GenericConverter {
} else { } else {
GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetType); GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetType);
if (converter == null) { if (converter == null) {
throw new ConverterNotFoundException(sourceType, targetType); throw new ConverterNotFoundException(sourceElementType, targetType);
} }
return converter.convert(Array.get(source, 0), sourceElementType, targetType); return converter.convert(Array.get(source, 0), sourceElementType, targetType);
} }
......
...@@ -46,7 +46,7 @@ final class CollectionToArrayGenericConverter implements GenericConverter { ...@@ -46,7 +46,7 @@ final class CollectionToArrayGenericConverter implements GenericConverter {
} else { } else {
GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetElementType); GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetElementType);
if (converter == null) { if (converter == null) {
throw new ConverterNotFoundException(sourceType, targetType); throw new ConverterNotFoundException(sourceElementType, targetElementType);
} }
for (Iterator it = sourceCollection.iterator(); it.hasNext(); i++) { for (Iterator it = sourceCollection.iterator(); it.hasNext(); i++) {
Array.set(array, i, converter.convert(it.next(), sourceElementType, targetElementType)); Array.set(array, i, converter.convert(it.next(), sourceElementType, targetElementType));
......
...@@ -28,7 +28,7 @@ final class CollectionToCollectionGenericConverter implements GenericConverter { ...@@ -28,7 +28,7 @@ final class CollectionToCollectionGenericConverter implements GenericConverter {
public CollectionToCollectionGenericConverter(GenericConversionService conversionService) { public CollectionToCollectionGenericConverter(GenericConversionService conversionService) {
this.conversionService = conversionService; this.conversionService = conversionService;
} }
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
Collection sourceCollection = (Collection) source; Collection sourceCollection = (Collection) source;
TypeDescriptor sourceElementType = sourceType.getElementTypeDescriptor(); TypeDescriptor sourceElementType = sourceType.getElementTypeDescriptor();
...@@ -40,7 +40,8 @@ final class CollectionToCollectionGenericConverter implements GenericConverter { ...@@ -40,7 +40,8 @@ final class CollectionToCollectionGenericConverter implements GenericConverter {
if (sourceType.isAssignableTo(targetType)) { if (sourceType.isAssignableTo(targetType)) {
return sourceCollection; return sourceCollection;
} else { } else {
Collection targetCollection = CollectionFactory.createCollection(targetType.getType(), sourceCollection.size()); Collection targetCollection = CollectionFactory.createCollection(targetType.getType(), sourceCollection
.size());
targetCollection.addAll(sourceCollection); targetCollection.addAll(sourceCollection);
return targetCollection; return targetCollection;
} }
...@@ -48,14 +49,14 @@ final class CollectionToCollectionGenericConverter implements GenericConverter { ...@@ -48,14 +49,14 @@ final class CollectionToCollectionGenericConverter implements GenericConverter {
Collection targetCollection = CollectionFactory.createCollection(targetType.getType(), sourceCollection.size()); Collection targetCollection = CollectionFactory.createCollection(targetType.getType(), sourceCollection.size());
GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetElementType); GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetElementType);
if (converter == null) { if (converter == null) {
throw new ConverterNotFoundException(sourceType, targetType); throw new ConverterNotFoundException(sourceElementType, targetElementType);
} }
for (Object element : sourceCollection) { for (Object element : sourceCollection) {
targetCollection.add(converter.convert(element, sourceElementType, targetElementType)); targetCollection.add(converter.convert(element, sourceElementType, targetElementType));
} }
return targetCollection; return targetCollection;
} }
private TypeDescriptor getElementType(Collection collection) { private TypeDescriptor getElementType(Collection collection) {
for (Object element : collection) { for (Object element : collection) {
if (element != null) { if (element != null) {
......
...@@ -33,15 +33,19 @@ final class CollectionToObjectGenericConverter implements GenericConverter { ...@@ -33,15 +33,19 @@ final class CollectionToObjectGenericConverter implements GenericConverter {
if (sourceCollection.size() == 0) { if (sourceCollection.size() == 0) {
return null; return null;
} else { } else {
Object firstElement = sourceCollection.iterator().next();
TypeDescriptor sourceElementType = sourceType.getElementTypeDescriptor(); TypeDescriptor sourceElementType = sourceType.getElementTypeDescriptor();
if (sourceElementType == TypeDescriptor.NULL && firstElement != null) {
sourceElementType = TypeDescriptor.valueOf(firstElement.getClass());
}
if (sourceElementType == TypeDescriptor.NULL || sourceElementType.isAssignableTo(targetType)) { if (sourceElementType == TypeDescriptor.NULL || sourceElementType.isAssignableTo(targetType)) {
return sourceCollection.iterator().next(); return firstElement;
} else { } else {
GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetType); GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetType);
if (converter == null) { if (converter == null) {
throw new ConverterNotFoundException(sourceType, targetType); throw new ConverterNotFoundException(sourceElementType, targetType);
} }
return converter.convert(sourceCollection.iterator().next(), sourceElementType, targetType); return converter.convert(firstElement, sourceElementType, targetType);
} }
} }
} }
......
...@@ -36,7 +36,7 @@ final class ObjectToArrayGenericConverter implements GenericConverter { ...@@ -36,7 +36,7 @@ final class ObjectToArrayGenericConverter implements GenericConverter {
} else { } else {
GenericConverter converter = this.conversionService.getConverter(sourceType, targetElementType); GenericConverter converter = this.conversionService.getConverter(sourceType, targetElementType);
if (converter == null) { if (converter == null) {
throw new ConverterNotFoundException(sourceType, targetType); throw new ConverterNotFoundException(sourceType, targetElementType);
} }
Array.set(target, 0, converter.convert(source, sourceType, targetElementType)); Array.set(target, 0, converter.convert(source, sourceType, targetElementType));
} }
......
...@@ -37,7 +37,7 @@ final class ObjectToCollectionGenericConverter implements GenericConverter { ...@@ -37,7 +37,7 @@ final class ObjectToCollectionGenericConverter implements GenericConverter {
} else { } else {
GenericConverter converter = this.conversionService.getConverter(sourceType, targetElementType); GenericConverter converter = this.conversionService.getConverter(sourceType, targetElementType);
if (converter == null) { if (converter == null) {
throw new ConverterNotFoundException(sourceType, targetType); throw new ConverterNotFoundException(sourceType, targetElementType);
} }
target.add(converter.convert(source, sourceType, targetElementType)); target.add(converter.convert(source, sourceType, targetElementType));
} }
......
...@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue; ...@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue;
import java.util.AbstractList; import java.util.AbstractList;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.LinkedList; import java.util.LinkedList;
...@@ -145,7 +146,7 @@ public class GenericConversionServiceTests { ...@@ -145,7 +146,7 @@ public class GenericConversionServiceTests {
assertEquals(2, result[1]); assertEquals(2, result[1]);
assertEquals(3, result[2]); assertEquals(3, result[2]);
} }
@Test @Test
public void convertArrayToArrayAssignable() { public void convertArrayToArrayAssignable() {
int[] result = converter.convert(new int[] { 1, 2, 3 }, int[].class); int[] result = converter.convert(new int[] { 1, 2, 3 }, int[].class);
...@@ -182,7 +183,7 @@ public class GenericConversionServiceTests { ...@@ -182,7 +183,7 @@ public class GenericConversionServiceTests {
assertEquals("3", result.get(2)); assertEquals("3", result.get(2));
} }
@Test(expected=ConversionFailedException.class) @Test(expected = ConversionFailedException.class)
public void convertArrayToAbstractList() { public void convertArrayToAbstractList() {
converter.convert(new String[] { "1", "2", "3" }, AbstractList.class); converter.convert(new String[] { "1", "2", "3" }, AbstractList.class);
} }
...@@ -241,6 +242,37 @@ public class GenericConversionServiceTests { ...@@ -241,6 +242,37 @@ public class GenericConversionServiceTests {
assertEquals(map.get(2), FooEnum.BAZ); 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));
}
@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 @Test
public void convertObjectToArray() { public void convertObjectToArray() {
String[] result = converter.convert("test", String[].class); String[] result = converter.convert("test", String[].class);
...@@ -256,6 +288,21 @@ public class GenericConversionServiceTests { ...@@ -256,6 +288,21 @@ public class GenericConversionServiceTests {
assertEquals(new Integer(1), result[0]); 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 @Test
@Ignore @Ignore
public void convertStringToArrayWithElementConversion() { public void convertStringToArrayWithElementConversion() {
...@@ -275,7 +322,7 @@ public class GenericConversionServiceTests { ...@@ -275,7 +322,7 @@ public class GenericConversionServiceTests {
assertTrue(e.getCause() instanceof ConverterNotFoundException); assertTrue(e.getCause() instanceof ConverterNotFoundException);
} }
} }
@Test @Test
public void parent() { public void parent() {
GenericConversionService parent = new GenericConversionService(); GenericConversionService parent = new GenericConversionService();
...@@ -284,7 +331,7 @@ public class GenericConversionServiceTests { ...@@ -284,7 +331,7 @@ public class GenericConversionServiceTests {
try { try {
converter.convert("3", Integer.class); converter.convert("3", Integer.class);
} catch (ConverterNotFoundException e) { } catch (ConverterNotFoundException e) {
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册