use of abs.frontend.ast.DataTypeUse in project abstools by abstools.
the class ASTBasedABSTestRunnerGenerator method generateWaitSyncAST.
private WhileStmt generateWaitSyncAST() {
WhileStmt ws = new WhileStmt();
ws.setCondition(getFnApp("hasNext", new VarUse(futs)));
Block body = new Block();
DataTypeUse u = getType("Pair", getType("Set", getType("Fut", getType("Unit"))), getType("Fut", getType("Unit")));
body.addStmtNoTransform(getVarDecl("nt", u, getFnApp("next", new VarUse(futs))));
body.addStmtNoTransform(getVAssign(fut, getFnApp("snd", new VarUse("nt"))));
body.addStmtNoTransform(getVAssign(futs, getFnApp("fst", new VarUse("nt"))));
body.addStmtNoTransform(getExpStmt(new GetExp(new VarUse("fut"))));
// Attach body at the end, since JastAdd will avoid touching ASTs without parents.
ws.setBody(body);
return ws;
}
use of abs.frontend.ast.DataTypeUse in project abstools by abstools.
the class AbsASTBuilderUtil method getType.
public static final DataTypeUse getType(String n, TypeUse... types) {
if (types.length > 0) {
ParametricDataTypeUse set = new ParametricDataTypeUse();
set.setName(n);
for (TypeUse d : types) {
set.addParam(d);
}
return set;
} else {
DataTypeUse set = new DataTypeUse();
set.setName(n);
return set;
}
}
use of abs.frontend.ast.DataTypeUse in project abstools by abstools.
the class DeadlockPreanalysis method processFieldDecl.
private void processFieldDecl(FieldDecl field) {
System.out.println("Processing Field Declaration: " + field.getName());
if (field.getChild(0) instanceof DataTypeUse) {
DataTypeUse type = (DataTypeUse) field.getChild(0);
dataFieldDecls.put(field, hasFutureVariables(type));
}
}
use of abs.frontend.ast.DataTypeUse in project abstools by abstools.
the class ABSUnitTestCaseBuilder method buildTestCase.
/**
* @param testCase
* @param testClass
* @param method
* @param access
* @param unitUnderTest
*/
void buildTestCase(TestCase testCase, ClassDecl testClass, MethodImpl method, Access access, String unitUnderTest) {
// initial arg
List<ABSData> inputArguments = getInputArgs(testCase);
String testName = method.getMethodSig().getName();
Block block = method.getBlock();
Map<String, InterfaceTypeUse> typesOfObjectInHeap = new HashMap<String, InterfaceTypeUse>();
for (ABSData d : inputArguments) {
typesOfObjectInHeap.putAll(getTypesFromABSData(testName, d));
}
Map<ABSRef, ABSObject> initial = getInitialState(testCase);
for (ABSObject obj : initial.values()) {
typesOfObjectInHeap.putAll(getTypesFromABSObject(testName, obj));
}
Set<String> initialHeapNames = referenceNames(initial.keySet());
createObjectsInHeap(testName, initialHeapNames, typesOfObjectInHeap, testClass, initial, block);
List<PreviousCall> calls = getPreviousCalls(testCase);
List<Exp> previous = makePreviousCalls(testName, initialHeapNames, calls);
for (Exp pc : previous) {
// does not care about return value
block.addStmtNoTransform(getExpStmt(pc));
}
// test execution
Exp test = makeTestExecution(testName, initialHeapNames, unitUnderTest, inputArguments);
final boolean hasReturnValue;
if (access instanceof DataTypeUse && ((DataTypeUse) access).getName().equals("Unit")) {
// no return value
block.addStmtNoTransform(getExpStmt(test));
hasReturnValue = false;
} else {
block.addStmtNoTransform(getVarDecl("returnValue", access.treeCopyNoTransform(), test));
hasReturnValue = true;
}
Map<ABSRef, ABSObject> finalHeap = getAfterState(testCase);
if (finalHeap.isEmpty()) {
// the method under test is side-effect free?
// use the initial heap as oracle
finalHeap = initial;
}
Set<String> finalHeapNames = referenceNames(finalHeap.keySet());
// need to remember which objects in the heap we have already handled.
Set<String> visited = new HashSet<String>();
// assertions of object states can be done in the heap assertions
if (hasReturnValue) {
ABSData rd = getReturnData(testCase);
PureExp exp = pureExpBuilder.createPureExpression(testName, finalHeapNames, rd);
block.addStmtNoTransform(getExpStmt(getCall(new VarUse(ASSERT_HELPER), "assertTrue", true, new EqExp(new VarUse("returnValue"), exp))));
}
// check return value (using deltas)
makeGetAndAssertStatements(testName, finalHeapNames, testClass, finalHeap, visited, block);
}
use of abs.frontend.ast.DataTypeUse in project abstools by abstools.
the class ABSUnitTestCaseBuilder method makeOracle.
void makeOracle(String testName, Set<String> heapNames, Map<ABSRef, ABSObject> finalHeap, String actual, Access access, ABSData data, Set<String> visited, Block block) {
InterfaceDecl inf = null;
if (access instanceof DataTypeUse) {
inf = getDecl(model, InterfaceDecl.class, new DeclNamePredicate<InterfaceDecl>(((DataTypeUse) access).getName()));
}
PureExp exp = pureExpBuilder.createPureExpression(testName, heapNames, data);
block.addStmtNoTransform(getExpStmt(getCall(new VarUse(ASSERT_HELPER), "assertTrue", true, new EqExp(new VarUse(actual), exp))));
if (inf != null && !(exp instanceof NullExp)) {
String ref = getABSDataValue(data);
for (ABSRef r : finalHeap.keySet()) {
if (getABSDataValue(r).equals(ref)) {
makeGetAndAssertStatementsForHeapRef(testName, heapNames, finalHeap, r, finalHeap.get(r), visited, block);
break;
}
}
}
}
Aggregations