package fr.inria.diversify.processor.test;
import spoon.reflect.code.CtInvocation;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.visitor.Query;
import spoon.reflect.visitor.filter.TypeFilter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Simon on 03/02/15.
*/
public class CountProcessor extends TestProcessor {
protected int testCount;
protected Map<String, Integer> assertCount;
protected int monitoringPointCount;
public CountProcessor() {
assertCount = new HashMap<>();
}
public boolean isToBeProcessed(CtMethod candidate) {
return true;
}
@Override
public void process(CtMethod method) {
List<CtInvocation> invocations = Query.getElements(method, new TypeFilter(CtInvocation.class));
testCount++;
for(CtInvocation invocation : invocations) {
if(isAssert(invocation)) {
String testName = method.getDeclaringType().getQualifiedName() + "#" + method.getSimpleName();
if(!assertCount.containsKey(testName)) {
assertCount.put(testName, 1);
} else {
assertCount.put(testName, assertCount.get(testName) + 1);
}
}
if(isMonitoringPoint(invocation)) {
monitoringPointCount++;
}
}
}
protected boolean isMonitoringPoint(CtInvocation invocation) {
return invocation.toString().contains(".logAssertArgument(");
}
public int getTestCount() {
return testCount;
}
public int getAssertCount() {
return assertCount.values().stream()
.mapToInt(i -> i)
.sum();
}
public int getMonitoringPointCount() {
return monitoringPointCount;
}
public Map<String, Integer> getAssertPerTest() {
return assertCount;
}
}