package org.simpleflatmapper.reflect.test;
import org.junit.Test;
import org.simpleflatmapper.reflect.*;
import org.simpleflatmapper.reflect.asm.AsmFactory;
import org.simpleflatmapper.reflect.instantiator.ExecutableInstantiatorDefinition;
import org.simpleflatmapper.test.beans.DbFinalPrimitiveObject;
import org.simpleflatmapper.reflect.asm.AsmInstantiatorDefinitionFactory;
import java.util.HashMap;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class InstantiatorFactoryTest {
public static final InstantiatorFactory DISABLE_ASM = new InstantiatorFactory(null);
public static final InstantiatorFactory ASM = new InstantiatorFactory(new AsmFactory(BiInstantiatorFactoryTest.class.getClassLoader()), true);
public static class MyClassWithFactoryMethod {
private MyClassWithFactoryMethod(){
}
public static MyClassWithFactoryMethod valueOf(String val) {
return new MyClassWithFactoryMethod();
}
}
public static class MyClassWithFactoryMethodPrimitiveType {
private MyClassWithFactoryMethodPrimitiveType(){
}
public static MyClassWithFactoryMethodPrimitiveType valueOf(long val) {
return new MyClassWithFactoryMethodPrimitiveType();
}
}
public static class MyClassWithEmptyFactoryMethod {
private MyClassWithEmptyFactoryMethod(){
}
public static MyClassWithEmptyFactoryMethod valueOf() {
return new MyClassWithEmptyFactoryMethod();
}
}
public static class MyClassWithFactoryMethodAndConstructor {
public MyClassWithFactoryMethodAndConstructor(String v1, String v2){
}
public static MyClassWithFactoryMethodAndConstructor valueOf(String val) {
throw new UnsupportedOperationException();
}
}
@Test
public void testInstantiateConstructorWithArgsAllPr() throws Exception {
Instantiator<Object, DbFinalPrimitiveObject> instantiator =
DISABLE_ASM.getInstantiator(DbFinalPrimitiveObject.class, Object.class,
AsmInstantiatorDefinitionFactory.extractDefinitions(DbFinalPrimitiveObject.class),
new HashMap<Parameter, Getter<? super Object, ?>>(), true);
DbFinalPrimitiveObject object = instantiator.newInstance(null);
assertNotNull(object);
}
@Test
public void testInstantiateConstructorWithArgsAllPrAsm() throws Exception {
Instantiator<Object, DbFinalPrimitiveObject> instantiator =
ASM.getInstantiator(DbFinalPrimitiveObject.class,
Object.class,
AsmInstantiatorDefinitionFactory.extractDefinitions(DbFinalPrimitiveObject.class),
new HashMap<Parameter, Getter<? super Object, ?>>(), true);
DbFinalPrimitiveObject object = instantiator.newInstance(null);
assertNotNull(object);
}
@Test
public void testInstantiateConstructorWithFactoryMethodWithPrimitiveAsm() throws Exception {
Instantiator<Long, MyClassWithFactoryMethodPrimitiveType> instantiator =
ASM.getInstantiator(MyClassWithFactoryMethodPrimitiveType.class,
long.class,
AsmInstantiatorDefinitionFactory.extractDefinitions(MyClassWithFactoryMethodPrimitiveType.class),
new HashMap<Parameter, Getter<? super Long, ?>>(), true);
MyClassWithFactoryMethodPrimitiveType object = instantiator.newInstance(1l);
assertNotNull(object);
}
@Test
public void testInstantiateWithFactoryMethod() throws Exception {
final Instantiator<Object, MyClassWithFactoryMethod> instantiator = ASM.getInstantiator(MyClassWithFactoryMethod.class, Object.class, ReflectionService.newInstance().extractInstantiator(MyClassWithFactoryMethod.class), new HashMap<Parameter, Getter<? super Object, ?>>(), true);
assertTrue(instantiator.getClass().getSimpleName().startsWith("Asm"));
final MyClassWithFactoryMethod object = instantiator.newInstance(null);
assertNotNull(object);
}
@Test
public void testInstantiateWithFactoryMethodNoAsm() throws Exception {
final Instantiator<Object, MyClassWithFactoryMethod> instantiator = DISABLE_ASM.getInstantiator(MyClassWithFactoryMethod.class, Object.class, ReflectionService.disableAsm().extractInstantiator(MyClassWithFactoryMethod.class), new HashMap<Parameter, Getter<? super Object, ?>>(), true);
assertFalse(instantiator.getClass().getSimpleName().startsWith("Asm"));
final MyClassWithFactoryMethod object = instantiator.newInstance(null);
assertNotNull(object);
}
@Test
public void testInstantiateWithEmptyFactoryMethodNoAsm() throws Exception {
final Instantiator<Object, MyClassWithEmptyFactoryMethod> instantiator = DISABLE_ASM.getInstantiator(MyClassWithEmptyFactoryMethod.class, Object.class, ReflectionService.disableAsm().extractInstantiator(MyClassWithEmptyFactoryMethod.class), new HashMap<Parameter, Getter<? super Object, ?>>(), true);
assertFalse(instantiator.getClass().getSimpleName().startsWith("Asm"));
final MyClassWithEmptyFactoryMethod object = instantiator.newInstance(null);
assertNotNull(object);
}
@Test
public void testInstantiateCheckTakeConstructorFirst() throws Exception {
final Instantiator<Object, MyClassWithFactoryMethodAndConstructor> instantiator =
ASM.getInstantiator(MyClassWithFactoryMethodAndConstructor.class, Object.class, ReflectionService.newInstance().extractInstantiator(MyClassWithFactoryMethodAndConstructor.class), new HashMap<Parameter, Getter<? super Object, ?>>(), true);
final MyClassWithFactoryMethodAndConstructor object = instantiator.newInstance(null);
assertNotNull(object);
}
@Test
public void testOneArgInstantiator() throws Exception {
InstantiatorDefinition def = new ExecutableInstantiatorDefinition(String.class.getDeclaredMethod("valueOf", Object.class),
new Parameter[] {new Parameter(0, "value", Object.class)});
assertNotNull(def.toString());
Instantiator<Object, String> instantiator = DISABLE_ASM.getOneArgIdentityInstantiator(def);
assertEquals("12345", instantiator.newInstance(12345));
Instantiator<Object, String> instantiatorAsm = ASM.getOneArgIdentityInstantiator(def);
assertEquals("12345", instantiatorAsm.newInstance(12345));
}
@Test
public void testArrayInstantiator() throws Exception {
assertArrayEquals(new int[3], DISABLE_ASM.<Object, int[]>getArrayInstantiator(int.class, 3).newInstance(null));
assertArrayEquals(new int[3], ASM.<Object, int[]>getArrayInstantiator(int.class, 3).newInstance(null));
assertArrayEquals(new String[3], DISABLE_ASM.<Object, String[]>getArrayInstantiator(String.class, 3).newInstance(null));
assertArrayEquals(new String[3], ASM.<Object, String[]>getArrayInstantiator(String.class, 3).newInstance(null));
}
}