/*
* Copyright 2004-2012 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.binding.convert.service;
import java.security.Principal;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.StringTokenizer;
import junit.framework.TestCase;
import org.springframework.binding.convert.ConversionException;
import org.springframework.binding.convert.ConversionExecutionException;
import org.springframework.binding.convert.ConversionExecutor;
import org.springframework.binding.convert.ConversionExecutorNotFoundException;
import org.springframework.binding.convert.converters.Converter;
import org.springframework.binding.convert.converters.FormattedStringToNumber;
import org.springframework.binding.convert.converters.StringToBoolean;
import org.springframework.binding.convert.converters.StringToObject;
import org.springframework.binding.convert.converters.TwoWayConverter;
import org.springframework.binding.format.DefaultNumberFormatFactory;
/**
* Test case for the default conversion service.
*
* @author Keith Donald
*/
@SuppressWarnings("deprecation")
public class DefaultConversionServiceTests extends TestCase {
public void testConvertCompatibleTypes() {
DefaultConversionService service = new DefaultConversionService();
List<Object> lst = new ArrayList<Object>();
assertSame(lst, service.getConversionExecutor(ArrayList.class, List.class).execute(lst));
}
public void testOverrideConverter() {
Converter customConverter = new StringToBoolean("ja", "nee");
DefaultConversionService service = new DefaultConversionService();
StaticConversionExecutor executor = (StaticConversionExecutor) service.getConversionExecutor(String.class,
Boolean.class);
try {
executor.execute("ja");
fail();
} catch (ConversionExecutionException e) {
// expected
}
service.addConverter(customConverter);
executor = (StaticConversionExecutor) service.getConversionExecutor(String.class, Boolean.class);
assertTrue(((Boolean) executor.execute("ja")));
}
public void testTargetClassNotSupported() {
DefaultConversionService service = new DefaultConversionService();
try {
service.getConversionExecutor(String.class, HashMap.class);
fail("Should have thrown an exception");
} catch (ConversionExecutorNotFoundException e) {
}
}
public void testValidConversion() {
DefaultConversionService service = new DefaultConversionService();
ConversionExecutor executor = service.getConversionExecutor(String.class, Integer.class);
Integer three = (Integer) executor.execute("3");
assertEquals(new Integer(3), three);
ConversionExecutor executor2 = service.getConversionExecutor(Integer.class, String.class);
String threeString = (String) executor2.execute(3);
assertEquals("3", threeString);
}
public void testRegisterConverter() {
GenericConversionService service = new GenericConversionService();
FormattedStringToNumber converter = new FormattedStringToNumber();
DefaultNumberFormatFactory numberFormatFactory = new DefaultNumberFormatFactory();
numberFormatFactory.setLocale(Locale.US);
converter.setNumberFormatFactory(numberFormatFactory);
service.addConverter(converter);
ConversionExecutor executor = service.getConversionExecutor(String.class, Integer.class);
Integer three = (Integer) executor.execute("3,000");
assertEquals(new Integer(3000), three);
ConversionExecutor executor2 = service.getConversionExecutor(Integer.class, String.class);
String string = (String) executor2.execute(3000);
assertEquals("3,000", string);
}
public void testRegisterCustomConverter() {
DefaultConversionService service = new DefaultConversionService();
FormattedStringToNumber converter = new FormattedStringToNumber();
DefaultNumberFormatFactory numberFormatFactory = new DefaultNumberFormatFactory();
numberFormatFactory.setLocale(Locale.US);
converter.setNumberFormatFactory(numberFormatFactory);
service.addConverter("usaNumber", converter);
ConversionExecutor executor = service.getConversionExecutor("usaNumber", String.class, Integer.class);
Integer three = (Integer) executor.execute("3,000");
assertEquals(new Integer(3000), three);
ConversionExecutor executor2 = service.getConversionExecutor("usaNumber", Integer.class, String.class);
String string = (String) executor2.execute(3000);
assertEquals("3,000", string);
}
public void testRegisterCustomConverterForSameType() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("trimmer", new Trimmer());
ConversionExecutor executor = service.getConversionExecutor("trimmer", String.class, String.class);
assertEquals("a string", executor.execute("a string "));
}
public void testRegisterCustomConverterForSameTypeNotCompatibleSource() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("trimmer", new Trimmer());
try {
service.getConversionExecutor("trimmer", Object.class, String.class);
} catch (ConversionException e) {
}
}
public void testRegisterCustomConverterForSameTypeNotCompatibleTarget() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("trimmer", new Trimmer());
try {
service.getConversionExecutor("trimmer", String.class, Object.class);
} catch (ConversionException e) {
}
}
public void testRegisterCustomConverterReverseComparsion() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", Principal.class, String.class);
assertEquals("name", executor.execute(new Principal() {
public String getName() {
return "name";
}
}));
}
public void testRegisterCustomConverterReverseNotCompatibleSource() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
try {
service.getConversionExecutor("trimmer", Principal.class, Object.class);
} catch (ConversionException e) {
}
}
public void testRegisterCustomConverterArrayToArray() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", String[].class, Principal[].class);
Principal[] p = (Principal[]) executor.execute(new String[] { "princy1", "princy2" });
assertEquals("princy1", p[0].getName());
assertEquals("princy2", p[1].getName());
}
public void testRegisterCustomConverterArrayToArrayReverse() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", Principal[].class, String[].class);
final Principal princy1 = new Principal() {
public String getName() {
return "princy1";
}
};
final Principal princy2 = new Principal() {
public String getName() {
return "princy2";
}
};
String[] p = (String[]) executor.execute(new Principal[] { princy1, princy2 });
assertEquals("princy1", p[0]);
assertEquals("princy2", p[1]);
}
public void testRegisterCustomConverterArrayToArrayBogus() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
try {
service.getConversionExecutor("princy", Integer[].class, Principal[].class);
fail("Should have failed");
} catch (ConversionExecutorNotFoundException e) {
}
}
@SuppressWarnings("unchecked")
public void testRegisterCustomConverterArrayToList() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", String[].class, List.class);
List<Principal> list = (List<Principal>) executor.execute(new String[] { "princy1", "princy2" });
assertEquals("princy1", (list.get(0)).getName());
assertEquals("princy2", (list.get(1)).getName());
}
@SuppressWarnings("unchecked")
public void testRegisterCustomConverterArrayToListReverse() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", Principal[].class, List.class);
final Principal princy1 = new Principal() {
public String getName() {
return "princy1";
}
};
final Principal princy2 = new Principal() {
public String getName() {
return "princy2";
}
};
List<String> p = (List<String>) executor.execute(new Principal[] { princy1, princy2 });
assertEquals("princy1", p.get(0));
assertEquals("princy2", p.get(1));
}
public void testRegisterCustomConverterArrayToListBogus() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
try {
service.getConversionExecutor("princy", Integer[].class, List.class);
fail("Should have failed");
} catch (ConversionExecutorNotFoundException e) {
}
}
public void testRegisterCustomConverterListToArray() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", List.class, Principal[].class);
List<String> princyList = new ArrayList<String>();
princyList.add("princy1");
princyList.add("princy2");
Principal[] p = (Principal[]) executor.execute(princyList);
assertEquals("princy1", p[0].getName());
assertEquals("princy2", p[1].getName());
}
public void testRegisterCustomConverterListToArrayReverse() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", List.class, String[].class);
final Principal princy1 = new Principal() {
public String getName() {
return "princy1";
}
};
final Principal princy2 = new Principal() {
public String getName() {
return "princy2";
}
};
List<Principal> princyList = new ArrayList<Principal>();
princyList.add(princy1);
princyList.add(princy2);
String[] p = (String[]) executor.execute(princyList);
assertEquals("princy1", p[0]);
assertEquals("princy2", p[1]);
}
public void testRegisterCustomConverterListToArrayBogus() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
try {
service.getConversionExecutor("princy", List.class, Integer[].class);
fail("Should have failed");
} catch (ConversionExecutorNotFoundException e) {
}
}
public void testRegisterCustomConverterObjectToArray() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", String.class, Principal[].class);
Principal[] p = (Principal[]) executor.execute("princy1");
assertEquals("princy1", p[0].getName());
}
public void testRegisterCustomConverterObjectToArrayReverse() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", Principal.class, String[].class);
final Principal princy1 = new Principal() {
public String getName() {
return "princy1";
}
};
String[] p = (String[]) executor.execute(princy1);
assertEquals("princy1", p[0]);
}
public void testRegisterCustomConverterObjectToArrayBogus() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
try {
service.getConversionExecutor("princy", Integer.class, Principal[].class);
fail("Should have failed");
} catch (ConversionExecutorNotFoundException e) {
}
}
@SuppressWarnings("unchecked")
public void testRegisterCustomConverterObjectToList() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", String.class, List.class);
List<Principal> list = (List<Principal>) executor.execute("princy1");
assertEquals("princy1", list.get(0).getName());
}
@SuppressWarnings("unchecked")
public void testRegisterCustomConverterCsvStringToList() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new PrincipalCsvStringToListConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", String.class, List.class);
List<Principal> list = (List<Principal>) executor.execute("princy1,princy2");
assertEquals("princy1", list.get(0).getName());
assertEquals("princy2", list.get(1).getName());
}
public void testRegisterCustomConverterObjectToListBogus() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", Integer.class, List.class);
try {
executor.execute(1);
fail("Should have failed");
} catch (ConversionExecutionException e) {
}
}
@SuppressWarnings("unchecked")
public void testRegisterCustomConverterObjectToListReverse() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", Principal.class, List.class);
final Principal princy1 = new Principal() {
public String getName() {
return "princy1";
}
};
List<String> list = (List<String>) executor.execute(princy1);
assertEquals("princy1", list.get(0));
}
@SuppressWarnings("unchecked")
public void testRegisterCustomConverterListToList() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", List.class, List.class);
List<String> princyList = new ArrayList<String>();
princyList.add("princy1");
princyList.add("princy2");
List<Principal> list = (List<Principal>) executor.execute(princyList);
assertEquals("princy1", list.get(0).getName());
assertEquals("princy2", list.get(1).getName());
}
@SuppressWarnings("unchecked")
public void testRegisterCustomConverterListToListReverse() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", List.class, List.class);
final Principal princy1 = new Principal() {
public String getName() {
return "princy1";
}
};
final Principal princy2 = new Principal() {
public String getName() {
return "princy2";
}
};
List<Principal> princyList = new ArrayList<Principal>();
princyList.add(princy1);
princyList.add(princy2);
List<String> list = (List<String>) executor.execute(princyList);
assertEquals("princy1", list.get(0));
assertEquals("princy2", list.get(1));
}
public void testRegisterCustomConverterListToListBogus() {
DefaultConversionService service = new DefaultConversionService();
service.addConverter("princy", new CustomTwoWayConverter());
ConversionExecutor executor = service.getConversionExecutor("princy", List.class, List.class);
List<Integer> princyList = new ArrayList<Integer>();
princyList.add(1);
try {
executor.execute(princyList);
fail("Should have failed");
} catch (ConversionExecutionException e) {
}
}
public void testConversionPrimitive() {
DefaultConversionService service = new DefaultConversionService();
ConversionExecutor executor = service.getConversionExecutor(String.class, int.class);
Integer three = (Integer) executor.execute("3");
assertEquals(new Integer(3), three);
}
public void testArrayToArrayConversion() {
DefaultConversionService service = new DefaultConversionService();
ConversionExecutor executor = service.getConversionExecutor(String[].class, Integer[].class);
Integer[] result = (Integer[]) executor.execute(new String[] { "1", "2", "3" });
assertEquals(new Integer(1), result[0]);
assertEquals(new Integer(2), result[1]);
assertEquals(new Integer(3), result[2]);
}
public void testArrayToArrayPrimitiveConversion() {
DefaultConversionService service = new DefaultConversionService();
ConversionExecutor executor = service.getConversionExecutor(String[].class, int[].class);
int[] result = (int[]) executor.execute(new String[] { "1", "2", "3" });
assertEquals(1, result[0]);
assertEquals(2, result[1]);
assertEquals(3, result[2]);
}
@SuppressWarnings("unchecked")
public void testArrayToListConversion() {
DefaultConversionService service = new DefaultConversionService();
ConversionExecutor executor = service.getConversionExecutor(String[].class, List.class);
List<String> result = (List<String>) executor.execute(new String[] { "1", "2", "3" });
assertEquals("1", result.get(0));
assertEquals("2", result.get(1));
assertEquals("3", result.get(2));
}
public void testListToArrayConversion() {
DefaultConversionService service = new DefaultConversionService();
ConversionExecutor executor = service.getConversionExecutor(Collection.class, String[].class);
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
String[] result = (String[]) executor.execute(list);
assertEquals("1", result[0]);
assertEquals("2", result[1]);
assertEquals("3", result[2]);
}
@SuppressWarnings("unchecked")
public void testSetToListConversion() {
DefaultConversionService service = new DefaultConversionService();
ConversionExecutor executor = service.getConversionExecutor(Set.class, List.class);
Set<String> set = new LinkedHashSet<String>();
set.add("1");
set.add("2");
set.add("3");
List<String> result = (List<String>) executor.execute(set);
assertEquals("1", result.get(0));
assertEquals("2", result.get(1));
assertEquals("3", result.get(2));
}
public void testListToArrayConversionWithComponentConversion() {
try {
DefaultConversionService service = new DefaultConversionService();
service.getConversionExecutor(Collection.class, Integer[].class);
// This test case is no longer supported:
// https://jira.springframework.org/browse/SPR-7496
// List list = new ArrayList();
// list.add("1");
// list.add("2");
// list.add("3");
// Integer[] result = (Integer[]) executor.execute(list);
// assertEquals(new Integer(1), result[0]);
// assertEquals(new Integer(2), result[1]);
// assertEquals(new Integer(3), result[2]);
} catch (ConversionExecutorNotFoundException e) {
// This is expected
}
}
@SuppressWarnings("unchecked")
public void testArrayToLinkedListConversion() {
DefaultConversionService service = new DefaultConversionService();
ConversionExecutor executor = service.getConversionExecutor(String[].class, LinkedList.class);
LinkedList<String> result = (LinkedList<String>) executor.execute(new String[] { "1", "2", "3" });
assertEquals("1", result.get(0));
assertEquals("2", result.get(1));
assertEquals("3", result.get(2));
}
public void testArrayAbstractListConversion() {
DefaultConversionService service = new DefaultConversionService();
try {
service.getConversionExecutor(String[].class, AbstractList.class);
} catch (IllegalArgumentException e) {
}
}
public void testStringToArrayConversion() {
DefaultConversionService service = new DefaultConversionService();
ConversionExecutor executor = service.getConversionExecutor(String.class, String[].class);
String[] result = (String[]) executor.execute("1,2,3");
assertEquals(3, result.length);
assertEquals("1", result[0]);
assertEquals("2", result[1]);
assertEquals("3", result[2]);
}
@SuppressWarnings("unchecked")
public void testStringToListConversion() {
DefaultConversionService service = new DefaultConversionService();
ConversionExecutor executor = service.getConversionExecutor(String.class, List.class);
List<String> result = (List<String>) executor.execute("1,2,3");
assertEquals(3, result.size());
assertEquals("1", result.get(0));
assertEquals("2", result.get(1));
assertEquals("3", result.get(2));
}
public void testStringToArrayConversionWithElementConversion() {
DefaultConversionService service = new DefaultConversionService();
ConversionExecutor executor = service.getConversionExecutor(String.class, Integer[].class);
Integer[] result = (Integer[]) executor.execute("123");
assertEquals(1, result.length);
assertEquals(new Integer(123), result[0]);
}
private static class CustomConverter implements Converter {
public Object convertSourceToTargetClass(final Object source, Class<?> targetClass) throws Exception {
return new Principal() {
public String getName() {
return (String) source;
}
};
}
public Class<?> getSourceClass() {
return String.class;
}
public Class<?> getTargetClass() {
return Principal.class;
}
}
private static class CustomTwoWayConverter extends CustomConverter implements TwoWayConverter {
public Object convertTargetToSourceClass(Object target, Class<?> sourceClass) throws Exception {
return ((Principal) target).getName();
}
}
private static class Trimmer implements Converter {
public Object convertSourceToTargetClass(Object source, Class<?> targetClass) throws Exception {
return ((String) source).trim();
}
public Class<?> getSourceClass() {
return String.class;
}
public Class<?> getTargetClass() {
return String.class;
}
}
private static class PrincipalCsvStringToListConverter extends StringToObject {
public PrincipalCsvStringToListConverter() {
super(List.class);
}
protected Object toObject(String string, Class<?> targetClass) throws Exception {
List<Principal> principals = new ArrayList<Principal>();
StringTokenizer tokenizer = new StringTokenizer(string, ",");
while (tokenizer.hasMoreTokens()) {
final String name = tokenizer.nextToken();
principals.add(new Principal() {
public String getName() {
return name;
}
});
}
return principals;
}
protected String toString(Object object) throws Exception {
throw new UnsupportedOperationException("No implemented");
}
}
}