use of org.evosuite.testcase.ArrayIndex in project evosuite by EvoSuite.
the class TestExtractingVisitor method retrieveVariableReference.
private VariableReference retrieveVariableReference(ArrayAccess arrayAccess) {
Expression expr = arrayAccess.getArray();
List<Integer> indices = new ArrayList<Integer>();
// TODO This is a shortcut
// we need a variable reference for the index value
indices.add(getArrayIndex(arrayAccess.getIndex()));
while (expr instanceof ArrayAccess) {
ArrayAccess current = (ArrayAccess) expr;
expr = current.getArray();
indices.add(getArrayIndex(current.getIndex()));
}
Collections.reverse(indices);
VariableReference varRef = retrieveVariableReference(expr, null);
ArrayReference arrayReference = (ArrayReference) varRef;
assert indices.size() == arrayReference.getArrayDimensions();
ArrayIndex arrayIndex = new ArrayIndex(testCase.getReference(), arrayReference, indices);
return arrayIndex;
}
use of org.evosuite.testcase.ArrayIndex in project evosuite by EvoSuite.
the class TestExtractingVisitor method convertParams.
private List<VariableReference> convertParams(List<?> params, List<?> argumentTypes) {
List<VariableReference> result = new ArrayList<VariableReference>();
if ((params.size() == 0) && (argumentTypes.size() == 0)) {
return result;
}
if ((argumentTypes.size() > params.size()) && (argumentTypes.size() - 1 != params.size())) {
throw new RuntimeException("Number of declared and actual params do not match!");
}
int limit = argumentTypes.size();
Class<?> lastDeclaredParamType = retrieveTypeClass(argumentTypes.get(argumentTypes.size() - 1));
if (lastDeclaredParamType.isArray()) {
limit = argumentTypes.size() - 1;
}
for (int idx = 0; idx < limit; idx++) {
if (idx >= params.size()) {
break;
}
Object argument = params.get(idx);
if ((argument instanceof MethodInvocation) || (argument instanceof ClassInstanceCreation)) {
assert !nestedCallResults.isEmpty();
result.add(nestedCallResults.pop());
continue;
}
Class<?> argClass = retrieveTypeClass(argumentTypes.get(idx));
VariableReference argRef = retrieveVariableReference(argument, argClass);
argRef.setOriginalCode(argument.toString());
result.add(argRef);
}
if (limit == argumentTypes.size()) {
return result;
}
assert lastDeclaredParamType.isArray();
if (argumentTypes.size() == params.size()) {
Object lastParam = params.get(params.size() - 1);
Class<?> lastActualParamType = retrieveTypeClass(lastParam);
if (lastParam instanceof MethodInvocation) {
assert !nestedCallResults.isEmpty();
lastActualParamType = nestedCallResults.peek().getVariableClass();
}
if (lastActualParamType.isArray()) {
if ((lastParam instanceof MethodInvocation) || (lastParam instanceof ClassInstanceCreation)) {
assert !nestedCallResults.isEmpty();
result.add(nestedCallResults.pop());
} else {
result.add(retrieveVariableReference(lastParam, null));
}
return result;
}
}
ArrayReference arrayReference = new ValidArrayReference(testCase.getReference(), lastDeclaredParamType);
arrayReference.setOriginalCode(params.toString());
ArrayStatement arrayStatement = new ArrayStatement(testCase.getReference(), arrayReference);
testCase.addStatement(arrayStatement);
result.add(arrayStatement.getReturnValue());
arrayStatement.setSize(params.size() - (argumentTypes.size() - 1));
int arrayIdx = 0;
for (int idx = argumentTypes.size() - 1; idx < params.size(); idx++) {
ArrayIndex arrayIndex = new ArrayIndex(testCase.getReference(), arrayReference, arrayIdx);
Object param = params.get(idx);
VariableReference paramRef = null;
if ((param instanceof MethodInvocation) || (param instanceof ClassInstanceCreation)) {
assert !nestedCallResults.isEmpty();
paramRef = nestedCallResults.pop();
} else {
paramRef = retrieveVariableReference(param, lastDeclaredParamType.getComponentType());
}
paramRef.setOriginalCode(param.toString());
AssignmentStatement assignment = new AssignmentStatement(testCase.getReference(), arrayIndex, paramRef);
testCase.addStatement(assignment);
arrayIdx++;
}
return result;
}
use of org.evosuite.testcase.ArrayIndex in project evosuite by EvoSuite.
the class TestExtractingVisitor method endVisit.
/**
* {@inheritDoc}
*/
@Override
public void endVisit(Assignment assignment) {
if ((assignment.getRightHandSide() instanceof MethodInvocation) || (assignment.getRightHandSide() instanceof ClassInstanceCreation)) {
// treated in respective endVisit methods
return;
}
VariableReference varRef = retrieveVariableReference(assignment.getLeftHandSide(), null);
varRef.setOriginalCode(assignment.getLeftHandSide().toString());
VariableReference newAssignment = retrieveVariableReference(assignment.getRightHandSide(), null);
newAssignment.setOriginalCode(assignment.getRightHandSide().toString());
if (varRef instanceof ArrayIndex) {
AssignmentStatement assignmentStatement = new AssignmentStatement(testCase.getReference(), varRef, newAssignment);
testCase.addStatement(assignmentStatement);
return;
}
testCase.variableAssignment(varRef, newAssignment);
}
use of org.evosuite.testcase.ArrayIndex in project evosuite by EvoSuite.
the class TestExtractingVisitor method visit.
/**
* {@inheritDoc}
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public boolean visit(VariableDeclarationStatement variableDeclStmt) {
Class<?> varType = retrieveTypeClass(variableDeclStmt.getType());
if (varType.isPrimitive() || PRIMITIVE_CLASSES.contains(varType)) {
// Can only happen to primitive types and String,
// otherwise it is a constructor call which is handled elsewhere
logger.debug("Variable has not been treated elsewhere...");
VariableDeclarationFragment varDeclFrgmnt = (VariableDeclarationFragment) variableDeclStmt.fragments().get(0);
Expression expression = varDeclFrgmnt.getInitializer();
VariableReference varRef = retrieveVariableReference(expression, null);
varRef.setOriginalCode(variableDeclStmt.toString());
// TODO Use the name here as well?
// String name = varDeclFrgmt.getName().getIdentifier();
// new BoundVariableReferenceImpl(testCase, varType, name);
testCase.addVariable(varDeclFrgmnt.resolveBinding(), varRef);
return true;
}
if (varType.isArray()) {
// if (varType.getComponentType().isPrimitive() ||
// varType.getComponentType().equals(String.class)) {
// ... or to primitive and string arrays
VariableDeclarationFragment varDeclFrgmnt = (VariableDeclarationFragment) variableDeclStmt.fragments().get(0);
Expression expression = varDeclFrgmnt.getInitializer();
if (expression instanceof ArrayInitializer) {
ArrayReference arrayReference = new ValidArrayReference(testCase.getReference(), varType);
ArrayStatement arrayStatement = new ArrayStatement(testCase.getReference(), arrayReference);
arrayReference.setOriginalCode(variableDeclStmt.toString());
testCase.addStatement(arrayStatement);
testCase.addVariable(varDeclFrgmnt.resolveBinding(), arrayReference);
ArrayInitializer arrayInitializer = (ArrayInitializer) expression;
for (int idx = 0; idx < arrayInitializer.expressions().size(); idx++) {
Expression expr = (Expression) arrayInitializer.expressions().get(idx);
VariableReference valueRef;
if (expr instanceof NumberLiteral) {
valueRef = retrieveVariableReference((NumberLiteral) expr, varType.getComponentType());
} else if (expr instanceof PrefixExpression) {
valueRef = retrieveVariableReference((PrefixExpression) expr, varType.getComponentType());
} else {
valueRef = retrieveVariableReference(expr, null);
}
valueRef.setOriginalCode(expr.toString());
VariableReference arrayElementRef = new ArrayIndex(testCase.getReference(), arrayReference, idx);
arrayElementRef.setOriginalCode(expr.toString());
arrayStatement.getVariableReferences().add(arrayElementRef);
AssignmentStatement arrayAssignment = new AssignmentStatement(testCase.getReference(), arrayElementRef, valueRef);
testCase.addStatement(arrayAssignment);
}
// }
return true;
}
if (expression instanceof ArrayCreation) {
ArrayCreation arrayCreation = ((ArrayCreation) expression);
List paramTypes = new ArrayList();
for (int idx = 0; idx < arrayCreation.dimensions().size(); idx++) {
paramTypes.add(int.class);
}
List<VariableReference> lengthsVarRefs = convertParams(arrayCreation.dimensions(), paramTypes);
ArrayReference arrayReference = new ValidArrayReference(testCase.getReference(), varType);
arrayReference.setOriginalCode(variableDeclStmt.toString());
ArrayStatement arrayStatement = new ArrayStatement(testCase.getReference(), arrayReference);
arrayStatement.setLengths(getLengths(variableDeclStmt, lengthsVarRefs));
testCase.addVariable(varDeclFrgmnt.resolveBinding(), arrayStatement.getReturnValue());
testCase.addStatement(arrayStatement);
}
}
return true;
}
Aggregations