/**
* Copyright (C) 2010-2017 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 <http://www.gnu.org/licenses/>.
*/
package org.evosuite.coverage.lcsaj;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.evosuite.coverage.branch.Branch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LCSAJPool {
/** Constant <code>lcsaj_map</code> */
public static Map<String, Map<String, List<LCSAJ>>> lcsaj_map = new HashMap<String, Map<String, List<LCSAJ>>>();
/** Constant <code>lcsaj_branches</code> */
public static Set<Branch> lcsaj_branches = new HashSet<Branch>();
/**
* <p>add_lcsaj</p>
*
* @param className a {@link java.lang.String} object.
* @param methodName a {@link java.lang.String} object.
* @param lcsaj a {@link org.evosuite.coverage.lcsaj.LCSAJ} object.
*/
public static void add_lcsaj(String className, String methodName, LCSAJ lcsaj) {
if (!lcsaj_map.containsKey(className))
lcsaj_map.put(className, new HashMap<String, List<LCSAJ>>());
if (!lcsaj_map.get(className).containsKey(methodName))
lcsaj_map.get(className).put(methodName, new ArrayList<LCSAJ>());
lcsaj_map.get(className).get(methodName).add(lcsaj);
lcsaj.setID(lcsaj_map.get(className).get(methodName).size());
Logger logger = LoggerFactory.getLogger(LCSAJPool.class);
logger.info("Adding LCSAJ: " + lcsaj);
for (Branch branch : lcsaj.getBranchInstructions()) {
logger.info(" -> " + branch.getInstruction().getASMNodeString());
}
}
/**
* <p>addLCSAJBranch</p>
*
* @param b a {@link org.evosuite.coverage.branch.Branch} object.
*/
public static void addLCSAJBranch(Branch b) {
lcsaj_branches.add(b);
}
/**
* <p>isLCSAJBranch</p>
*
* @param b a {@link org.evosuite.coverage.branch.Branch} object.
* @return a boolean.
*/
public static boolean isLCSAJBranch(Branch b) {
return lcsaj_branches.contains(b);
}
/**
* <p>getLCSAJCount</p>
*
* @param className a {@link java.lang.String} object.
* @param methodName a {@link java.lang.String} object.
* @return a int.
*/
public static int getLCSAJCount(String className, String methodName) {
return lcsaj_map.get(className).get(methodName).size();
}
/**
* <p>getLCSAJs</p>
*
* @param className a {@link java.lang.String} object.
* @param methodName a {@link java.lang.String} object.
* @return a {@link java.util.ArrayList} object.
* @throws java.lang.IllegalArgumentException if any.
*/
public static ArrayList<LCSAJ> getLCSAJs(String className, String methodName)
throws IllegalArgumentException {
ArrayList<LCSAJ> lcsajs = (ArrayList<LCSAJ>) lcsaj_map.get(className).get(methodName);
if (lcsajs == null) {
throw new IllegalArgumentException(className + "/" + methodName
+ " does not exist!");
//TODO Notify logger.
}
return lcsajs;
}
/**
* <p>getNewLCSAJID</p>
*
* @param className a {@link java.lang.String} object.
* @param methodName a {@link java.lang.String} object.
* @return a int.
*/
public static int getNewLCSAJID(String className, String methodName) {
return lcsaj_map.get(className).get(methodName).size() + 1;
}
/**
* <p>getLCSAJMap</p>
*
* @return a {@link java.util.Map} object.
*/
public static Map<String, Map<String, List<LCSAJ>>> getLCSAJMap() {
return lcsaj_map;
}
/**
* <p>getLCSAJsPerClass</p>
*
* @param className a {@link java.lang.String} object.
* @return a int.
*/
public static int getLCSAJsPerClass(String className) {
int out = 0;
for (String methodName : lcsaj_map.get(className).keySet())
out += getLCSAJCount(className, methodName);
return out;
}
/**
* <p>getMinDependentBranches</p>
*
* @param className a {@link java.lang.String} object.
* @return a int.
*/
public static int getMinDependentBranches(String className) {
int min = Integer.MAX_VALUE;
for (String methodName : lcsaj_map.get(className).keySet())
for (LCSAJ l : lcsaj_map.get(className).get(methodName)) {
int branches = l.getLastBranch().getInstruction().getControlDependencies().size();
if (branches < min)
min = branches;
}
return min;
}
/**
* <p>getMaxDependentBranches</p>
*
* @param className a {@link java.lang.String} object.
* @return a int.
*/
public static int getMaxDependentBranches(String className) {
int max = Integer.MIN_VALUE;
for (String methodName : lcsaj_map.get(className).keySet())
for (LCSAJ l : lcsaj_map.get(className).get(methodName)) {
int branches = l.getLastBranch().getInstruction().getControlDependencies().size();
if (branches > max)
max = branches;
}
return max;
}
/**
* <p>getAvgDependentBranches</p>
*
* @param className a {@link java.lang.String} object.
* @return a double.
*/
public static double getAvgDependentBranches(String className) {
double avg = 0;
int n = 0;
for (String methodName : lcsaj_map.get(className).keySet())
for (LCSAJ l : lcsaj_map.get(className).get(methodName)) {
int branches = l.getLastBranch().getInstruction().getControlDependencies().size();
avg += branches;
n++;
}
if (n != 0) {
avg /= n;
return avg;
} else
return 0;
}
/**
* <p>getMinLCSAJlength</p>
*
* @param className a {@link java.lang.String} object.
* @return a int.
*/
public static int getMinLCSAJlength(String className) {
int min = Integer.MAX_VALUE;
for (String methodName : lcsaj_map.get(className).keySet())
for (LCSAJ l : lcsaj_map.get(className).get(methodName)) {
if (l.length() < min)
min = l.length();
}
return min;
}
/**
* <p>getMaxLCSAJlength</p>
*
* @param className a {@link java.lang.String} object.
* @return a int.
*/
public static int getMaxLCSAJlength(String className) {
int max = Integer.MIN_VALUE;
for (String methodName : lcsaj_map.get(className).keySet())
for (LCSAJ l : lcsaj_map.get(className).get(methodName)) {
if (l.length() > max)
max = l.length();
}
return max;
}
/**
* <p>getAvgLCSAJlength</p>
*
* @param className a {@link java.lang.String} object.
* @return a double.
*/
public static double getAvgLCSAJlength(String className) {
double avg = 0;
int n = 0;
for (String methodName : lcsaj_map.get(className).keySet())
for (LCSAJ l : lcsaj_map.get(className).get(methodName)) {
avg += l.length();
n++;
}
if (n != 0) {
avg /= n;
return avg;
} else
return 0;
}
/**
* <p>getInfeasableLCSAJs</p>
*
* @param className a {@link java.lang.String} object.
* @return a int.
*/
public static int getInfeasableLCSAJs(String className) {
int out = 0;
for (String methodName : lcsaj_map.get(className).keySet())
for (LCSAJ l : lcsaj_map.get(className).get(methodName)) {
if (l.getdPositionReached() == 0)
out++;
}
return out;
}
/**
* <p>getUnfinishedLCSAJs</p>
*
* @param className a {@link java.lang.String} object.
* @return a int.
*/
public static int getUnfinishedLCSAJs(String className) {
int out = 0;
for (String methodName : lcsaj_map.get(className).keySet())
for (LCSAJ l : lcsaj_map.get(className).get(methodName)) {
if (l.getdPositionReached() > 0
&& l.getdPositionReached() < l.length() - 1)
out++;
}
return out;
}
}