package fr.inria.diversify.sosie.logger.processor; import fr.inria.diversify.transformation.Transformation; import spoon.reflect.code.CtCodeSnippetStatement; import spoon.reflect.code.CtReturn; import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.*; import spoon.support.reflect.code.CtCodeSnippetStatementImpl; import java.util.ArrayList; import java.util.List; /** * User: Simon * Date: 10/21/13 * Time: 9:27 AM */ @Deprecated public class TestLoggingInstrumenter extends AbstractLoggingInstrumenter<CtMethod> { public TestLoggingInstrumenter() { super(new ArrayList<Transformation>()); } @Override public boolean isToBeProcessed(CtMethod candidate) { if(candidate.isImplicit() || candidate.getBody() == null || candidate.getBody().getStatements().size() == 0) return false; if(candidate.getSimpleName().contains("test")) { return true; } return candidate.getAnnotations().stream() .map(annotation -> annotation.toString()) .anyMatch(annotation -> annotation.startsWith("@org.junit.Test") || annotation.startsWith("@org.junit.Before") || annotation.startsWith("@org.junit.After")); // for(CtAnnotation<?> annotation: candidate.getAnnotations()) // if(annotation.toString().startsWith("@org.junit.Test") || // annotation.toString().startsWith("@org.junit.Before") || // annotation.toString().startsWith("@org.junit.After")) // return true; // // return false; } @Override public void process(CtMethod element) { String testName = element.getPosition().getCompilationUnit().getMainType().getQualifiedName() + "." + element.getSimpleName(); idFor(testName, "TEST"); //Save the id of the test to be able to staticCount all processed tests String snippet = getLogName() + ".writeTestStart(Thread.currentThread(),\"" + testName + "\")"; CtCodeSnippetStatement snippetStatement = new CtCodeSnippetStatementImpl(); snippetStatement.setValue(snippet); element.getBody().insertBegin(snippetStatement); snippet = getLogName() + ".writeTestFinish(Thread.currentThread())"; snippetStatement = new CtCodeSnippetStatementImpl(); snippetStatement.setValue(snippet); //Search the return statement boolean returnSt = false; List<CtStatement> sts = element.getBody().getStatements(); List<CtStatement> insert = new ArrayList<>(); for ( CtStatement st : sts ) { if ( st instanceof CtReturn ) { insert.add(st); returnSt = true; } } for (CtStatement stmt : insert) { stmt.insertBefore(snippetStatement); } if ( returnSt == false ) { element.getBody().insertEnd(snippetStatement); } } }