content: package com.alibaba.json.bvt.util;
  
  import java.lang.reflect.Field;
  import java.lang.reflect.Method;
  import java.lang.reflect.Type;
  import java.util.List;
  
  import org.junit.Assert;
  
  import com.alibaba.fastjson.util.FieldInfo;
  import com.alibaba.fastjson.util.ParameterizedTypeImpl;
  
  import junit.framework.TestCase;
  
  public class FieldInfoTest extends TestCase {
      public void test_null() throws Exception {
          FieldInfo fieldInfo = new FieldInfo("getValue", Entity.class.getMethod("getValue"), null, null, null, 0, 0, 0, null, null, null);
          Assert.assertEquals(null, fieldInfo.getAnnotation());
  
          Field field = GenericFieldEntity.class.getField("value");
          Type type = new ParameterizedTypeImpl(new Type[] { ValueObject.class }, null, GenericFieldEntity.class);
          FieldInfo fieldInfoOfField = new FieldInfo("value", null, field, GenericFieldEntity.class, type, 0, 0, 0, null, null, null);
          Assert.assertEquals(fieldInfoOfField.fieldType, ValueObject.class);
          Assert.assertEquals(fieldInfoOfField.fieldClass, ValueObject.class);
  
          field = GenericListFieldEntity.class.getField("value");
          type = new ParameterizedTypeImpl(new Type[] { ValueObject.class }, null, GenericListFieldEntity.class);
          FieldInfo fieldInfoOfListField = new FieldInfo("value", null, field, GenericListFieldEntity.class, type, 0, 0, 0, null, null, null);
          ParameterizedTypeImpl actualFieldType = (ParameterizedTypeImpl) fieldInfoOfListField.fieldType;
          Assert.assertEquals(actualFieldType.getActualTypeArguments()[0], ValueObject.class);
          Assert.assertEquals(actualFieldType.getRawType(), List.class);
          Assert.assertEquals(fieldInfoOfListField.fieldClass, List.class);
          Assert.assertEquals(null, ((ParameterizedTypeImpl) type).getOwnerType());
  
          Method method = GenericSetterEntity.class.getMethod("setValue", Object.class);
          type = new ParameterizedTypeImpl(new Type[] { ValueObject.class }, null, GenericSetterEntity.class);
          FieldInfo fieldInfoOfSetter = new FieldInfo("value", method, null, GenericSetterEntity.class, type, 0, 0, 0, null, null, null);
          Assert.assertEquals(fieldInfoOfSetter.fieldType, ValueObject.class);
          Assert.assertEquals(fieldInfoOfSetter.fieldClass, ValueObject.class);
          
          fieldInfoOfSetter.toString();
  
          method = GenericListSetterEntity.class.getMethod("setValue", List.class);
          type = new ParameterizedTypeImpl(new Type[] { ValueObject.class }, null, GenericListSetterEntity.class);
          FieldInfo fieldInfoOfListSetter = new FieldInfo("value", method, null, GenericListSetterEntity.class, type, 0, 0, 0, null, null, null);
          Assert.assertEquals(actualFieldType.getActualTypeArguments()[0], ValueObject.class);
          Assert.assertEquals(actualFieldType.getRawType(), List.class);
          Assert.assertEquals(fieldInfoOfListSetter.fieldClass, List.class);
      }
  
      public static class Entity {
          private int value;
  
          public int getValue() {
              return value;
          }
  
          public void setValue(int value) {
              this.value = value;
          }
      }
  
      public static class GenericSetterEntity<T> {
          private T value;
  
          public T getValue() {
              return value;
          }
  
          public void setValue(T value) {
              this.value = value;
          }
      }
  
      public static class GenericListSetterEntity<T> {
          private List<T> value;
  
          public List<T> getValue() {
              return value;
          }
  
          public void setValue(List<T> value) {
              this.value = value;
          }
      }
  
      public static class GenericFieldEntity<T> {
          public T value;
      }
  
      public static class GenericListFieldEntity<T> {
          public List<T> value;
      }
  
      public static class ValueObject {
          private String name;
          private int    id;
  
          public String getName() {
              return name;
          }
  
          public void setName(String name) {
              this.name = name;
          }
  
          public int getId() {
              return id;
          }
  
          public void setId(int id) {
              this.id = id;
          }
      }
  }
  