package org.simpleflatmapper.reflect.test;
import org.junit.Test;
import org.simpleflatmapper.reflect.ReflectionService;
import org.simpleflatmapper.reflect.meta.ArrayClassMeta;
import org.simpleflatmapper.reflect.meta.ConstructorPropertyMeta;
import org.simpleflatmapper.reflect.meta.PropertyFinder;
import org.simpleflatmapper.test.beans.DbFinalObject;
import org.simpleflatmapper.reflect.meta.ClassMeta;
import org.simpleflatmapper.reflect.meta.DefaultPropertyNameMatcher;
import org.simpleflatmapper.reflect.meta.PropertyMeta;
import org.simpleflatmapper.tuple.Tuple2;
import org.simpleflatmapper.util.ConstantPredicate;
import org.simpleflatmapper.util.Predicate;
import org.simpleflatmapper.util.TypeReference;
import java.io.IOException;
import java.util.ArrayList;
import static org.junit.Assert.*;
public class ReflectionServiceTest {
private Predicate<PropertyMeta<?, ?>> isValidPropertyMeta = ConstantPredicate.<PropertyMeta<?, ?>>truePredicate();
@Test
public void testClassMetaCache() {
final ReflectionService reflectionService = ReflectionService.newInstance();
assertSame(
reflectionService.getClassMeta(new TypeReference<Tuple2<String, String>>() {}.getType()),
reflectionService.getClassMeta(new TypeReference<Tuple2<String, String>>() {}.getType())
);
assertNotSame(
reflectionService.getClassMeta(new TypeReference<Tuple2<String, String>>() {
}.getType()),
reflectionService.getClassMeta(new TypeReference<Tuple2<String, Long>>() {
}.getType())
);
}
@Test
public void testSelfReferringClass() {
final ReflectionService reflectionService = ReflectionService.newInstance();
ClassMeta<Node> cm = reflectionService.getClassMeta(Node.class);
final PropertyMeta<Node, Object> propertyMeta = cm.newPropertyFinder(isValidPropertyMeta).findProperty(DefaultPropertyNameMatcher.of("parent_parent_parent"));
assertNotNull(propertyMeta);
assertNotNull(cm);
}
@Test
public void testListSubClass() {
final ClassMeta<?> classMeta = ReflectionService.newInstance().getClassMeta(new TypeReference<StringList>() {
}.getType());
ArrayClassMeta<?, ?> acm = (ArrayClassMeta<?, ?>) classMeta;
assertEquals(String.class, acm.getElementTarget());
}
public static class StringList extends ArrayList<String> {
}
public static class Node {
public Node parent;
}
@Test
public void testGetterOnInterfaceCall() throws Exception {
IGetters value = new IGetters();
value.setId(1223);
value.setName("Rudolph");
ClassMeta<IGetters> meta = ReflectionService.newInstance().getClassMeta(IGetters.class);
assertEquals("Rudolph", meta.newPropertyFinder(isValidPropertyMeta).findProperty(DefaultPropertyNameMatcher.of("name")).getGetter().get(value));
}
@Test
public void testDisableAsmResolvedConstructorParamName() {
ClassMeta<DbFinalObject> classMeta = ReflectionService.disableAsm().getClassMeta(DbFinalObject.class);
PropertyMeta<DbFinalObject, ?> property = classMeta.newPropertyFinder(isValidPropertyMeta).findProperty(DefaultPropertyNameMatcher.of("id"));
assertTrue(property.isConstructorProperty());
}
public interface Named<T> {
T getName();
}
public static class IGetters implements Named<String> {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Test
public void testClassWithNoDebug() throws ClassNotFoundException, IOException {
final Class<?> classWithoutDebug = ReflectionInstantiatorDefinitionFactoryTest.CLASS_LOADER.loadClass("p.ClassNoDebug");
ClassMeta<?> classMeta = ReflectionService.newInstance().getClassMeta(classWithoutDebug);
PropertyFinder<?> propertyFinder = classMeta.newPropertyFinder(isValidPropertyMeta);
PropertyMeta<?, ?> name = propertyFinder.findProperty(DefaultPropertyNameMatcher.of("name"));
PropertyMeta<?, ?> value = propertyFinder.findProperty(DefaultPropertyNameMatcher.of("value"));
PropertyMeta<?, ?> arg0 = propertyFinder.findProperty(DefaultPropertyNameMatcher.of("arg0"));
PropertyMeta<?, ?> arg1 = propertyFinder.findProperty(DefaultPropertyNameMatcher.of("arg1"));
assertNull(arg0);
assertNull(arg1);
assertTrue(name instanceof ConstructorPropertyMeta);
assertEquals(0, ((ConstructorPropertyMeta)name).getParameter().getIndex());
assertEquals(String.class, ((ConstructorPropertyMeta)name).getParameter().getType());
assertNull(((ConstructorPropertyMeta)name).getParameter().getName());
assertTrue(value instanceof ConstructorPropertyMeta);
assertEquals(1, ((ConstructorPropertyMeta)value).getParameter().getIndex());
assertEquals(int.class, ((ConstructorPropertyMeta)value).getParameter().getType());
assertNull(((ConstructorPropertyMeta)value).getParameter().getName());
}
}