package org.overture.codegen.tests.output.util; import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.Type; import java.util.List; import org.junit.Assert; import org.overture.ast.analysis.AnalysisException; import org.overture.ast.node.INode; import org.overture.codegen.analysis.violations.InvalidNamesResult; import org.overture.codegen.ir.IRSettings; import org.overture.codegen.utils.GeneralCodeGenUtils; import org.overture.codegen.utils.GeneratedData; import org.overture.codegen.utils.GeneratedModule; import org.overture.core.testing.ParamStandardTest; import org.overture.parser.lex.LexException; import org.overture.parser.syntax.ParserException; import com.google.gson.reflect.TypeToken; public abstract class SpecificationTestBase extends ParamStandardTest<String> { protected static final String LINE_SEPARATOR = System.getProperty("line.separator"); protected static final String QUOTE_SEPARATOR = ","; protected static final String MODULE_DELIMITER = LINE_SEPARATOR + "##########" + LINE_SEPARATOR; protected static final String NAME_VIOLATION_INDICATOR = "*Name Violations*"; protected static final String QUOTE_INDICATOR = "*Quotes*"; public SpecificationTestBase(String nameParameter, String inputParameter, String resultParameter) { super(nameParameter, inputParameter, resultParameter); } public IRSettings getIrSettings() { IRSettings irSettings = new IRSettings(); irSettings.setCharSeqAsString(false); return irSettings; } @Override public String processModel(List<INode> ast) { try { StringBuilder generatedCode = new StringBuilder(); GeneratedData data = genCode(ast); List<GeneratedModule> classes = data.getClasses(); for (GeneratedModule classCg : classes) { generatedCode.append(classCg.getContent()); generatedCode.append(MODULE_DELIMITER); } List<GeneratedModule> quoteData = data.getQuoteValues(); if (quoteData != null && !quoteData.isEmpty()) { generatedCode.append(QUOTE_INDICATOR + LINE_SEPARATOR); for (int i = 0; i < quoteData.size(); i++) { GeneratedModule q = quoteData.get(i); generatedCode.append(q.getName()); if (i + 1 < quoteData.size()) { generatedCode.append(QUOTE_SEPARATOR); } } generatedCode.append(MODULE_DELIMITER); } InvalidNamesResult invalidNames = data.getInvalidNamesResult(); if (invalidNames != null && !invalidNames.isEmpty()) { generatedCode.append(NAME_VIOLATION_INDICATOR + LINE_SEPARATOR); generatedCode.append(LINE_SEPARATOR + GeneralCodeGenUtils.constructNameViolationsString(invalidNames)); generatedCode.append(MODULE_DELIMITER); } return generatedCode.toString(); } catch (AnalysisException e) { Assert.fail("Unexpected problem encountered when attempting to code generate VDM model: " + e.getMessage()); e.printStackTrace(); return null; } } abstract public GeneratedData genCode(List<INode> ast) throws AnalysisException; @Override public Type getResultType() { Type resultType = new TypeToken<String>() { }.getType(); return resultType; } @Override public void compareResults(String actual, String expected) { OutputTestUtil.compare(expected, actual); } @Override public String deSerializeResult(String resultPath) throws FileNotFoundException, IOException { return OutputTestUtil.deSerialize(resultPath); } @Override protected void testUpdate(String actual) throws ParserException, LexException, IOException { OutputTestUtil.testUpdate(actual, resultPath); } @Override protected boolean updateCheck() { if (frameworkUpdateCheck()) { return true; } if (System.getProperty(OutputTestUtil.UPDATE_ALL_OUTPUT_TESTS_PROPERTY) != null) { return true; } return false; } public boolean frameworkUpdateCheck() { return super.updateCheck(); } protected abstract String getUpdatePropertyString(); }