52n-wps-algorithm-gcube/src/test/java/org/n52/wps/algorithm/annotation/AnnotatedMemberDescriptorTe...

593 lines
27 KiB
Java
Raw Normal View History

/**
* Copyright (C) 2007 - 2016 52°North Initiative for Geospatial Open Source
* Software GmbH
*
* 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.n52.wps.algorithm.annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.lang.reflect.WildcardType;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.n52.test.mock.MockEnum;
import org.n52.wps.algorithm.annotation.AnnotationBinding.InputBinding;
import org.n52.wps.algorithm.annotation.AnnotationBinding.InputFieldBinding;
import org.n52.wps.algorithm.annotation.AnnotationBinding.InputMethodBinding;
import org.n52.wps.algorithm.annotation.AnnotationBinding.OutputBinding;
import org.n52.wps.algorithm.annotation.AnnotationBinding.OutputFieldBinding;
import org.n52.wps.algorithm.annotation.AnnotationBinding.OutputMethodBinding;
/**
*
* @author tkunicki
*/
public class AnnotatedMemberDescriptorTest extends TestCase {
// START - TEST DATA AS CLASS FIELDS AND METHODS
// represent almost all cases: literal or complex data, input or output. with expections noted below
public String stringField;
public List<String> stringListField;
public List<? extends String> stringExtendListField;
public List<? super String> stringSuperListField;
public List unboundListField; // effectively List<? extends Object>
// no polymorphism in test methods, will break use of methodMap
public void setString(String stringParameter) {
this.stringField = stringParameter;
}
public String getString() {
return stringField;
}
public void setStringList(List<String> stringListParameter) {
this.stringListField = stringListParameter;
}
public List<String> getStringList() {
return this.stringListField;
}
public void setStringExtendList(List<? extends String> stringExtendListParameter) {
this.stringExtendListField = stringExtendListParameter;
}
public List<? extends String> getStringExtendList() {
return this.stringExtendListField;
}
public void setStringSuperList(List<? super String> stringSuperListParameter) {
this.stringSuperListField = stringSuperListParameter;
}
public List<? super String> getStringSuperList() {
return this.stringSuperListField;
}
public void setUnboundList(List unboundListParameter) {
this.unboundListField = unboundListParameter;
}
public List getUnboundList() {
return this.unboundListField;
}
// special case: enumerations for *inputs* have data type of String *unless* List for outputs
public MockEnum enumField;
public List<MockEnum> enumListField;
/* NOT CURRENTLY SUPPORTED, need to be able to infer concrete type by reflection
public List<? extends MockEnum> enumExtendsListField;
public List<? super MockEnum> enumSuperListField;
*/
// no polymorphism in test methods, will break use of methodMap
public MockEnum getEnum() {
return enumField;
}
public void setEnum(MockEnum enumParameter) {
this.enumField = enumParameter;
}
public List<MockEnum> getEnumList() {
return enumListField;
}
public void setEnumList(List<MockEnum> enumListParameter) {
this.enumListField = enumListParameter;
}
/* NOT CURRENTLY SUPPORTED, need to be able to infer concrete type by reflection
public List<? extends MockEnum> getEnumExtendList() {
return enumExtendsListField;
}
public void setEnumExtendList(List<? extends MockEnum> enumExtendsListParameter) {
this.enumExtendsListField = enumExtendsListParameter;
}
public List<? super MockEnum> getEnumSuperList() {
return enumSuperListField;
}
public void setEnumSuperList(List<? super MockEnum> enumSuperListParameter) {
this.enumSuperListField = enumSuperListParameter;
}
*/
// END - TEST DATA AS CLASS FIELDS AND METHODS
Map<String, Method> methodMap;
public AnnotatedMemberDescriptorTest(String testName) {
super(testName);
methodMap = new HashMap<String, Method>();
for (Method method : AnnotationMemberDescriptorSample.class.getDeclaredMethods()) {
methodMap.put(method.getName(), method);
}
methodMap = Collections.unmodifiableMap(methodMap);
}
private Method getSampleMethod(String name) throws NoSuchMethodException {
Method method = methodMap.get(name);
if (method == null) {
throw new NoSuchMethodException(name);
}
return method;
}
private Field getSampleField(String name) throws NoSuchFieldException {
return AnnotationMemberDescriptorSample.class.getDeclaredField(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testStringFieldAsInput() throws NoSuchFieldException {
Field field = getSampleField("stringField");
InputFieldBinding memberDescriptor = new InputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateInputMember(memberDescriptor);
}
public void testStringFieldAsOutput() throws NoSuchFieldException {
Field field = getSampleField("stringField");
OutputFieldBinding memberDescriptor = new OutputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateOutputMember(memberDescriptor);
}
public void testStringSetter() throws NoSuchMethodException {
Method method = getSampleMethod("setString");
InputMethodBinding memberDescriptor = new InputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericParameterTypes()[0], memberDescriptor.getMemberType());
validateInputMember(memberDescriptor);
}
public void testStringGetter() throws NoSuchMethodException {
Method method = getSampleMethod("getString");
OutputMethodBinding memberDescriptor = new OutputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericReturnType(), memberDescriptor.getMemberType());
validateOutputMember(memberDescriptor);
}
private void validateInputMember(InputBinding memberDescriptor) {
// data type matches member for inputs type *unless* member type is List
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getType());
// payload type matches data type, special handling reserved for enumerations
assertEquals(memberDescriptor.getType(), memberDescriptor.getPayloadType());
assertEquals(false, memberDescriptor.isMemberTypeList());
assertEquals(false, memberDescriptor.isTypeEnum());
}
private void validateOutputMember(OutputBinding memberDescriptor) {
// data type matches member type for outputs
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getType());
// data type matches payload type, special handling reserved for enumerations
assertEquals(memberDescriptor.getType(), memberDescriptor.getPayloadType());
assertEquals(false, memberDescriptor.isTypeEnum());
}
public void testStringListFieldAsInput() throws NoSuchFieldException {
Field field = getSampleField("stringListField");
InputFieldBinding memberDescriptor = new InputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateInputListMember(memberDescriptor);
}
public void testStringListFieldAsOutput() throws NoSuchFieldException {
Field field = getSampleField("stringListField");
OutputFieldBinding memberDescriptor = new OutputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateOutputListMember(memberDescriptor);
}
public void testStringListSetter() throws NoSuchMethodException {
Method method = getSampleMethod("setStringList");
InputMethodBinding memberDescriptor = new InputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericParameterTypes()[0], memberDescriptor.getMemberType());
validateInputListMember(memberDescriptor);
}
public void testStringListGetter() throws NoSuchMethodException {
Method method = getSampleMethod("getStringList");
OutputMethodBinding memberDescriptor = new OutputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericReturnType(), memberDescriptor.getMemberType());
validateOutputListMember(memberDescriptor);
}
private void validateInputListMember(InputBinding memberDescriptor) {
// we extract the parameterized type of the list for inputs. since member
// type is List<String> we expect String
assertEquals(String.class, memberDescriptor.getType());
// payload type matches data type, special handling reserved for enumerations
assertEquals(memberDescriptor.getType(), memberDescriptor.getPayloadType());
assertEquals(true, memberDescriptor.isMemberTypeList());
assertEquals(false, memberDescriptor.isTypeEnum());
}
private void validateOutputListMember(OutputBinding memberDescriptor) {
// no special handling for outputs of member type List, member type matches data type
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getType());
// no special handling for outputs of member type List, member type matches data type
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getPayloadType());
assertEquals(false, memberDescriptor.isTypeEnum());
}
public void testStringExtendListFieldAsInput() throws NoSuchFieldException {
Field field = getSampleField("stringExtendListField");
InputFieldBinding memberDescriptor = new InputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateExtendListInputMember(memberDescriptor);
}
public void testStringExtendListFieldAsOutput() throws NoSuchFieldException {
Field field = getSampleField("stringExtendListField");
OutputFieldBinding memberDescriptor = new OutputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateExtendListOutputMember(memberDescriptor);
}
public void testStringExtendListSetter() throws NoSuchMethodException {
Method method = getSampleMethod("setStringExtendList");
InputMethodBinding memberDescriptor = new InputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericParameterTypes()[0], memberDescriptor.getMemberType());
validateExtendListInputMember(memberDescriptor);
}
public void testStringExtendListGetter() throws NoSuchMethodException {
Method method = getSampleMethod("getStringExtendList");
OutputMethodBinding memberDescriptor = new OutputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericReturnType(), memberDescriptor.getMemberType());
validateExtendListOutputMember(memberDescriptor);
}
private void validateExtendListInputMember(InputBinding memberDescriptor) {
// we extract the parameterized type of the list for inputs. since member
// type is List<? extends String> we expect a WildcardType of <? extends String>
// we need this information later to make sure we can safely assign an
// instance to the list with type safety (fail early behavior)
Type type = memberDescriptor.getType();
assertTrue(type instanceof WildcardType);
WildcardType typeWildcard = (WildcardType)type;
assertEquals(0, typeWildcard.getLowerBounds().length);
assertEquals(1, typeWildcard.getUpperBounds().length);
assertEquals(String.class, typeWildcard.getUpperBounds()[0]);
// we extract the parameterized type of the list for inputs
assertEquals(memberDescriptor.getType(), memberDescriptor.getPayloadType());
assertEquals(true, memberDescriptor.isMemberTypeList());
assertEquals(false, memberDescriptor.isTypeEnum());
}
private void validateExtendListOutputMember(OutputBinding memberDescriptor) {
// no special handling for outputs of member type List, member type matches data type
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getType());
// no special handling for outputs of member type List, member type matches data type
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getPayloadType());
assertEquals(false, memberDescriptor.isTypeEnum());
}
public void testStringSuperListFieldAsInput() throws NoSuchFieldException {
Field field = getSampleField("stringSuperListField");
InputFieldBinding memberDescriptor = new InputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateSuperListInputMember(memberDescriptor);
}
public void testStringSuperListFieldAsOutput() throws NoSuchFieldException {
Field field = getSampleField("stringSuperListField");
OutputFieldBinding memberDescriptor = new OutputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateSuperListOutputMember(memberDescriptor);
}
public void testStringSuperListSetter() throws NoSuchMethodException {
Method method = getSampleMethod("setStringSuperList");
InputMethodBinding memberDescriptor = new InputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericParameterTypes()[0], memberDescriptor.getMemberType());
validateSuperListInputMember(memberDescriptor);
}
public void testStringSuperListGetter() throws NoSuchMethodException {
Method method = getSampleMethod("getStringSuperList");
OutputMethodBinding memberDescriptor = new OutputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericReturnType(), memberDescriptor.getMemberType());
validateSuperListOutputMember(memberDescriptor);
}
private void validateSuperListInputMember(InputBinding memberDescriptor) {
// we extract the parameterized type of the list for inputs. since member
// type is List<? super String> we expect a WildcardType of <? super String>
// we need this information later to make sure we can safely assign an
// instance to the list with type safety (fail early behavior)
Type type = memberDescriptor.getType();
assertTrue(type instanceof WildcardType);
WildcardType typeWildcard = (WildcardType)type;
assertEquals(1, typeWildcard.getLowerBounds().length);
assertEquals(String.class, typeWildcard.getLowerBounds()[0]);
assertEquals(1, typeWildcard.getUpperBounds().length);
assertEquals(Object.class, typeWildcard.getUpperBounds()[0]);
// we extract the parameterized type of the list for inputs
assertEquals(memberDescriptor.getType(), memberDescriptor.getPayloadType());
assertEquals(true, memberDescriptor.isMemberTypeList());
assertEquals(false, memberDescriptor.isTypeEnum());
}
private void validateSuperListOutputMember(OutputBinding memberDescriptor) {
// no special handling for outputs of member type List, member type matches data type
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getType());
// no special handling for outputs of member type List, member type matches data type
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getPayloadType());
assertEquals(false, memberDescriptor.isTypeEnum());
}
public void testUnboundListFieldAsInput() throws NoSuchFieldException {
Field field = getSampleField("unboundListField");
InputFieldBinding memberDescriptor = new InputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateUnboundListInputMember(memberDescriptor);
}
public void testUnboundListFieldAsOutput() throws NoSuchFieldException {
Field field = getSampleField("unboundListField");
OutputFieldBinding memberDescriptor = new OutputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateUnboundListOutputMember(memberDescriptor);
}
public void testUnboundListSetter() throws NoSuchMethodException {
Method method = getSampleMethod("setUnboundList");
InputMethodBinding memberDescriptor = new InputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericParameterTypes()[0], memberDescriptor.getMemberType());
validateUnboundListInputMember(memberDescriptor);
}
public void testUnboundListGetter() throws NoSuchMethodException {
Method method = getSampleMethod("getUnboundList");
OutputMethodBinding memberDescriptor = new OutputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericReturnType(), memberDescriptor.getMemberType());
validateUnboundListOutputMember(memberDescriptor);
}
private void validateUnboundListInputMember(InputBinding memberDescriptor) {
// // we extract the parameterized type of the list for inputs. since member
// // type is List<? super String> we expect a WildcardType of <? super String>
// // we need this information later to make sure we can safely assign an
// // instance to the list with type safety (fail early behavior)
// Type type = memberDescriptor.getType();
// assertTrue(type instanceof WildcardType);
// WildcardType typeWildcard = (WildcardType)type;
// assertEquals(0, typeWildcard.getLowerBounds().length);
// assertEquals(1, typeWildcard.getUpperBounds().length);
// assertEquals(Object.class, typeWildcard.getUpperBounds()[0]);
// // we extract the parameterized type of the list for inputs
// assertEquals(memberDescriptor.getType(), memberDescriptor.getPayloadType());
// assertEquals(true, memberDescriptor.isMemberTypeList());
// assertEquals(false, memberDescriptor.isTypeEnum());
// we extract the parameterized type of the list for inputs. since member
// type is List<? extends Object> we expect a WildcardType of <? extends Object>
// we need this information later to make sure we can safely assign an
// instance to the list with type safety (fail early behavior)
Type type = memberDescriptor.getType();
assertTrue(type instanceof WildcardType);
WildcardType typeWildcard = (WildcardType)type;
assertEquals(0, typeWildcard.getLowerBounds().length);
assertEquals(1, typeWildcard.getUpperBounds().length);
assertEquals(Object.class, typeWildcard.getUpperBounds()[0]);
// we extract the parameterized type of the list for inputs
assertEquals(memberDescriptor.getType(), memberDescriptor.getPayloadType());
assertEquals(true, memberDescriptor.isMemberTypeList());
assertEquals(false, memberDescriptor.isTypeEnum());
}
private void validateUnboundListOutputMember(OutputBinding memberDescriptor) {
// no special handling for outputs of member type List, member type matches data type
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getType());
// no special handling for outputs of member type List, member type matches data type
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getPayloadType());
assertEquals(false, memberDescriptor.isTypeEnum());
}
public void testEnumFieldAsInput() throws NoSuchFieldException {
Field field = getSampleField("enumField");
InputFieldBinding memberDescriptor = new InputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateEnumInputMember(memberDescriptor);
}
public void testEnumFieldAsOutput() throws NoSuchFieldException {
Field field = getSampleField("enumField");
OutputFieldBinding memberDescriptor = new OutputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateEnumOutputMember(memberDescriptor);
}
public void testEnumSetter() throws NoSuchMethodException {
Method method = getSampleMethod("setEnum");
InputMethodBinding memberDescriptor = new InputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericParameterTypes()[0], memberDescriptor.getMemberType());
validateEnumInputMember(memberDescriptor);
}
public void testEnumGetter() throws NoSuchMethodException {
Method method = getSampleMethod("getEnum");
OutputMethodBinding memberDescriptor = new OutputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericReturnType(), memberDescriptor.getMemberType());
validateEnumOutputMember(memberDescriptor);
}
private void validateEnumInputMember(InputBinding memberDescriptor) {
assertEquals(MockEnum.class, memberDescriptor.getType());
// for all instances of Class<? extends Enum> the payload type is Class<String>
// as these will be bound with LiteralStringBinding
assertEquals(String.class, memberDescriptor.getPayloadType());
assertEquals(false, memberDescriptor.isMemberTypeList());
assertEquals(true, memberDescriptor.isTypeEnum());
}
private void validateEnumOutputMember(OutputBinding memberDescriptor) {
assertEquals(MockEnum.class, memberDescriptor.getType());
// for all instances of Class<? extends Enum> the payload type is Class<String>
// as these will be bound with LiteralStringBinding
assertEquals(String.class, memberDescriptor.getPayloadType());
assertEquals(true, memberDescriptor.isTypeEnum());
}
public void testEnumListFieldAsInput() throws NoSuchFieldException {
Field field = getSampleField("enumListField");
InputFieldBinding memberDescriptor = new InputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateEnumListInputMember(memberDescriptor);
}
public void testEnumListFieldAsOutput() throws NoSuchFieldException {
Field field = getSampleField("enumListField");
OutputFieldBinding memberDescriptor = new OutputFieldBinding(field);
assertEquals(field, memberDescriptor.getMember());
assertEquals(field.getGenericType(), memberDescriptor.getMemberType());
validateEnumListOutputMember(memberDescriptor);
}
public void testEnumListSetter() throws NoSuchFieldException, NoSuchMethodException {
Method method = getSampleMethod("setEnumList");
InputMethodBinding memberDescriptor = new InputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericParameterTypes()[0], memberDescriptor.getMemberType());
validateEnumListInputMember(memberDescriptor);
}
public void testEnumListGetter() throws NoSuchFieldException, NoSuchMethodException {
Method method = getSampleMethod("getEnumList");
OutputMethodBinding memberDescriptor = new OutputMethodBinding(method);
assertEquals(method, memberDescriptor.getMember());
assertEquals(method.getGenericReturnType(), memberDescriptor.getMemberType());
validateEnumListOutputMember(memberDescriptor);
}
private void validateEnumListInputMember(InputBinding memberDescriptor) {
assertEquals(MockEnum.class, memberDescriptor.getType());
assertEquals(String.class, memberDescriptor.getPayloadType());
assertEquals(true, memberDescriptor.isMemberTypeList());
assertEquals(true, memberDescriptor.isTypeEnum());
}
private void validateEnumListOutputMember(OutputBinding memberDescriptor) {
// no special handling for outputs of member type List, member type matches data type
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getType());
// no special handling for outputs of member type List, member type matches data type
assertEquals(memberDescriptor.getMemberType(), memberDescriptor.getPayloadType());
assertEquals(false, memberDescriptor.isTypeEnum());
}
}