package org.javersion.reflect;
import static org.assertj.core.api.Assertions.assertThat;
import static org.javersion.reflect.TypeDescriptors.DEFAULT;
import java.util.Map;
import org.junit.Test;
import com.google.common.collect.ImmutableSet;
public class BeanPropertyTest {
static class MyBean {
private String name;
@SuppressWarnings("unused")
private boolean readOnly;
@SuppressWarnings("unused")
private String writeOnly;
@SuppressWarnings("unused")
public boolean isReadOnly() {
return readOnly;
}
@SuppressWarnings("unused")
public void setWriteOnly(String writeOnly) {
this.writeOnly = writeOnly;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
static class MyGenericBean<T> {
private T it;
public T getIt() {
return it;
}
public void setIt(T it) {
this.it = it;
}
}
private MyGenericBean<Integer> myGenericBean;
@Test
public void introspection() {
Map<String, BeanProperty> properties = getProperties();
assertThat(properties.keySet()).isEqualTo(ImmutableSet.of("name", "readOnly", "writeOnly"));
}
@Test
public void readable_writable() {
Map<String, BeanProperty> properties = getProperties();
BeanProperty property = properties.get("name");
assertThat(property.isReadable()).isTrue();
assertThat(property.isWritable()).isTrue();
property = properties.get("readOnly");
assertThat(property.isReadable()).isTrue();
assertThat(property.isWritable()).isFalse();
property = properties.get("writeOnly");
assertThat(property.isReadable()).isFalse();
assertThat(property.isWritable()).isTrue();
}
@Test
public void readable_from() {
TypeDescriptor type = getTypeDescriptor();
Map<String, BeanProperty> properties = getProperties();
BeanProperty property = properties.get("name");
assertThat(property.isReadableFrom(type)).isTrue();
assertThat(property.isReadableFrom(DEFAULT.get(MethodDescriptorTest.class))).isFalse();
}
@Test
public void writable_from() {
TypeDescriptor type = getTypeDescriptor();
Map<String, BeanProperty> properties = getProperties();
BeanProperty property = properties.get("name");
assertThat(property.isWritableFrom(type)).isTrue();
assertThat(property.isWritableFrom(DEFAULT.get(MethodDescriptorTest.class))).isFalse();
}
@Test
public void property_type() {
BeanProperty property = getProperties().get("name");
TypeDescriptor type = property.getType();
assertThat(type.getRawType()).isEqualTo(String.class);
property = getProperties().get("writeOnly");
type = property.getType();
assertThat(type.getRawType()).isEqualTo(String.class);
}
@Test
public void declaring_type() {
BeanProperty property = getProperties().get("name");
TypeDescriptor type = property.getDeclaringType();
assertThat(type.getRawType()).isEqualTo(MyBean.class);
property = getProperties().get("writeOnly");
type = property.getDeclaringType();
assertThat(type.getRawType()).isEqualTo(MyBean.class);
}
@Test(expected = IllegalArgumentException.class)
public void create_without_methods_is_not_allowed() {
new BeanProperty("test", null, null);
}
@Test
public void set_and_get() {
BeanProperty property = getProperties().get("name");
MyBean bean = new MyBean();
property.set(bean, "MyBean");
assertThat(bean.name).isEqualTo("MyBean");
assertThat(property.get(bean)).isEqualTo("MyBean");
}
@Test
public void getMethods() {
TypeDescriptor type = getTypeDescriptor();
Map<MethodSignature, MethodDescriptor> methods = type.getMethods();
MethodDescriptor readMethod = methods.get(new MethodSignature("getName"));
MethodDescriptor writeMethod = methods.get(new MethodSignature("setName", String.class));
BeanProperty property = new BeanProperty("name", readMethod, writeMethod);
assertThat(property.getReadMethod()).isSameAs(readMethod);
assertThat(property.getWriteMethod()).isSameAs(writeMethod);
}
@Test
public void generics() {
FieldDescriptor genericField = DEFAULT.get(BeanPropertyTest.class).getField("myGenericBean");
TypeDescriptor type = genericField.getType();
BeanProperty property = type.getProperties().get("it");
assertThat(property.getType().getRawType()).isEqualTo(Integer.class);
}
private Map<String, BeanProperty> getProperties() {
TypeDescriptor type = getTypeDescriptor();
return type.getProperties();
}
private TypeDescriptor getTypeDescriptor() {
return DEFAULT.get(MyBean.class);
}
}