7 changed files with 560 additions and 33 deletions
@ -0,0 +1,295 @@
@@ -0,0 +1,295 @@
|
||||
/* |
||||
* Copyright 2002-2011 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. |
||||
* 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 org.springframework.core.convert.support; |
||||
|
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.net.URI; |
||||
import java.net.URL; |
||||
import java.util.ArrayList; |
||||
import java.util.Arrays; |
||||
import java.util.Collection; |
||||
import java.util.LinkedList; |
||||
import java.util.List; |
||||
import java.util.Vector; |
||||
|
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
|
||||
import org.springframework.core.convert.ConversionFailedException; |
||||
import org.springframework.core.convert.ConverterNotFoundException; |
||||
import org.springframework.core.convert.TypeDescriptor; |
||||
import org.springframework.core.io.ClassPathResource; |
||||
import org.springframework.core.io.FileSystemResource; |
||||
import org.springframework.core.io.Resource; |
||||
|
||||
import static org.junit.Assert.*; |
||||
|
||||
/** |
||||
* @author Keith Donald |
||||
*/ |
||||
public class CollectionToCollectionConverterTests { |
||||
|
||||
private GenericConversionService conversionService = new GenericConversionService(); |
||||
|
||||
@Before |
||||
public void setUp() { |
||||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService)); |
||||
} |
||||
|
||||
@Test |
||||
public void scalarList() throws Exception { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("9"); |
||||
list.add("37"); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list); |
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("scalarListTarget")); |
||||
assertFalse(conversionService.canConvert(sourceType, targetType)); |
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory()); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
@SuppressWarnings("unchecked") |
||||
List<String> result = (List<String>) conversionService.convert(list, sourceType, targetType); |
||||
assertFalse(list.equals(result)); |
||||
assertEquals((Integer) 9, result.get(0)); |
||||
assertEquals((Integer) 37, result.get(1)); |
||||
} |
||||
|
||||
public ArrayList<Integer> scalarListTarget; |
||||
|
||||
@Test |
||||
public void emptyListToList() throws Exception { |
||||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService)); |
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory()); |
||||
List<String> list = new ArrayList<String>(); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list); |
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("emptyListTarget")); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
assertEquals(list, conversionService.convert(list, sourceType, targetType)); |
||||
} |
||||
|
||||
public List<Integer> emptyListTarget; |
||||
|
||||
@Test |
||||
public void emptyListToListDifferentTargetType() throws Exception { |
||||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService)); |
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory()); |
||||
List<String> list = new ArrayList<String>(); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list); |
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("emptyListDifferentTarget")); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
@SuppressWarnings("unchecked") |
||||
LinkedList<Integer> result = (LinkedList<Integer>) conversionService.convert(list, sourceType, targetType); |
||||
assertEquals(LinkedList.class, result.getClass()); |
||||
assertTrue(result.isEmpty()); |
||||
} |
||||
|
||||
public LinkedList<Integer> emptyListDifferentTarget; |
||||
|
||||
@Test |
||||
public void collectionToObjectInteraction() throws Exception { |
||||
List<List<String>> list = new ArrayList<List<String>>(); |
||||
list.add(Arrays.asList("9", "12")); |
||||
list.add(Arrays.asList("37", "23")); |
||||
conversionService.addConverter(new CollectionToObjectConverter(conversionService)); |
||||
assertTrue(conversionService.canConvert(List.class, List.class)); |
||||
assertSame(list, conversionService.convert(list, List.class)); |
||||
} |
||||
|
||||
@Test |
||||
@SuppressWarnings("unchecked") |
||||
public void arrayCollectionToObjectInteraction() throws Exception { |
||||
List<String>[] array = new List[2]; |
||||
array[0] = Arrays.asList("9", "12"); |
||||
array[1] = Arrays.asList("37", "23"); |
||||
conversionService.addConverter(new ArrayToCollectionConverter(conversionService)); |
||||
conversionService.addConverter(new CollectionToObjectConverter(conversionService)); |
||||
assertTrue(conversionService.canConvert(String[].class, List.class)); |
||||
assertEquals(Arrays.asList(array), conversionService.convert(array, List.class)); |
||||
} |
||||
|
||||
@Test |
||||
@SuppressWarnings("unchecked") |
||||
public void objectToCollection() throws Exception { |
||||
List<List<String>> list = new ArrayList<List<String>>(); |
||||
list.add(Arrays.asList("9", "12")); |
||||
list.add(Arrays.asList("37", "23")); |
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory()); |
||||
conversionService.addConverter(new ObjectToCollectionConverter(conversionService)); |
||||
conversionService.addConverter(new CollectionToObjectConverter(conversionService)); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list); |
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("objectToCollection")); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
List<List<List<Integer>>> result = (List<List<List<Integer>>>) conversionService.convert(list, sourceType, targetType); |
||||
assertEquals((Integer)9, result.get(0).get(0).get(0)); |
||||
assertEquals((Integer)12, result.get(0).get(1).get(0)); |
||||
assertEquals((Integer)37, result.get(1).get(0).get(0)); |
||||
assertEquals((Integer)23, result.get(1).get(1).get(0)); |
||||
} |
||||
|
||||
public List<List<List<Integer>>> objectToCollection; |
||||
|
||||
@Test |
||||
@SuppressWarnings("unchecked") |
||||
public void stringToCollection() throws Exception { |
||||
List<List<String>> list = new ArrayList<List<String>>(); |
||||
list.add(Arrays.asList("9,12")); |
||||
list.add(Arrays.asList("37,23")); |
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory()); |
||||
conversionService.addConverter(new StringToCollectionConverter(conversionService)); |
||||
conversionService.addConverter(new ObjectToCollectionConverter(conversionService)); |
||||
conversionService.addConverter(new CollectionToObjectConverter(conversionService)); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list); |
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("objectToCollection")); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
List<List<List<Integer>>> result = (List<List<List<Integer>>>) conversionService.convert(list, sourceType, targetType); |
||||
assertEquals((Integer)9, result.get(0).get(0).get(0)); |
||||
assertEquals((Integer)12, result.get(0).get(0).get(1)); |
||||
assertEquals((Integer)37, result.get(1).get(0).get(0)); |
||||
assertEquals((Integer)23, result.get(1).get(0).get(1)); |
||||
} |
||||
|
||||
@Test |
||||
public void differentImpls() throws Exception { |
||||
List<Resource> resources = new ArrayList<Resource>(); |
||||
resources.add(new ClassPathResource("test")); |
||||
resources.add(new FileSystemResource("test")); |
||||
resources.add(new TestResource()); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(resources); |
||||
assertSame(resources, conversionService.convert(resources, sourceType, new TypeDescriptor(getClass().getField("resources")))); |
||||
} |
||||
|
||||
@Test |
||||
public void mixedInNulls() throws Exception { |
||||
List<Resource> resources = new ArrayList<Resource>(); |
||||
resources.add(new ClassPathResource("test")); |
||||
resources.add(null); |
||||
resources.add(new FileSystemResource("test")); |
||||
resources.add(new TestResource()); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(resources); |
||||
assertSame(resources, conversionService.convert(resources, sourceType, new TypeDescriptor(getClass().getField("resources")))); |
||||
} |
||||
|
||||
@Test |
||||
public void allNulls() throws Exception { |
||||
List<Resource> resources = new ArrayList<Resource>(); |
||||
resources.add(null); |
||||
resources.add(null); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(resources); |
||||
assertSame(resources, conversionService.convert(resources, sourceType, new TypeDescriptor(getClass().getField("resources")))); |
||||
} |
||||
|
||||
@Test(expected=ConverterNotFoundException.class) |
||||
public void elementTypesNotConvertible() throws Exception { |
||||
List<String> resources = new ArrayList<String>(); |
||||
resources.add(null); |
||||
resources.add(null); |
||||
TypeDescriptor sourceType = new TypeDescriptor(getClass().getField("strings")); |
||||
assertEquals(resources, conversionService.convert(resources, sourceType, new TypeDescriptor(getClass().getField("resources")))); |
||||
} |
||||
|
||||
public List<String> strings; |
||||
|
||||
@Test(expected=ConversionFailedException.class) |
||||
public void nothingInCommon() throws Exception { |
||||
List<Object> resources = new ArrayList<Object>(); |
||||
resources.add(new ClassPathResource("test")); |
||||
resources.add(3); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(resources); |
||||
assertEquals(resources, conversionService.convert(resources, sourceType, new TypeDescriptor(getClass().getField("resources")))); |
||||
} |
||||
|
||||
public List<Resource> resources; |
||||
|
||||
public static abstract class BaseResource implements Resource { |
||||
|
||||
public InputStream getInputStream() throws IOException { |
||||
return null; |
||||
} |
||||
|
||||
public boolean exists() { |
||||
return false; |
||||
} |
||||
|
||||
public boolean isReadable() { |
||||
return false; |
||||
} |
||||
|
||||
public boolean isOpen() { |
||||
return false; |
||||
} |
||||
|
||||
public URL getURL() throws IOException { |
||||
return null; |
||||
} |
||||
|
||||
public URI getURI() throws IOException { |
||||
return null; |
||||
} |
||||
|
||||
public File getFile() throws IOException { |
||||
return null; |
||||
} |
||||
|
||||
public long contentLength() throws IOException { |
||||
return 0; |
||||
} |
||||
|
||||
public long lastModified() throws IOException { |
||||
return 0; |
||||
} |
||||
|
||||
public Resource createRelative(String relativePath) throws IOException { |
||||
return null; |
||||
} |
||||
|
||||
public String getFilename() { |
||||
return null; |
||||
} |
||||
|
||||
public String getDescription() { |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public static class TestResource extends BaseResource { |
||||
|
||||
} |
||||
|
||||
@Test |
||||
public void convertEmptyVector_shouldReturnEmptyArrayList() { |
||||
Vector<String> vector = new Vector<String>(); |
||||
vector.add("Element"); |
||||
testCollectionConversionToArrayList(vector); |
||||
} |
||||
|
||||
@Test |
||||
public void convertNonEmptyVector_shouldReturnNonEmptyArrayList() { |
||||
Vector<String> vector = new Vector<String>(); |
||||
vector.add("Element"); |
||||
testCollectionConversionToArrayList(vector); |
||||
} |
||||
|
||||
@SuppressWarnings("rawtypes") |
||||
private void testCollectionConversionToArrayList(Collection<String> aSource) { |
||||
Object myConverted = (new CollectionToCollectionConverter(new GenericConversionService())).convert( |
||||
aSource, TypeDescriptor.forObject(aSource), TypeDescriptor.forObject(new ArrayList())); |
||||
assertTrue(myConverted instanceof ArrayList<?>); |
||||
assertEquals(aSource.size(), ((ArrayList<?>) myConverted).size()); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,186 @@
@@ -0,0 +1,186 @@
|
||||
/* |
||||
* Copyright 2002-2011 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. |
||||
* 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 org.springframework.core.convert.support; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.HashMap; |
||||
import java.util.LinkedHashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
|
||||
import org.springframework.core.convert.ConversionFailedException; |
||||
import org.springframework.core.convert.ConverterNotFoundException; |
||||
import org.springframework.core.convert.TypeDescriptor; |
||||
|
||||
import static org.junit.Assert.*; |
||||
|
||||
public class MapToMapConverterTests { |
||||
|
||||
private GenericConversionService conversionService = new GenericConversionService(); |
||||
|
||||
@Before |
||||
public void setUp() { |
||||
conversionService.addConverter(new MapToMapConverter(conversionService)); |
||||
} |
||||
|
||||
@Test |
||||
public void scalarMap() throws Exception { |
||||
Map<String, String> map = new HashMap<String, String>(); |
||||
map.put("1", "9"); |
||||
map.put("2", "37"); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(map); |
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("scalarMapTarget")); |
||||
assertFalse(conversionService.canConvert(sourceType, targetType)); |
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory()); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
@SuppressWarnings("unchecked") |
||||
Map<Integer, Integer> result = (Map<Integer, Integer>) conversionService.convert(map, sourceType, targetType); |
||||
assertFalse(map.equals(result)); |
||||
assertEquals((Integer) 9, result.get(1)); |
||||
assertEquals((Integer) 37, result.get(2)); |
||||
} |
||||
|
||||
public Map<Integer, Integer> scalarMapTarget; |
||||
|
||||
@Test |
||||
public void scalarMapNotGenericTarget() throws Exception { |
||||
Map<String, String> map = new HashMap<String, String>(); |
||||
map.put("1", "9"); |
||||
map.put("2", "37"); |
||||
assertTrue(conversionService.canConvert(Map.class, Map.class)); |
||||
assertSame(map, conversionService.convert(map, Map.class)); |
||||
} |
||||
|
||||
@Test |
||||
public void scalarMapNotGenericSourceField() throws Exception { |
||||
Map<String, String> map = new HashMap<String, String>(); |
||||
map.put("1", "9"); |
||||
map.put("2", "37"); |
||||
TypeDescriptor sourceType = new TypeDescriptor(getClass().getField("notGenericMapSource")); |
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("scalarMapTarget")); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
try { |
||||
conversionService.convert(map, sourceType, targetType); |
||||
} catch (ConversionFailedException e) { |
||||
assertTrue(e.getCause() instanceof ConverterNotFoundException); |
||||
} |
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory()); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
@SuppressWarnings("unchecked") |
||||
Map<Integer, Integer> result = (Map<Integer, Integer>) conversionService.convert(map, sourceType, targetType); |
||||
assertFalse(map.equals(result)); |
||||
assertEquals((Integer) 9, result.get(1)); |
||||
assertEquals((Integer) 37, result.get(2)); |
||||
} |
||||
|
||||
public Map notGenericMapSource; |
||||
|
||||
@Test |
||||
public void collectionMap() throws Exception { |
||||
Map<String, List<String>> map = new HashMap<String, List<String>>(); |
||||
map.put("1", Arrays.asList("9", "12")); |
||||
map.put("2", Arrays.asList("37", "23")); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(map); |
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("collectionMapTarget")); |
||||
assertFalse(conversionService.canConvert(sourceType, targetType)); |
||||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService)); |
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory()); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
@SuppressWarnings("unchecked") |
||||
Map<Integer, List<Integer>> result = (Map<Integer, List<Integer>>) conversionService.convert(map, sourceType, targetType); |
||||
assertFalse(map.equals(result)); |
||||
assertEquals(Arrays.asList(9, 12), result.get(1)); |
||||
assertEquals(Arrays.asList(37, 23), result.get(2)); |
||||
} |
||||
|
||||
public Map<Integer, List<Integer>> collectionMapTarget; |
||||
|
||||
@Test |
||||
public void collectionMapSourceTarget() throws Exception { |
||||
Map<String, List<String>> map = new HashMap<String, List<String>>(); |
||||
map.put("1", Arrays.asList("9", "12")); |
||||
map.put("2", Arrays.asList("37", "23")); |
||||
TypeDescriptor sourceType = new TypeDescriptor(getClass().getField("sourceCollectionMapTarget")); |
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("collectionMapTarget")); |
||||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService)); |
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory()); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
@SuppressWarnings("unchecked") |
||||
Map<Integer, List<Integer>> result = (Map<Integer, List<Integer>>) conversionService.convert(map, sourceType, targetType); |
||||
assertFalse(map.equals(result)); |
||||
assertEquals(Arrays.asList(9, 12), result.get(1)); |
||||
assertEquals(Arrays.asList(37, 23), result.get(2)); |
||||
} |
||||
|
||||
public Map<String, List<String>> sourceCollectionMapTarget; |
||||
|
||||
@Test |
||||
public void collectionMapNotGenericTarget() throws Exception { |
||||
Map<String, List<String>> map = new HashMap<String, List<String>>(); |
||||
map.put("1", Arrays.asList("9", "12")); |
||||
map.put("2", Arrays.asList("37", "23")); |
||||
assertTrue(conversionService.canConvert(Map.class, Map.class)); |
||||
assertSame(map, conversionService.convert(map, Map.class)); |
||||
} |
||||
|
||||
@Test |
||||
public void collectionMapNotGenericTargetCollectionToObjectInteraction() throws Exception { |
||||
Map<String, List<String>> map = new HashMap<String, List<String>>(); |
||||
map.put("1", Arrays.asList("9", "12")); |
||||
map.put("2", Arrays.asList("37", "23")); |
||||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService)); |
||||
conversionService.addConverter(new CollectionToObjectConverter(conversionService)); |
||||
assertTrue(conversionService.canConvert(Map.class, Map.class)); |
||||
assertSame(map, conversionService.convert(map, Map.class)); |
||||
} |
||||
|
||||
@Test |
||||
public void emptyMap() throws Exception { |
||||
Map<String, String> map = new HashMap<String, String>(); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(map); |
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("emptyMapTarget")); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
assertSame(map, conversionService.convert(map, sourceType, targetType)); |
||||
} |
||||
|
||||
public Map<String, String> emptyMapTarget; |
||||
|
||||
@Test |
||||
public void emptyMapNoTargetGenericInfo() throws Exception { |
||||
Map<String, String> map = new HashMap<String, String>(); |
||||
assertTrue(conversionService.canConvert(Map.class, Map.class)); |
||||
assertSame(map, conversionService.convert(map, Map.class)); |
||||
} |
||||
|
||||
@Test |
||||
public void emptyMapDifferentTargetImplType() throws Exception { |
||||
Map<String, String> map = new HashMap<String, String>(); |
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(map); |
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("emptyMapDifferentTarget")); |
||||
assertTrue(conversionService.canConvert(sourceType, targetType)); |
||||
@SuppressWarnings("unchecked") |
||||
LinkedHashMap<String, String> result = (LinkedHashMap<String, String>) conversionService.convert(map, sourceType, targetType); |
||||
assertEquals(map, result); |
||||
assertEquals(LinkedHashMap.class, result.getClass()); |
||||
} |
||||
|
||||
public LinkedHashMap<String, String> emptyMapDifferentTarget; |
||||
|
||||
} |
||||
Loading…
Reference in new issue