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

org.evosuite.testcase.localsearch.IntegerLocalSearch Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2010-2018 Gordon Fraser, Andrea Arcuri and EvoSuite
 * contributors
 *
 * This file is part of EvoSuite.
 *
 * EvoSuite is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3.0 of the License, or
 * (at your option) any later version.
 *
 * EvoSuite is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with EvoSuite. If not, see .
 */
/**
 * 
 */
package org.evosuite.testcase.localsearch;

import org.evosuite.ga.localsearch.LocalSearchObjective;
import org.evosuite.testcase.TestCase;
import org.evosuite.testcase.TestChromosome;
import org.evosuite.testcase.execution.ExecutionResult;
import org.evosuite.testcase.statements.numeric.NumericalPrimitiveStatement;
import org.evosuite.testsuite.localsearch.TestSuiteLocalSearchObjective;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 

* IntegerLocalSearch class. *

* * @author Gordon Fraser */ public class IntegerLocalSearch extends StatementLocalSearch { private static final Logger logger = LoggerFactory.getLogger(TestCaseLocalSearch.class); private T oldValue; /* (non-Javadoc) * @see org.evosuite.testcase.LocalSearch#doSearch(org.evosuite.testcase.TestChromosome, int, org.evosuite.ga.LocalSearchObjective) */ /** {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public boolean doSearch(TestChromosome test, int statement, LocalSearchObjective objective) { boolean improved = false; TestCase slice = test.getTestCase().clone(); int newPos = slice.sliceFor(slice.getStatement(statement).getReturnValue()); TestCase oldTest = test.getTestCase(); test.setTestCase(slice); test.setChanged(true); /** * Commenting the call to getCopyForTest(). It seems unusual that fitness * should be considered on a new test suite instead of the original objective */ // objective = ((TestSuiteLocalSearchObjective)objective).getCopyForTest(test); int oldStatement = statement; statement = newPos; NumericalPrimitiveStatement p = (NumericalPrimitiveStatement) test.getTestCase().getStatement(statement); ExecutionResult oldResult = test.getLastExecutionResult(); oldValue = p.getValue(); logger.info("Applying search to: " + p.getCode()); boolean done = false; while (!done) { done = true; // Try +1 p.increment(1); logger.info("Trying increment of " + p.getCode()); if (objective.hasImproved(test)) { done = false; improved = true; iterate(2, objective, test, p, statement); oldValue = p.getValue(); oldResult = test.getLastExecutionResult(); } else { // Restore original, try -1 p.setValue(oldValue); test.setLastExecutionResult(oldResult); test.setChanged(false); p.increment(-1); logger.info("Trying decrement of " + p.getCode()); if (objective.hasImproved(test)) { improved = true; done = false; iterate(-2, objective, test, p, statement); oldValue = p.getValue(); oldResult = test.getLastExecutionResult(); } else { p.setValue(oldValue); test.setLastExecutionResult(oldResult); test.setChanged(false); } } } if(improved) { NumericalPrimitiveStatement ps = (NumericalPrimitiveStatement) oldTest.getStatement(oldStatement); ps.setValue(p.getValue()); } test.setChanged(true); test.setTestCase(oldTest); logger.info("Finished local search with result " + p.getCode()); return improved; } private boolean iterate(long delta, LocalSearchObjective objective, TestChromosome test, NumericalPrimitiveStatement p, int statement) { boolean improvement = false; T oldValue = p.getValue(); ExecutionResult oldResult = test.getLastExecutionResult(); p.increment(delta); logger.info("Trying increment " + delta + " of " + p.getCode()); while (objective.hasImproved(test)) { oldValue = p.getValue(); oldResult = test.getLastExecutionResult(); improvement = true; delta = 2 * delta; p.increment(delta); logger.info("Trying increment " + delta + " of " + p.getCode()); } logger.info("No improvement on " + p.getCode()); p.setValue(oldValue); test.setLastExecutionResult(oldResult); test.setChanged(false); logger.info("Final value of this iteration: " + p.getValue()); return improvement; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy