package apet.absunit;
import static abs.backend.tests.AbsASTBuilderUtil.getCall;
import static apet.testCases.ABSTestCaseExtractor.getABSDataValue;
import static apet.testCases.ABSTestCaseExtractor.getCallArgs;
import static apet.testCases.ABSTestCaseExtractor.getMethodName;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import abs.frontend.ast.Call;
import abs.frontend.ast.Exp;
import abs.frontend.ast.Model;
import abs.frontend.ast.PureExp;
import abs.frontend.ast.VarUse;
import apet.testCases.ABSData;
import apet.testCases.ABSRef;
import apet.testCases.PreviousCall;
/**
*
* @author pwong
*
*/
final class MethodTestCaseBuilder extends ABSUnitTestCaseBuilder {
private final PureExpressionBuilder pureExpBuilder;
private final HeapReferenceBuilder heapRefBuilder = new HeapReferenceBuilder();
MethodTestCaseBuilder(PureExpressionBuilder pureExpBuilder,
DeltaForGetSetFieldsBuilder deltaBuilder,
Model model) {
super(pureExpBuilder, deltaBuilder, model);
this.pureExpBuilder = pureExpBuilder;
}
private Call makeMethodCall(String testName, Set<String> heapNames,
String methodName, List<ABSData> inArgs, boolean sync) {
if (inArgs.size() == 0) {
throw new IllegalStateException("Inputs for a method must at least have a reference");
}
ABSData r = inArgs.get(0);
if (! (r instanceof ABSRef)) {
throw new IllegalStateException("Inputs for a method must at least have a reference");
}
PureExp[] ps = new PureExp[inArgs.size() - 1];
for (int i=1; i<inArgs.size(); i++) {
ABSData d = inArgs.get(i);
PureExp exp = pureExpBuilder.createPureExpression(testName, heapNames, d);
ps[i-1] = exp;
}
String rn = getABSDataValue(r);
VarUse var = new VarUse(heapRefBuilder.heapReferenceForTest(testName, rn));
Call call = getCall(var, methodName, sync, ps);
return call;
}
@Override
Call makeTestExecution(String testName, Set<String> heapNames,
String testExecutionName, List<ABSData> inArgs) {
return makeMethodCall(testName, heapNames, testExecutionName, inArgs, true);
}
String removeClassName(String name) {
int index = name.indexOf('.');
if (0 <= index && index < name.length() - 1) {
name = name.substring(index + 1);
}
return name;
}
@Override
List<Exp> makePreviousCalls(String testName, Set<String> heapNames, List<PreviousCall> calls) {
//task interleaving
List<Exp> expressions = new ArrayList<Exp>();
for (PreviousCall call : calls) {
//test execution
List<ABSData> callInputArguments = getCallArgs(call);
String methodName = removeClassName(getMethodName(call));
expressions.add(makeMethodCall(testName, heapNames, methodName, callInputArguments, false));
}
return expressions;
}
}