package com.klarna.hiverunner.data;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.binaryTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.booleanTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.byteTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.charTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.dateTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.decimalTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.doubleTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.floatTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.intTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.longTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.shortTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.stringTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.timestampTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.unknownTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.varcharTypeInfo;
import static org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.voidTypeInfo;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.sql.Date;
import java.sql.Timestamp;
import org.apache.commons.beanutils.ConversionException;
import org.apache.hadoop.hive.common.type.HiveChar;
import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.common.type.HiveVarchar;
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
import org.junit.Test;
public class ConvertersTest {
@Test
public void inputNull() {
for (PrimitiveTypeInfo typeInfo : Converters.TYPES.keySet()) {
assertNull(Converters.convert(null, typeInfo));
}
}
@Test
public void inputNotString() {
for (PrimitiveTypeInfo typeInfo : Converters.TYPES.keySet()) {
assertEquals(0, Converters.convert(0, typeInfo));
}
}
@Test
public void stringTypeInfo() {
assertEquals("foo", Converters.convert("foo", stringTypeInfo));
}
@Test
public void booleanTypeInfo() {
assertConversionException("foo", booleanTypeInfo);
assertEquals(true, Converters.convert("true", booleanTypeInfo));
assertEquals(false, Converters.convert("false", booleanTypeInfo));
}
@Test
public void byteTypeInfo() {
assertConversionException("foo", byteTypeInfo);
assertConversionException("-129", byteTypeInfo);
assertEquals((byte) -128, Converters.convert("-128", byteTypeInfo));
assertEquals((byte) 127, Converters.convert("127", byteTypeInfo));
assertConversionException("128", byteTypeInfo);
}
@Test
public void shortTypeInfo() {
assertConversionException("foo", shortTypeInfo);
assertConversionException("-32769", shortTypeInfo);
assertEquals((short) -32768, Converters.convert("-32768", shortTypeInfo));
assertEquals((short) 32767, Converters.convert("32767", shortTypeInfo));
assertConversionException("32768", shortTypeInfo);
}
@Test
public void intTypeInfo() {
assertConversionException("foo", intTypeInfo);
assertConversionException("-2147483649", intTypeInfo);
assertEquals(-2147483648, Converters.convert("-2147483648", intTypeInfo));
assertEquals(2147483647, Converters.convert("2147483647", intTypeInfo));
assertConversionException("2147483648", intTypeInfo);
}
@Test
public void longTypeInfo() {
assertConversionException("foo", longTypeInfo);
assertConversionException("-9223372036854775809", longTypeInfo);
assertEquals(-9223372036854775808L, Converters.convert("-9223372036854775808", longTypeInfo));
assertEquals(9223372036854775807L, Converters.convert("9223372036854775807", longTypeInfo));
assertConversionException("9223372036854775808", longTypeInfo);
}
@Test
public void floatTypeInfo() {
assertConversionException("foo", floatTypeInfo);
assertEquals(0F, Converters.convert("0", floatTypeInfo));
}
@Test
public void doubleTypeInfo() {
assertConversionException("foo", doubleTypeInfo);
assertEquals(0D, Converters.convert("0", doubleTypeInfo));
}
@Test
public void dateTypeInfo() {
assertConversionException("foo", dateTypeInfo);
assertEquals(Date.valueOf("2015-10-15"), Converters.convert("2015-10-15", dateTypeInfo));
}
@Test
public void timestampTypeInfo() {
assertConversionException("foo", timestampTypeInfo);
assertEquals(Timestamp.valueOf("2015-10-15 23:59:59.999"),
Converters.convert("2015-10-15 23:59:59.999", timestampTypeInfo));
}
@Test
public void binaryTypeInfo() {
assertConversionException("foo", binaryTypeInfo);
assertArrayEquals(new byte[] { 0, 1, 2 }, (byte[]) Converters.convert("0,1,2", binaryTypeInfo));
}
@Test
public void otherTypeInfo() {
assertEquals(HiveDecimal.create("1.234"), Converters.convert("1.234", decimalTypeInfo));
assertEquals(new HiveChar("foo", -1), Converters.convert("foo", charTypeInfo));
assertTrue(new HiveVarchar("foo", -1).equals((HiveVarchar) Converters.convert("foo", varcharTypeInfo)));
assertEquals("foo", Converters.convert("foo", unknownTypeInfo));
assertEquals("foo", Converters.convert("foo", voidTypeInfo));
}
private void assertConversionException(Object value, PrimitiveTypeInfo typeInfo) {
try {
System.out.println(Converters.convert(value, typeInfo));
} catch (ConversionException e) {
return;
}
fail("Expected " + ConversionException.class.getSimpleName() + " for value " + value + " ("
+ value.getClass().getSimpleName() + ") to " + typeInfo.getTypeName());
}
}