package openmods.calc;
import openmods.calc.types.multi.IConverter;
import openmods.calc.types.multi.TypeDomain;
import openmods.calc.types.multi.TypeDomain.Coercion;
import openmods.calc.types.multi.TypedValue;
import openmods.reflection.TypeVariableHolderHandler;
import org.junit.Assert;
import org.junit.Test;
public class MultiValueTest {
private static void assertValueEquals(TypedValue value, TypeDomain expectedDomain, Class<?> expectedType, Object expectedValue) {
Assert.assertEquals(expectedValue, value.value);
Assert.assertEquals(expectedType, value.type);
Assert.assertEquals(expectedDomain, value.domain);
}
static {
TypeVariableHolderHandler.initializeClass(TypeDomain.TypeVariableHolders.class);
}
@Test
public void testConversion() {
final TypeDomain domain = new TypeDomain();
domain.registerType(Integer.class);
domain.registerType(String.class);
domain.registerConverter(new IConverter<Integer, String>() {
@Override
public String convert(Integer value) {
return value.toString();
}
});
final TypedValue intValue = domain.create(Integer.class, 123);
final TypedValue stringValue = intValue.cast(String.class);
assertValueEquals(stringValue, domain, String.class, "123");
}
@Test
public void testSelfConversion() {
final TypeDomain domain = new TypeDomain();
domain.registerType(Integer.class);
final TypedValue intValue = domain.create(Integer.class, 123);
final TypedValue result = intValue.cast(Integer.class);
Assert.assertEquals(intValue, result);
}
@Test
public void testCast() {
final TypeDomain domain = new TypeDomain();
domain.registerType(Integer.class);
domain.registerType(Number.class);
domain.registerCast(Integer.class, Number.class);
final TypedValue intValue = domain.create(Integer.class, 123);
final TypedValue numberValue = intValue.cast(Number.class);
assertValueEquals(numberValue, domain, Number.class, Integer.valueOf(123));
}
@Test
public void testCoercion() {
final TypeDomain domain = new TypeDomain();
domain.registerType(Integer.class);
domain.registerType(Float.class);
domain.registerConverter(new IConverter<Integer, Float>() {
@Override
public Float convert(Integer value) {
return value.floatValue();
}
});
domain.registerSymmetricCoercionRule(Float.class, Integer.class, Coercion.TO_LEFT);
Assert.assertEquals(Coercion.TO_LEFT, domain.getCoercionRule(Float.class, Integer.class));
Assert.assertEquals(Coercion.TO_RIGHT, domain.getCoercionRule(Integer.class, Float.class));
}
@Test
public void testSelfCoercion() {
final TypeDomain domain = new TypeDomain();
Assert.assertEquals(Coercion.TO_LEFT, domain.getCoercionRule(Float.class, Float.class));
}
}