package org.overture.vdm2jml.tests.exec;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import org.junit.Assert;
import org.overture.ast.analysis.AnalysisException;
import org.overture.ast.modules.AModuleModules;
import org.overture.codegen.ir.IRSettings;
import org.overture.codegen.tests.exec.util.CheckerTestBase;
import org.overture.codegen.tests.exec.util.ProcessResult;
import org.overture.codegen.tests.exec.util.testhandlers.ExecutableSpecTestHandler;
import org.overture.codegen.tests.exec.util.testhandlers.TestHandler;
import org.overture.codegen.utils.GeneralUtils;
import org.overture.codegen.utils.GeneratedData;
import org.overture.codegen.vdm2java.JavaCodeGen;
import org.overture.codegen.vdm2java.JavaSettings;
import org.overture.codegen.vdm2jml.JmlGenerator;
import org.overture.typechecker.util.TypeCheckerUtil;
import org.overture.typechecker.util.TypeCheckerUtil.TypeCheckResult;
import org.overture.vdm2jml.tests.OpenJmlValidationBase;
import org.overture.vdm2jml.tests.util.IOpenJmlConsts;
public abstract class JmlSlJavaGenTestBase extends CheckerTestBase
{
public JmlSlJavaGenTestBase(File vdmSpec, TestHandler testHandler)
{
super(vdmSpec, testHandler);
}
public JavaCodeGen getJavaGen()
{
JavaCodeGen javaCg = new JavaCodeGen();
javaCg.setJavaSettings(getJavaSettings());
javaCg.setSettings(getIrSettings());
return javaCg;
}
public JavaSettings getJavaSettings()
{
JavaSettings javaSettings = new JavaSettings();
javaSettings.setDisableCloning(false);
javaSettings.setMakeClassesSerializable(true);
javaSettings.setFormatCode(false);
return javaSettings;
}
@Override
public void genSourcesAndCompile()
{
genJavaSources(file);
compile(consCpFiles());
}
@Override
public void compile(File[] cpJars)
{
String openJmlDir = System.getenv(JmlExecTestBase.OPENJML_ENV_VAR);
File cgRuntime = new File(JmlExecTestBase.CODEGEN_RUNTIME);
File openJml = new File(openJmlDir, JmlExecTestBase.OPEN_JML);
JmlExecTestBase.assumeFile(JmlExecTestBase.OPEN_JML, openJml);
File vdm2jmlRuntime = new File(JmlExecTestBase.VDM_TO_JML_RUNTIME);
JmlExecTestBase.assumeFile(JmlExecTestBase.VDM_TO_JML_RUNTIME, vdm2jmlRuntime);
String[] args = GeneralUtils.concat(JmlExecTestBase.getTypeCheckArgs(outputDir, cgRuntime, vdm2jmlRuntime, openJml), new String[] {
IOpenJmlConsts.RAC_TO_ASSERT_ARG });
try
{
ProcessResult res = JmlExecTestBase.runProcess(args);
Assert.assertTrue("Got errors when running process:\n"
+ res.getOutput(), res.getExitCode() == 0);
} catch (IOException | InterruptedException e)
{
e.printStackTrace();
Assert.fail("Could not type check model with OpenJML: "
+ e.getMessage());
}
}
public void genJavaSources(File vdmSource)
{
List<File> files = new LinkedList<File>();
files.add(vdmSource);
TypeCheckResult<List<AModuleModules>> tcResult = checkTcResult(TypeCheckerUtil.typeCheckSl(files));
JmlGenerator jmlGen = new JmlGenerator(getJavaGen());
GeneratedData data = null;
try
{
data = jmlGen.generateJml(tcResult.result);
} catch (AnalysisException e1)
{
Assert.fail("Could not type check VDM-SL model: "
+ e1.getMessage());
e1.printStackTrace();
}
if (data == null)
{
Assert.fail("No data was data was generated from the VDM-SL model!");
}
jmlGen.getJavaGen().genJavaSourceFiles(outputDir, data.getClasses());
if (testHandler instanceof ExecutableSpecTestHandler)
{
ExecutableSpecTestHandler ex = (ExecutableSpecTestHandler) testHandler;
try
{
ex.writeMainClass(outputDir, jmlGen.getJavaSettings().getJavaRootPackage());
} catch (IOException e)
{
Assert.fail("Got unexpected exception when attempting to generate Java/JML code: "
+ e.getMessage());
e.printStackTrace();
}
}
}
@Override
public IRSettings getIrSettings()
{
IRSettings irSettings = super.getIrSettings();
irSettings.setGenerateTraces(true);
irSettings.setGeneratePostConds(true);
irSettings.setGeneratePreConds(true);
return irSettings;
}
@Override
public String getExecProperty()
{
return OpenJmlValidationBase.EXEC_PROPERTY;
}
@Override
public String getTestsPropertyPrefix()
{
return "tests.vdm2jml.override.";
}
}