/** * This Source Code Form is subject to the terms of the Mozilla Public License, * v. 2.0. If a copy of the MPL was not distributed with this file, You can * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. * * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS * graphic logo is a trademark of OpenMRS Inc. */ package org.openmrs.util; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.openmrs.BaseOpenmrsObject; import org.openmrs.OpenmrsObject; import org.openmrs.Visit; import org.springframework.util.ReflectionUtils; /** * Tests the {@link Reflect} class. */ public class ReflectTest { /** * @see Reflect#hasField(Field) */ @Test public void xhasField_shouldReturnTrueIfGivenFieldIsDeclaredInParameterizedClassOrSubClass() { Reflect reflect = new Reflect(OpenmrsObject.class); List<Field> allFields = Reflect.getAllFields(OpenmrsObjectImp.class); Field genericCollectionField = findFieldByName(allFields, "genericCollectionField"); Assert.assertTrue(reflect.hasField(genericCollectionField)); } /** * @see Reflect#hasField(Field) */ @Test public void xhasField_shouldReturnFalseIfGivenFieldIsNotDeclaredInParameterizedClassOrItsSubClass() { Reflect reflect = new Reflect(OpenmrsObject.class); List<Field> allFields = Reflect.getAllFields(OpenmrsObjectImp.class); Field normalClassField = findFieldByName(allFields, "normalClassField"); Assert.assertFalse(reflect.hasField(normalClassField)); } private Field findFieldByName(List<Field> fields, String name) { for (Field field : fields) { if (name.equals(field.getName())) { return field; } } throw new IllegalArgumentException("Field not found!"); } /** * @see Reflect#getAllFields(Class<*>) */ @Test public void getAllFields_shouldReturnAllFieldsIncludePrivateAndSuperClasses() { List<Field> allFields = Reflect.getAllFields(OpenmrsObjectImp.class); findFieldByName(allFields, "subClassField"); findFieldByName(allFields, "normalClassField"); findFieldByName(allFields, "nonCollectionField"); findFieldByName(allFields, "genericCollectionField"); } /** * @see Reflect#isCollection(Class<*>) */ @Test public void isCollection_shouldReturnFalseIfGivenFieldClassIsNotACollectionClass() { Reflect reflect = new Reflect(OpenmrsObject.class); List<Field> allFields = Reflect.getAllFields(OpenmrsObjectImp.class); Field nonCollectionField = findFieldByName(allFields, "nonCollectionField"); Assert.assertFalse(reflect.isCollectionField(nonCollectionField)); } /** * @see Reflect#isCollection(Class<*>) */ @Test public void isCollection_shouldReturnTrueIfGivenFieldClassIsCollectionClass() { Assert.assertTrue(Reflect.isCollection(ArrayList.class)); } /** * @see Reflect#isCollection(Object) */ @Test public void isCollection_shouldReturnFalseIfGivenObjectIsNotACollection() { Assert.assertFalse(Reflect.isCollection(new NormalClass())); } /** * @see Reflect#isCollection(Object) */ @Test public void isCollection_shouldReturnTrueIfGivenObjectIsCollectionClass() { Assert.assertTrue(Reflect.isCollection(new ArrayList<>())); } /** * @see Reflect#Reflect(Class) */ @Test(expected = NullPointerException.class) public void Reflect_shouldThrowExceptionWhenNullIsPassed() { new Reflect(null); } /** * @see Reflect#getInheritedFields(Class) */ @Test public void getInheritedFields_shouldReturnOnlyTheSubClassFieldsOfGivenParameterizedClass() { Reflect reflect = new Reflect(OpenmrsObject.class); List<Field> fields = reflect.getInheritedFields(OpenmrsObjectImp.class); List<Field> allFields = Reflect.getAllFields(OpenmrsObjectImp.class); findFieldByName(fields, "subClassField"); findFieldByName(fields, "nonCollectionField"); findFieldByName(fields, "genericCollectionField"); Field normalClassField = findFieldByName(allFields, "normalClassField"); Assert.assertFalse(fields.contains(normalClassField)); } /** * @see Reflect#isCollectionField(Field) */ @Test public void isCollectionField_shouldReturnTrueIfGivenFieldIsCollectionAndItsElementTypeIsGivenParameterized() { Reflect reflect = new Reflect(OpenmrsObject.class); List<Field> allFields = Reflect.getAllFields(OpenmrsObjectImp.class); Assert.assertEquals("subClassField", allFields.get(1).getName()); Assert.assertTrue(reflect.isCollectionField(allFields.get(1))); } /** * @see Reflect#isCollectionField(Field) */ @Test public void isCollectionField_shouldReturnFalseIfGivenFieldIsNotACollection() { Assert.assertFalse(Reflect.isCollection(NormalClass.class)); } /** * @see Reflect#isCollectionField(Field) */ @Test public void isCollectionField_shouldReturnFalseIfGivenFieldIsCollectionAndElementTypeIsOtherThanGiven() { Reflect reflect = new Reflect(OpenmrsObject.class); List<Field> allFields = Reflect.getAllFields(OpenmrsObjectImp.class); Field genericCollectionField = findFieldByName(allFields, "genericCollectionField"); Assert.assertFalse(reflect.isCollectionField(genericCollectionField)); } /** * @see Reflect#isSuperClass(Class) */ @Test public void isSuperClass_shouldReturnFalseIfGivenSubClassIsNotAccessibleFromGivenParameterizedClass() { Reflect reflect = new Reflect(OpenmrsObject.class); Assert.assertFalse(reflect.isSuperClass(new NormalClass())); } /** * @see Reflect#isSuperClass(Class) */ @Test public void isSuperClass_shouldReturnTrueIfGivenSubClassIsAccessibleFromGivenParameterizedClass() { Reflect reflect = new Reflect(OpenmrsObject.class); Assert.assertTrue(reflect.isSuperClass(OpenmrsObjectImp.class)); } /** * @see Reflect#isSuperClass(Object) */ @Test public void isSuperClass_shouldReturnFalseIfGivenObjectIsNotAccessibleFromGivenParameterizedClass() { Reflect reflect = new Reflect(OpenmrsObject.class); Assert.assertFalse(reflect.isSuperClass(NormalClass.class)); } /** * @see Reflect#isSuperClass(Object) */ @Test public void isSuperClass_shouldReturnTrueIfGivenObjectIsAccessibleFromGivenParameterizedClass() { Reflect reflect = new Reflect(OpenmrsObject.class); Assert.assertTrue(reflect.isSuperClass(new OpenmrsObjectImp())); } /** * @see Reflect#isSuperClass(Type) */ @Test public void isSuperClass_shouldReturnTrueForAGenericWhoseBoundIsASubclass() { Reflect reflect = new Reflect(OpenmrsObject.class); Field field = ReflectionUtils.findField(Visit.class, "attributes"); ParameterizedType setOfAttr = (ParameterizedType) field.getGenericType(); Type genericType = setOfAttr.getActualTypeArguments()[0]; Assert.assertTrue(reflect.isSuperClass(genericType)); } /** * @see Reflect#isSuperClass(Type) */ @Test public void isSuperClass_shouldReturnFalseForAGenericWhoseBoundIsNotASubclass() { Reflect reflect = new Reflect(Number.class); Field field = ReflectionUtils.findField(Visit.class, "attributes"); ParameterizedType setOfAttr = (ParameterizedType) field.getGenericType(); Type genericType = setOfAttr.getActualTypeArguments()[0]; Assert.assertFalse(reflect.isSuperClass(genericType)); } } class NormalClass { private String normalClassField; public String getNormalClassField() { return normalClassField; } public void setNormalClassField(String normalClassField) { this.normalClassField = normalClassField; } } class OpenmrsObjectImp extends NormalClass implements OpenmrsObject { protected Collection<BaseOpenmrsObject> subClassField; @SuppressWarnings("unused") private String nonCollectionField; Collection genericCollectionField; @Override public Integer getId() { return null; } @Override public String getUuid() { return null; } @Override public void setId(Integer id) { } @Override public void setUuid(String uuid) { } }