All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.tsl2.nano.autotest.creator.InverseFunctionTester Maven / Gradle / Ivy

The newest version!
/*
 * File: $HeadURL$
 * Id  : $Id$
 * 
 * created by: Tom
 * created on: 31.03.2017
 * 
 * Copyright: (c) Thomas Schneider 2017, all rights reserved
 */
package de.tsl2.nano.autotest.creator;

import java.lang.reflect.Method;
import java.util.Objects;

import de.tsl2.nano.core.util.ObjectUtil;
import de.tsl2.nano.core.util.Util;

/**
 * collects all annotated methods with {@link InverseFunction} and prepares all
 * start parameters (randomized) to be called on unit testing. provides
 * comparing between origin value and inverse function result.
 * 

* to do a multiple random test on each function, give a duplication parameter > * 0. * * @author Thomas Schneider */ @FunctionType(InverseFunction.class) public class InverseFunctionTester extends AFunctionTester { Object inverseResult; private Object[] parameterInverse; public InverseFunctionTester(Method source) { super(source); def = source.getAnnotation(InverseFunction.class); logd("\t" + source.getDeclaringClass().getSimpleName() + ": " + source.getName() + " -> " + def.methodName() + "\n"); } protected Method getFunction(InverseFunction funcAnn) { final Class declCls = funcAnn.declaringType().equals(Object.class) ? source.getDeclaringClass() : funcAnn.declaringType(); return Util.trY(() -> declCls.getMethod(funcAnn.methodName(), funcAnn.parameters())); } protected Object[] getParameter() { if (parameter == null && !status.in(StatusTyp.PARAMETER_UNDEFINED, StatusTyp.PARAMETER_ERROR)) { try{ parameter = createStartParameter(def.parameters()); } catch (Exception e) { status = new Status(StatusTyp.PARAMETER_ERROR, e.getMessage(), e); parameter = null; return null; } } return parameter; } protected Object[] getInverseParameter() { if (parameterInverse == null && !status.in(StatusTyp.PARAMETER_UNDEFINED, StatusTyp.PARAMETER_ERROR)) { try { parameterInverse = createStartParameter(source.getParameterTypes()); int[] bind = def.bindParameterIndexesOnInverse(); for (int i = 0; i < bind.length; i++) { if (bind[i] == -1 && i >= parameterInverse.length) //bind = default {-1}, but no parameterInverse existing break; parameterInverse[i] = bind[i] == -2 ? parameterInverse[i] : bind[i] == -1 ? ObjectUtil.wrap(getResult(), source.getParameterTypes()[i]) : ObjectUtil.wrap(parameter[bind[i]], source.getParameterTypes()[i]); } } catch (Exception e) { status = new Status(StatusTyp.PARAMETER_ERROR, e.getMessage(), e); parameter = null; return null; } status = Status.INITIALIZED; } return parameterInverse; } @Override public void run() { Method sourceMethod = getFunction(def); logd("==> doing test " + cloneIndex + " step 1: "); result = run(sourceMethod, getParameter()); doBetween(); logd("==> doing test " + cloneIndex + " step 2: "); inverseResult = run(source, getInverseParameter()); } protected Object getInverseResult() { return inverseResult; } public Object getCompareOrigin() { return convertOnMultilineString(def.compareParameterIndex() < 0 && !getFunction(def).getReturnType().equals(void.class) ? result : parameter[undefToZeroIndex(def.compareParameterIndex())]); } public Object getCompareResult() { Object compRevObject = convertOnMultilineString(def.compareInverseParameterIndex() < 0 && !source.getReturnType().equals(void.class) ? inverseResult : parameterInverse[undefToZeroIndex(def.compareInverseParameterIndex())]); return getCompareOrigin() != null ? ObjectUtil.wrap(compRevObject, getCompareOrigin().getClass()) : compRevObject; } @Override public Throwable getExpectFail() { return null; } @Override public int hashCode() { return Objects.hash(def.methodName(), source.toGenericString(), cloneIndex); } @Override public String toString() { return cloneIndex + ": " + source.getDeclaringClass().getSimpleName() + "." + def.methodName() + "->" + source.getName() + " " + parametersAsString(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy