package org.simpleflatmapper.datastax.test;
import com.datastax.driver.core.DataType;
import com.datastax.driver.core.GettableByIndexData;
import com.datastax.driver.core.SettableByIndexData;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.simpleflatmapper.converter.Converter;
import org.simpleflatmapper.datastax.DataTypeHelper;
import org.simpleflatmapper.datastax.DatastaxCrud;
import org.simpleflatmapper.datastax.test.utils.RecorderInvocationHandler;
import org.simpleflatmapper.map.Mapper;
import org.simpleflatmapper.reflect.Getter;
import org.simpleflatmapper.reflect.ReflectionService;
import org.simpleflatmapper.reflect.Setter;
import org.simpleflatmapper.test.junit.LibrarySets;
import org.simpleflatmapper.test.junit.MultiClassLoaderJunitRunner;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@RunWith(MultiClassLoaderJunitRunner.class)
@LibrarySets(
librarySets = {
"http://repo1.maven.org/maven2/com/datastax/cassandra/cassandra-driver-core/3.0.3/cassandra-driver-core-3.0.3.jar"
},
includes={Converter.class, ReflectionService.class, Mapper.class, DatastaxCrud.class, DatastaxCrudTest.class},
excludes = { "org.junit", "io.netty"},
names={"v303"}
)
public class Datastax3 {
private Class<?> localDateClass;
@Before
public void setUp() throws IOException, ClassNotFoundException {
localDateClass = getClass().getClassLoader().loadClass("com.datastax.driver.core.LocalDate");
}
@Test
public void testDataTypeHelperLocalDateClassSet() throws NoSuchFieldException, IllegalAccessException {
assertNotNull(DataTypeHelper.localDateClass);
assertEquals(this.localDateClass, localDateClass);
}
@Test
public void testDatastax3NewDataTypeAsJavaClass() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
assertDataTypeNameIsMapToExpectedType(Long.class, "TIME");
assertDataTypeNameIsMapToExpectedType(Short.class, "SMALLINT");
assertDataTypeNameIsMapToExpectedType(Byte.class, "TINYINT");
assertDataTypeNameIsMapToExpectedType(localDateClass, "DATE");
}
@Test
public void testDataTypeHelperIsNumberOnDatastax3ExtraType() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
assertDataTypeNameIsNumber(true, "TIME");
assertDataTypeNameIsNumber(true, "SMALLINT");
assertDataTypeNameIsNumber(true, "TINYINT");
assertDataTypeNameIsNumber(false, "DATE");
}
@Test
public void testLocalDateGetter() throws Exception {
Getter<GettableByIndexData, ?> getter = DataTypeTest.getGetter(localDateClass, (DataType) DataType.class.getMethod("date").invoke(null));
RecorderInvocationHandler recorder = new RecorderInvocationHandler();
GettableByIndexData gettableByDataInstance = (GettableByIndexData) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] { GettableByIndexData.class }, recorder);
getter.get(gettableByDataInstance);
recorder.invokedOnce("getDate", 1);
}
@SuppressWarnings("unchecked")
@Test
public void testLocalDateSetter() throws Exception {
Setter<SettableByIndexData, Object> setter = DataTypeTest.getSetter((Class<Object>)localDateClass, (DataType) DataType.class.getMethod("date").invoke(null));
RecorderInvocationHandler recorder = new RecorderInvocationHandler();
SettableByIndexData settableByDataInstance = (SettableByIndexData) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] { SettableByIndexData.class }, recorder);
Object localDateInstance = localDateClass.getDeclaredMethod("fromMillisSinceEpoch", long.class).invoke(null, System.currentTimeMillis());
setter.set(settableByDataInstance, localDateInstance);
recorder.invokedOnce("setDate", 1, localDateInstance);
recorder.reset();
setter.set(settableByDataInstance, null);
recorder.invokedOnce("setToNull", 1);
}
private void assertDataTypeNameIsNumber(boolean expected, String name) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
assertEquals(expected, DataTypeHelper.isNumber(DataType.Name.valueOf(name)));
}
private void assertDataTypeNameIsMapToExpectedType(Class<?> expectedType, String name) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
assertEquals(expectedType, DataTypeHelper.asJavaClass(DataType.Name.valueOf(name)));
}
}