package org.overture.codegen.tests.exec.base;
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.definitions.SClassDefinition;
import org.overture.ast.lex.Dialect;
import org.overture.ast.modules.AModuleModules;
import org.overture.codegen.ir.CodeGenBase;
import org.overture.codegen.tests.exec.util.CheckerTestBase;
import org.overture.codegen.tests.exec.util.testhandlers.ExecutableSpecTestHandler;
import org.overture.codegen.tests.exec.util.testhandlers.ExpressionTestHandler;
import org.overture.codegen.tests.exec.util.testhandlers.TestHandler;
import org.overture.codegen.utils.GeneralUtils;
import org.overture.codegen.utils.Generated;
import org.overture.codegen.utils.GeneratedData;
import org.overture.codegen.vdm2java.JavaCodeGen;
import org.overture.codegen.vdm2java.JavaCodeGenUtil;
import org.overture.codegen.vdm2java.JavaSettings;
import org.overture.config.Settings;
import org.overture.parser.lex.LexException;
import org.overture.parser.syntax.ParserException;
import org.overture.typechecker.util.TypeCheckerUtil;
import org.overture.typechecker.util.TypeCheckerUtil.TypeCheckResult;
public abstract class JavaGenTestBase extends CheckerTestBase
{
public JavaGenTestBase(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;
}
public static GeneratedData genData(JavaCodeGen javaCg, List<File> files)
throws AnalysisException, ParserException, LexException
{
GeneratedData data = null;
if (Settings.dialect == Dialect.VDM_SL)
{
TypeCheckResult<List<AModuleModules>> tcResult = checkTcResult(TypeCheckerUtil.typeCheckSl(files));
data = javaCg.generate(CodeGenBase.getNodes(tcResult.result));
} else if (Settings.dialect == Dialect.VDM_PP)
{
TypeCheckResult<List<SClassDefinition>> tcResult = checkTcResult(TypeCheckerUtil.typeCheckPp(files));
data = javaCg.generate(CodeGenBase.getNodes(tcResult.result));
} else if (Settings.dialect == Dialect.VDM_RT)
{
TypeCheckResult<List<SClassDefinition>> tcResult = checkTcResult(TypeCheckerUtil.typeCheckRt(files));
data = javaCg.generate(CodeGenBase.getNodes(tcResult.result));
}
return data;
}
public void genJavaSources(File vdmSource)
{
JavaCodeGen javaCg = getJavaGen();
try
{
if (testHandler instanceof ExpressionTestHandler)
{
Generated s = JavaCodeGenUtil.generateJavaFromExp(GeneralUtils.readFromFile(vdmSource), javaCg, Settings.dialect);
((ExpressionTestHandler) testHandler).injectArgIntoMainClassFile(outputDir, s.getContent(), javaCg.getJavaSettings().getJavaRootPackage());
} else
{
List<File> files = new LinkedList<File>();
files.add(vdmSource);
GeneratedData data = genData(javaCg, files);
if (data == null)
{
Assert.fail("Problems encountered when trying to code generate VDM model!");
}
javaCg.genJavaSourceFiles(outputDir, data.getClasses());
if (data.getQuoteValues() != null
&& !data.getQuoteValues().isEmpty())
{
javaCg.genJavaSourceFiles(outputDir, data.getQuoteValues());
}
if (testHandler instanceof ExecutableSpecTestHandler)
{
ExecutableSpecTestHandler ex = (ExecutableSpecTestHandler) testHandler;
ex.writeMainClass(outputDir, getJavaSettings().getJavaRootPackage());
}
}
} catch (AnalysisException | IOException e)
{
Assert.fail("Got unexpected exception when attempting to generate Java code: "
+ e.getMessage());
e.printStackTrace();
}
}
public void genSourcesAndCompile()
{
genJavaSources(file);
compile(consCpFiles());
}
}