package org.overture.codegen.vdm2java;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.lang.BooleanUtils;
import org.overture.ast.util.ClonableString;
import org.overture.codegen.assistant.NodeAssistantIR;
import org.overture.codegen.ir.IRConstants;
import org.overture.codegen.ir.IRGeneratedTag;
import org.overture.codegen.ir.analysis.AnalysisException;
import org.overture.codegen.ir.analysis.DepthFirstAnalysisAdaptor;
import org.overture.codegen.ir.declarations.ADefaultClassDeclIR;
import org.overture.codegen.ir.declarations.AMethodDeclIR;
import org.overture.codegen.trans.assistants.TransAssistantIR;
public class JUnit4Trans extends DepthFirstAnalysisAdaptor
{
private static final String TEST_NAME_PREFIX = "test";
public static final String TEST_ANNOTATION = "@Test";
public static final String JUNI4_IMPORT = "org.junit.*";
public TransAssistantIR assist;
private JavaCodeGen javaCg;
public JUnit4Trans(TransAssistantIR assist, JavaCodeGen javaCg)
{
this.assist = assist;
this.javaCg = javaCg;
}
@Override
public void caseADefaultClassDeclIR(ADefaultClassDeclIR node)
throws AnalysisException
{
if (!javaCg.getJavaSettings().genJUnit4tests())
{
return;
}
if (!assist.getInfo().getDeclAssistant().isTest(node))
{
return;
}
/**
* 1) Delete runFullSuite method with no parameters
*/
removeRunFullSuiteMethod(node);
/**
* 2) Remove TestCase super class
*/
node.getSuperNames().clear();
/**
* 3) Import JUnit4
*/
importJunit4(node);
/**
* 4) Add the '@Test' annotation to public non-static, non-constructor methods that take no arguements and start
* with 'test'
*/
addTestAnnotations(node);
}
public void addTestAnnotations(ADefaultClassDeclIR node)
{
NodeAssistantIR nodeAssist = assist.getInfo().getNodeAssistant();
for (AMethodDeclIR m : node.getMethods())
{
if (m.getName().startsWith(TEST_NAME_PREFIX)
&& m.getAccess().equals(IRConstants.PUBLIC)
&& BooleanUtils.isFalse(m.getStatic())
&& BooleanUtils.isFalse(m.getIsConstructor())
&& m.getFormalParams().isEmpty()
&& !(m.getTag() instanceof IRGeneratedTag))
{
nodeAssist.addMetaData(m, str2meta(TEST_ANNOTATION), false);
}
}
}
public void importJunit4(ADefaultClassDeclIR node)
{
assist.getInfo().getDeclAssistant().addDependencies(node, str2meta(JUNI4_IMPORT), false);
}
public void removeRunFullSuiteMethod(ADefaultClassDeclIR node)
{
for (int i = 0; i < node.getMethods().size(); i++)
{
AMethodDeclIR currentMethod = node.getMethods().get(i);
if (currentMethod.getName().equals(IRConstants.TEST_CASE_RUN_FULL_SUITE)
&& currentMethod.getFormalParams().isEmpty())
{
node.getMethods().remove(i);
break;
}
}
}
public List<ClonableString> str2meta(String str)
{
List<ClonableString> extraMetaData = new LinkedList<>();
extraMetaData.add(new ClonableString(str));
return extraMetaData;
}
}