package org.simpleflatmapper.jdbc.test;
import org.junit.Test;
import org.simpleflatmapper.jdbc.impl.JpaAliasProvider;
import org.simpleflatmapper.jdbc.impl.JpaAliasProviderFactory;
import org.simpleflatmapper.reflect.getter.ConstantBooleanGetter;
import org.simpleflatmapper.reflect.meta.AliasProviderService;
import org.simpleflatmapper.reflect.meta.DefaultAliasProvider;
import org.simpleflatmapper.util.Consumer;
import org.simpleflatmapper.util.ListCollector;
import javax.persistence.Column;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
public class AliasProviderTest {
public class TestClass {
@Column(name = "bar1")
public String foo;
@Column(name = "bar2")
public String getFoo() {
return null;
}
}
@Test
public void testJPAAliasProvider() throws NoSuchFieldException, NoSuchMethodException {
JpaAliasProvider p = new JpaAliasProvider();
assertEquals("bar1", p.getAliasForField(TestClass.class.getField("foo")));
assertEquals("bar2", p.getAliasForMethod(TestClass.class.getMethod("getFoo")));
}
@Test
public void testFactoryJPAPresent() {
assertEquals(JpaAliasProvider.class, AliasProviderService.getAliasProvider().getClass());
}
@Test
public void testFactoryJPANotPresent() throws Exception {
final ClassLoader original = Thread.currentThread().getContextClassLoader();
ClassLoader cl = new ClassLoader(ClassLoader.getSystemClassLoader().getParent()) {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
if (!name.startsWith("javax.persistence")) {
InputStream resourceAsStream = original.getResourceAsStream(name.replace(".", "/") + ".class");
if (resourceAsStream == null) {
throw new ClassNotFoundException(name);
}
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
int i;
while((i = resourceAsStream.read()) != -1) {
bos.write(i);
}
byte[] bytes = bos.toByteArray();
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
throw new ClassNotFoundException(e.getMessage(), e);
} finally {
try {
resourceAsStream.close();
} catch (IOException e) {
}
}
} else {
throw new ClassNotFoundException(name);
}
}
};
Thread.currentThread().setContextClassLoader(cl);
try {
Class<?> jpa = cl.loadClass(JpaAliasProviderFactory.class.getName());
Class<?> consumerClass = cl.loadClass(Consumer.class.getName());
Object consumer = cl.loadClass(ListCollector.class.getName()).newInstance();
jpa.getMethod("produce", consumerClass).invoke(jpa.getConstructor().newInstance(), consumer);
List<String> list = (List<String>) consumer.getClass().getMethod("getList").invoke(consumer);
assertTrue(list.isEmpty());
} finally {
Thread.currentThread().setContextClassLoader(original);
}
}
}