/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.graph.convert;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertTrue;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.reflect.TypeToken;
import com.opengamma.id.ExternalId;
import com.opengamma.sesame.function.FunctionMetadata;
import com.opengamma.sesame.function.ParameterType;
import com.opengamma.util.test.TestGroup;
@SuppressWarnings("unchecked")
@Test(groups = TestGroup.UNIT)
public class DefaultArgumentConverterTest {
private ArgumentConverter _converter = new DefaultArgumentConverter();
private void checkConversion(ParameterType parameterType, Object value, String sourceString, String expectedString) {
assertTrue(_converter.isConvertible(parameterType));
assertEquals(expectedString, _converter.convertToString(parameterType, value));
assertEquals(value, _converter.convertFromString(parameterType, sourceString));
}
@Test
public void convertString() {
checkConversion(ParameterType.ofType(String.class), "foo", "foo", "foo");
}
@Test
public void unknownType() {
assertFalse(_converter.isConvertible(ParameterType.ofType(FunctionMetadata.class)));
}
@Test
public void convertBoxedDouble() {
ParameterType parameterType = ParameterType.ofType(Double.class);
checkConversion(parameterType, 1.2, "1.2", "1.2");
checkConversion(parameterType, 1.2, "1.200", "1.2");
}
@Test
public void convertPrimitiveDouble() {
ParameterType parameterType = ParameterType.ofType(Double.TYPE);
checkConversion(parameterType, 1.2, "1.2", "1.2");
checkConversion(parameterType, 1.2, "1.200", "1.2");
}
@Test
public void convertListOfStrings() {
TypeToken<List<String>> typeToken = new TypeToken<List<String>>() { };
ParameterType parameterType = ParameterType.ofType(typeToken.getType());
checkConversion(parameterType, ImmutableList.of("abc", "def"), "abc def", "abc def");
checkConversion(parameterType, ImmutableList.of("abc", "def"), "abc, def", "abc def");
checkConversion(parameterType, ImmutableList.of("abc", "def"), "\"abc\", def", "abc def");
checkConversion(parameterType, ImmutableList.of("ab\"c", "def"), "\"ab\\\"c\", def", "ab\\\"c def");
}
@Test
public void convertListOfDoubles() {
TypeToken<List<Double>> typeToken = new TypeToken<List<Double>>() { };
ParameterType parameterType = ParameterType.ofType(typeToken.getType());
checkConversion(parameterType, ImmutableList.of(1.1, 1.2), "1.1, 1.2", "1.1 1.2");
checkConversion(parameterType, ImmutableList.of(1.1, 1.2), "1.1 1.2", "1.1 1.2");
checkConversion(parameterType, ImmutableList.of(1.1, 1.2), "1.10, 1.20", "1.1 1.2");
checkConversion(parameterType, ImmutableList.of(1.1, 1.2), "\"1.1\", \"1.2\"", "1.1 1.2");
}
@Test
public void cannotConvertRawList() {
TypeToken<List> typeToken = new TypeToken<List>() { };
ParameterType parameterType = ParameterType.ofType(typeToken.getType());
assertFalse(_converter.isConvertible(parameterType));
}
@Test
public void cannotConvertListOfUnknownType() {
TypeToken<List<FunctionMetadata>> typeToken = new TypeToken<List<FunctionMetadata>>() { };
ParameterType parameterType = ParameterType.ofType(typeToken.getType());
assertFalse(_converter.isConvertible(parameterType));
}
@Test
public void convertArrayOfStrings() {
ParameterType parameterType = ParameterType.ofType(String[].class);
String[] array = {"foo", "bar"};
assertTrue(_converter.isConvertible(parameterType));
assertEquals("foo bar", _converter.convertToString(parameterType, array));
assertTrue(Arrays.equals(array, (Object[]) _converter.convertFromString(parameterType, "foo bar")));
}
@Test
public void convertArrayOfBoxedDoubles() {
ParameterType parameterType = ParameterType.ofType(Double[].class);
Double[] array = {1.1, 1.2};
assertTrue(_converter.isConvertible(parameterType));
assertEquals("1.1 1.2", _converter.convertToString(parameterType, array));
assertTrue(Arrays.equals(array, (Object[]) _converter.convertFromString(parameterType, "1.1 1.2")));
assertTrue(Arrays.equals(array, (Object[]) _converter.convertFromString(parameterType, "1.1, 1.2")));
assertTrue(Arrays.equals(array, (Object[]) _converter.convertFromString(parameterType, "\"1.1\", 1.20")));
}
@Test
public void convertArrayOfPrimitiveDoubles() {
ParameterType parameterType = ParameterType.ofType(double[].class);
double[] array = {1.1, 1.2};
assertTrue(_converter.isConvertible(parameterType));
assertEquals("1.1 1.2", _converter.convertToString(parameterType, array));
assertTrue(Arrays.equals(array, (double[]) _converter.convertFromString(parameterType, "1.1 1.2")));
assertTrue(Arrays.equals(array, (double[]) _converter.convertFromString(parameterType, "1.1, 1.2")));
assertTrue(Arrays.equals(array, (double[]) _converter.convertFromString(parameterType, "\"1.1\", 1.20")));
}
@Test
public void convertEmptyList() {
TypeToken<List<String>> typeToken = new TypeToken<List<String>>() { };
ParameterType parameterType = ParameterType.ofType(typeToken.getType());
checkConversion(parameterType, Collections.emptyList(), "", "");
}
@Test
public void convertEmptyArray() {
ParameterType parameterType = ParameterType.ofType(double[].class);
double[] array = {};
assertTrue(_converter.isConvertible(parameterType));
assertEquals("", _converter.convertToString(parameterType, array));
assertTrue(Arrays.equals(array, (double[]) _converter.convertFromString(parameterType, "")));
}
@Test
public void convertMapOfStringToDouble() {
TypeToken<Map<String, Double>> typeToken = new TypeToken<Map<String, Double>>() { };
ParameterType parameterType = ParameterType.ofType(typeToken.getType());
Map<String, Double> map = ImmutableMap.of("simpleKey", 1d, "key with spaces", 2d, "key with \"quotes\"", 3d);
String str = "simpleKey 1.0 \"key with spaces\" 2.0 \"key with \\\"quotes\\\"\" 3.0";
checkConversion(parameterType, map, str, str);
}
@Test
public void convertMapOfExternalIdToDouble() {
TypeToken<Map<ExternalId, Double>> typeToken = new TypeToken<Map<ExternalId, Double>>() { };
ParameterType parameterType = ParameterType.ofType(typeToken.getType());
Map<ExternalId, Double> map = ImmutableMap.of(ExternalId.of("a", "1"), 1d, ExternalId.of("b", "2"), 2d);
String str = "a~1 1.0 b~2 2.0";
checkConversion(parameterType, map, str, str);
}
@Test
public void convertEmptyMap() {
TypeToken<Map<String, Double>> typeToken = new TypeToken<Map<String, Double>>() { };
ParameterType parameterType = ParameterType.ofType(typeToken.getType());
checkConversion(parameterType, Collections.emptyMap(), "", "");
}
}