/* * Copyright 2013 Samppa Saarela * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.javersion.reflect; import static org.assertj.core.api.Assertions.assertThat; import static org.javersion.reflect.TypeDescriptorTest.STATIC_FIELDS; import static org.javersion.reflect.TypeDescriptorTest.TYPES; import static org.javersion.reflect.TypeDescriptors.DEFAULT; import java.lang.reflect.Field; import java.util.Map; import org.junit.Test; import nl.jqno.equalsverifier.EqualsVerifier; public class FieldDescriptorTest { private static String staticField; @SuppressWarnings("unused") private String privateField; @SuppressWarnings("unused") private transient String transientField; @Deprecated @SuppressWarnings("unused") private String deprecatedField; private static TypeDescriptor type = TYPES.get(FieldDescriptorTest.class); @Test public void Get_Success() { FieldDescriptor fieldDescriptor = getTYPESDescriptor(); assertThat((TypeDescriptors) fieldDescriptor.getStatic()).isSameAs(TYPES); } @Test(expected=ReflectionException.class) public void Set_Final_Value() { getTYPESDescriptor().setStatic(null); } private FieldDescriptor getTYPESDescriptor() { FieldDescriptor fieldDescriptor = STATIC_FIELDS.get(TypeDescriptorTest.class).getField("TYPES"); return fieldDescriptor; } @Test public void set_value() { FieldDescriptor fieldDescriptor = type.getField("privateField"); fieldDescriptor.set(this, "Magic!"); assertThat(privateField).isEqualTo("Magic!"); } @Test(expected = IllegalArgumentException.class) public void get_value_from_wrong_type() { FieldDescriptor fieldDescriptor = type.getField("privateField"); fieldDescriptor.get(new Object()); } @Test public void basic_private_field() { FieldDescriptor fieldDescriptor = type.getField("privateField"); assertThat(fieldDescriptor.getName()).isEqualTo("privateField"); assertThat(fieldDescriptor.getType().getRawType()).isEqualTo(String.class); assertThat(fieldDescriptor.getAnnotations()).isEmpty(); assertThat(fieldDescriptor.isTransient()).isFalse(); assertThat(fieldDescriptor.isStatic()).isFalse(); } @Test public void element_is_field() { FieldDescriptor fieldDescriptor = type.getField("privateField"); assertThat(fieldDescriptor.getElement()).isSameAs(fieldDescriptor.getElement()); } @Test public void wraps_java_reflect_Field() throws NoSuchFieldException { Field field = FieldDescriptorTest.class.getDeclaredField("privateField"); FieldDescriptor fieldDescriptor = type.getField("privateField"); assertThat(fieldDescriptor.getElement()).isEqualTo(field); assertThat(fieldDescriptor.toString()) .isEqualTo("org.javersion.reflect.FieldDescriptorTest.privateField"); } @Test public void applies() { FieldDescriptor fieldDescriptor = type.getField("privateField"); assertThat(fieldDescriptor.isReadable()).isTrue(); assertThat(fieldDescriptor.isWritable()).isTrue(); assertThat(fieldDescriptor.isReadableFrom(type)).isTrue(); assertThat(fieldDescriptor.isWritableFrom(type)).isTrue(); assertThat(fieldDescriptor.isReadableFrom(DEFAULT.get(MethodDescriptorTest.class))).isFalse(); assertThat(fieldDescriptor.isWritableFrom(DEFAULT.get(MethodDescriptorTest.class))).isFalse(); } @Test(expected = ReflectionException.class) public void illegal_access() { FieldDescriptor fieldDescriptor = type.getField("privateField"); try { fieldDescriptor.getElement().setAccessible(false); fieldDescriptor.get(this); } finally { fieldDescriptor.getElement().setAccessible(true); } } @Test public void field_descriptor_from_another_TypeDescriptors_is_not_equal() { FieldDescriptor fieldDescriptor = type.getField("privateField"); FieldDescriptor other = new TypeDescriptors().get(FieldDescriptorTest.class).getField("privateField"); assertThat(fieldDescriptor.equals(other)).isFalse(); } @Test public void identity() { Map<String, FieldDescriptor> fields = type.getFields(); EqualsVerifier.forClass(FieldDescriptor.class) .withPrefabValues(Field.class, fields.get("privateField").getElement(), fields.get("transientField").getElement()) .verify(); } @Test public void transient_field() { FieldDescriptor fieldDescriptor = type.getField("transientField"); assertThat(fieldDescriptor.isTransient()).isTrue(); } @Test public void set_static_field() { staticField = null; FieldDescriptor fieldDescriptor = STATIC_FIELDS.get(FieldDescriptorTest.class).getField("staticField"); fieldDescriptor.setStatic("static"); assertThat(staticField).isEqualTo("static"); } @Test public void inspect_annotations() { FieldDescriptor field = type.getField("deprecatedField"); assertThat(field.getAnnotation(Deprecated.class)).isNotNull(); assertThat(field.hasAnnotation(Deprecated.class)).isTrue(); assertThat(field.getAnnotation(SuppressWarnings.class)).isNull(); assertThat(field.hasAnnotation(SuppressWarnings.class)).isFalse(); assertThat(field.getAnnotations()).hasSize(1); } }