diff --git a/client/src/main/java/org/evosuite/coverage/method/MethodNoExceptionCoverageTestFitness.java b/client/src/main/java/org/evosuite/coverage/method/MethodNoExceptionCoverageTestFitness.java
index aa49b231fa..8d4b2e6609 100755
--- a/client/src/main/java/org/evosuite/coverage/method/MethodNoExceptionCoverageTestFitness.java
+++ b/client/src/main/java/org/evosuite/coverage/method/MethodNoExceptionCoverageTestFitness.java
@@ -19,157 +19,175 @@
*/
package org.evosuite.coverage.method;
+import org.evosuite.Properties;
import org.evosuite.testcase.*;
import org.evosuite.testcase.execution.ExecutionResult;
import org.evosuite.testcase.statements.ConstructorStatement;
import org.evosuite.testcase.statements.EntityWithParametersStatement;
import org.evosuite.testcase.statements.MethodStatement;
import org.evosuite.testcase.statements.Statement;
-import org.objectweb.asm.Type;
-import java.util.Set;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
/**
* Fitness function for a single test on a single method (no exception)
*
- * @author Gordon Fraser, Jose Miguel Rojas
+ * @author Gordon Fraser, Jose Miguel Rojas, Annibale Panichella
*/
public class MethodNoExceptionCoverageTestFitness extends TestFitnessFunction {
- private static final long serialVersionUID = 3624503060256855484L;
-
- /** Target method */
- protected final String className;
- protected final String methodName;
-
- /**
- * Constructor - fitness is specific to a method
- * @param className the class name
- * @param methodName the method name
- * @throws IllegalArgumentException
- */
- public MethodNoExceptionCoverageTestFitness(String className, String methodName) throws IllegalArgumentException{
- if ((className == null) || (methodName == null)) {
- throw new IllegalArgumentException("className and methodName cannot be null");
- }
- this.className = className;
- this.methodName = methodName;
- }
-
- /**
- *
- * getClassName
- *
- *
- * @return a {@link java.lang.String} object.
- */
- public String getClassName() {
- return className;
- }
-
- /**
- *
- * getMethod
- *
- *
- * @return a {@link java.lang.String} object.
- */
- public String getMethod() {
- return methodName;
- }
-
- /**
- * {@inheritDoc}
- *
- * Calculate fitness
- *
- * @param individual
- * a {@link org.evosuite.testcase.ExecutableChromosome} object.
- * @param result
- * a {@link org.evosuite.testcase.execution.ExecutionResult} object.
- * @return a double.
- */
- @Override
- public double getFitness(TestChromosome individual, ExecutionResult result) {
- double fitness = 1.0;
-
- Set exceptionPositions = result.getPositionsWhereExceptionsWereThrown();
- for (Statement stmt : result.test) {
- if(exceptionPositions.contains(stmt.getPosition()))
- break;
- if ((stmt instanceof MethodStatement || stmt instanceof ConstructorStatement) && ! exceptionPositions.contains(stmt.getPosition())) {
- EntityWithParametersStatement ps = (EntityWithParametersStatement)stmt;
- String className = ps.getDeclaringClassName();
- String methodDesc = ps.getDescriptor();
- String methodName = ps.getMethodName() + methodDesc;
- if (this.className.equals(className) && this.methodName.equals(methodName)) {
- fitness = 0.0;
- break;
- }
- }
- }
- updateIndividual(this, individual, fitness);
- return fitness;
- }
-
- /** {@inheritDoc} */
- @Override
- public String toString() {
- return "[METHODNOEX] " + className + "." + methodName;
- }
-
- /** {@inheritDoc} */
- @Override
- public int hashCode() {
- int iConst = 13;
- return 51 * iConst + className.hashCode() * iConst + methodName.hashCode();
- }
-
- /** {@inheritDoc} */
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- MethodNoExceptionCoverageTestFitness other = (MethodNoExceptionCoverageTestFitness) obj;
- if (!className.equals(other.className)) {
- return false;
- } else if (! methodName.equals(other.methodName))
- return false;
- return true;
- }
-
- /* (non-Javadoc)
- * @see org.evosuite.testcase.TestFitnessFunction#compareTo(org.evosuite.testcase.TestFitnessFunction)
- */
- @Override
- public int compareTo(TestFitnessFunction other) {
- if (other instanceof MethodNoExceptionCoverageTestFitness) {
- MethodNoExceptionCoverageTestFitness otherMethodFitness = (MethodNoExceptionCoverageTestFitness) other;
- if (className.equals(otherMethodFitness.getClassName()))
- return methodName.compareTo(otherMethodFitness.getMethod());
- else
- return className.compareTo(otherMethodFitness.getClassName());
- }
- return compareClassName(other);
- }
-
- /* (non-Javadoc)
- * @see org.evosuite.testcase.TestFitnessFunction#getTargetClass()
- */
- @Override
- public String getTargetClass() {
- return getClassName();
- }
-
- /* (non-Javadoc)
- * @see org.evosuite.testcase.TestFitnessFunction#getTargetMethod()
- */
- @Override
- public String getTargetMethod() {
- return getMethod();
- }
+ private static final long serialVersionUID = 3624503060256855484L;
+
+ /** Target method */
+ protected final String className;
+ protected final String methodName;
+
+ /**
+ * Constructor - fitness is specific to a method
+ * @param className the class name
+ * @param methodName the method name
+ * @throws IllegalArgumentException
+ */
+ public MethodNoExceptionCoverageTestFitness(String className, String methodName) throws IllegalArgumentException{
+ if ((className == null) || (methodName == null)) {
+ throw new IllegalArgumentException("className and methodName cannot be null");
+ }
+ this.className = className;
+ this.methodName = methodName;
+ }
+
+ /**
+ *
+ * getClassName
+ *
+ *
+ * @return a {@link java.lang.String} object.
+ */
+ public String getClassName() {
+ return className;
+ }
+
+ /**
+ *
+ * getMethod
+ *
+ *
+ * @return a {@link java.lang.String} object.
+ */
+ public String getMethod() {
+ return methodName;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * Calculate fitness
+ *
+ * @param individual
+ * a {@link org.evosuite.testcase.ExecutableChromosome} object.
+ * @param result
+ * a {@link org.evosuite.testcase.execution.ExecutionResult} object.
+ * @return a double.
+ */
+ @Override
+ public double getFitness(TestChromosome individual, ExecutionResult result) {
+ double fitness = 1.0;
+
+ List exceptionPositions = new ArrayList();
+ if (Properties.BREAK_ON_EXCEPTION) {
+ // we consider only the first thrown exception
+ if (!result.getPositionsWhereExceptionsWereThrown().isEmpty()){
+ int firstPosition = Collections.min(result.getPositionsWhereExceptionsWereThrown());
+ exceptionPositions.add(firstPosition);
+ }
+ } else {
+ // we consider all thrown exceptions (if any)
+ exceptionPositions.addAll(result.getPositionsWhereExceptionsWereThrown());
+ }
+
+ for (Statement stmt : result.test) {
+ if(exceptionPositions.contains(stmt.getPosition())){
+ if (Properties.BREAK_ON_EXCEPTION)
+ break; // if we look at the first exception, then no need to iterate over the remaining statements
+ else
+ continue; // otherwise we simple skip statements throwing an exception
+ }
+ if ((stmt instanceof MethodStatement || stmt instanceof ConstructorStatement)) {
+ EntityWithParametersStatement ps = (EntityWithParametersStatement)stmt;
+ String className = ps.getDeclaringClassName();
+ String methodDesc = ps.getDescriptor();
+ String methodName = ps.getMethodName() + methodDesc;
+ if (this.className.equals(className) && this.methodName.equals(methodName)) {
+ fitness = 0.0;
+ break;
+ }
+ }
+ }
+ updateIndividual(this, individual, fitness);
+ return fitness;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ return "[METHODNOEX] " + className + "." + methodName;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public int hashCode() {
+ int iConst = 13;
+ return 51 * iConst + className.hashCode() * iConst + methodName.hashCode();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MethodNoExceptionCoverageTestFitness other = (MethodNoExceptionCoverageTestFitness) obj;
+ if (!className.equals(other.className)) {
+ return false;
+ } else if (! methodName.equals(other.methodName))
+ return false;
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.evosuite.testcase.TestFitnessFunction#compareTo(org.evosuite.testcase.TestFitnessFunction)
+ */
+ @Override
+ public int compareTo(TestFitnessFunction other) {
+ if (other instanceof MethodNoExceptionCoverageTestFitness) {
+ MethodNoExceptionCoverageTestFitness otherMethodFitness = (MethodNoExceptionCoverageTestFitness) other;
+ if (className.equals(otherMethodFitness.getClassName()))
+ return methodName.compareTo(otherMethodFitness.getMethod());
+ else
+ return className.compareTo(otherMethodFitness.getClassName());
+ }
+ return compareClassName(other);
+ }
+
+ /* (non-Javadoc)
+ * @see org.evosuite.testcase.TestFitnessFunction#getTargetClass()
+ */
+ @Override
+ public String getTargetClass() {
+ return getClassName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.evosuite.testcase.TestFitnessFunction#getTargetMethod()
+ */
+ @Override
+ public String getTargetMethod() {
+ return getMethod();
+ }
+
}
\ No newline at end of file