CgCppBasicTest.xtend 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /*
  2. * generated by Xtext 2.10.0
  3. */
  4. package be.uantwerpen.ansymo.semanticadaptation.cg.cpp.tests
  5. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.generation.BuildUtilities
  6. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.generation.CppGenerator
  7. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.SemanticAdaptation
  8. import be.uantwerpen.ansymo.semanticadaptation.tests.AbstractSemanticAdaptationTest
  9. import be.uantwerpen.ansymo.semanticadaptation.tests.SemanticAdaptationInjectorProvider
  10. import com.google.inject.Inject
  11. import java.io.File
  12. import java.io.FileWriter
  13. import java.nio.file.Files
  14. import java.util.regex.Pattern
  15. import org.eclipse.emf.ecore.EObject
  16. import org.eclipse.emf.ecore.resource.ResourceSet
  17. import org.eclipse.xtext.generator.IGeneratorContext
  18. import org.eclipse.xtext.generator.InMemoryFileSystemAccess
  19. import org.eclipse.xtext.testing.InjectWith
  20. import org.eclipse.xtext.testing.XtextRunner
  21. import org.eclipse.xtext.testing.util.ParseHelper
  22. import org.eclipse.xtext.testing.validation.ValidationTestHelper
  23. import org.junit.Test
  24. import org.junit.runner.RunWith
  25. import be.uantwerpen.ansymo.semanticadaptation.testframework.StaticGenerators
  26. @RunWith(XtextRunner)
  27. @InjectWith(SemanticAdaptationInjectorProvider)
  28. class CgCppBasicTest extends AbstractSemanticAdaptationTest {
  29. // @Inject CppGenerator underTest
  30. @Inject extension ParseHelper<SemanticAdaptation>
  31. @Inject extension ValidationTestHelper
  32. @Test def powerwindow_model_only() {
  33. __parseNoErrors('test_input/single_folder_spec/window/window_sa_canonical.BASE.sa', 'generated', "powerwindow");
  34. // __parseNoErrorsWithValidation('test_input/single_folder_spec/window',
  35. // 'test_input/single_folder_spec/window/window_sa_canonical.BASE.sa');
  36. }
  37. def __parseNoErrorsWithValidation(String directory, String filename) {
  38. val model = __parse(filename);
  39. __assertNoParseErrors(model, filename);
  40. val correctFileDirectory = new File(directory + File.separator + "correct");
  41. val fsa = new InMemoryFileSystemAccess()
  42. val IGeneratorContext ctxt = null;
  43. new CppGenerator().doGenerate(model.eResource, fsa, ctxt);
  44. for (files : fsa.allFiles.entrySet) {
  45. val filename2 = files.key.substring(14);
  46. val file = new File(correctFileDirectory, filename2);
  47. val correctFileContent = Files.readAllLines(file.toPath);
  48. var path = new File("generated");
  49. if (path.exists)
  50. path.delete
  51. else
  52. path.mkdir;
  53. path = new File(path, files.key.substring(14))
  54. val FileWriter writer = new FileWriter(path);
  55. writer.write(files.value.toString);
  56. writer.close;
  57. val testFileContent = Files.readAllLines(path.toPath);
  58. if (correctFileContent.size != testFileContent.size) {
  59. System.out.println("Error: Lines are of different length in file: " + filename2);
  60. } else {
  61. val error = false;
  62. for (var i = 0; i < testFileContent.size; i++) {
  63. val testLine = testFileContent.get(i);
  64. val correctLine = correctFileContent.get(i);
  65. if (testLine.compareTo(correctLine) != 0) {
  66. if (!testLine.contains("guid")) {
  67. System.out.println("ERROR: The following lines are not equal: \n" + testLine + "\n" +
  68. correctLine);
  69. }
  70. }
  71. }
  72. }
  73. }
  74. }
  75. def void deleteFolder(File folder) {
  76. var files = folder.listFiles();
  77. if (files !== null) { // some JVMs return null for empty dirs
  78. for (File f : files) {
  79. if (f.isDirectory()) {
  80. deleteFolder(f);
  81. } else {
  82. f.delete();
  83. }
  84. }
  85. }
  86. folder.delete();
  87. }
  88. def void writeToFile(File file, String content)
  89. {
  90. val FileWriter writer = new FileWriter(file);
  91. writer.write(content);
  92. writer.close;
  93. System.out.println("Stored file at: " + file.absolutePath);
  94. }
  95. def __parseNoErrors(String filename, String directory, String projectName) {
  96. val buildUtils = new BuildUtilities();
  97. val model = __parse(filename)
  98. __assertNoParseErrors(model, filename)
  99. val fsa = new InMemoryFileSystemAccess()
  100. val IGeneratorContext ctxt = null;
  101. new CppGenerator().doGenerate(model.eResource, fsa, ctxt);
  102. var genPath = new File(directory);
  103. System.out.println(genPath.absolutePath)
  104. if (genPath.exists) {
  105. deleteFolder(genPath);
  106. }
  107. val srcGenPath = new File(directory + File.separatorChar + "src")
  108. srcGenPath.mkdirs();
  109. for (files : fsa.allFiles.entrySet) {
  110. // System.out.println("########################")
  111. // System.out.println("Filename: " + files.key.substring(14))
  112. // System.out.println(files.value)
  113. val path = new File(srcGenPath, files.key.substring(14))
  114. writeToFile(path, files.value.toString);
  115. }
  116. val mainCpp = StaticGenerators.generateMainCppFile((new File(directory)).absolutePath.replace("\\","\\\\"));
  117. writeToFile(new File(srcGenPath,"main.cpp"), mainCpp);
  118. var saFrameworkPath = new File(directory + File.separatorChar + "framework")
  119. saFrameworkPath.mkdirs();
  120. buildUtils.copyNativeLibFiles(saFrameworkPath);
  121. System.out.println("Stored sa framework at: " + saFrameworkPath.absolutePath);
  122. writeToFile(new File(genPath,"CMakeLists.txt"), StaticGenerators.generateCMakeLists(projectName, "framework"));
  123. }
  124. def __parseNoErrorsPrint(String filename) {
  125. val root = __parse(filename)
  126. print_ast(root)
  127. __assertNoParseErrors(root, filename)
  128. }
  129. def __parse(String filename) {
  130. return readFile(filename).parse
  131. }
  132. def __parse(
  133. String filename,
  134. ResourceSet resourceSetToUse
  135. ) {
  136. return readFile(filename).parse(resourceSetToUse)
  137. }
  138. def __assertNoParseErrors(EObject root, String filename) {
  139. try {
  140. root.assertNoErrors
  141. } catch (AssertionError e) {
  142. val p = Pattern.compile(".*, offset (?<offset>[0-9]+), length (?<length>[0-9]+)")
  143. val code = readFile(filename)
  144. for (String line : e.message.split("\n")) {
  145. val m = p.matcher(line)
  146. m.matches()
  147. val count = __occurrencesInString(code.subSequence(0, Integer.valueOf(m.group("offset"))).toString(),
  148. "\n")
  149. print(filename + " at line " + (count + 1) + ": ")
  150. println(line)
  151. }
  152. throw e
  153. }
  154. }
  155. def __occurrencesInString(String str, String findstr) {
  156. var lastIndex = 0
  157. var count = 0
  158. while (lastIndex != -1) {
  159. lastIndex = str.indexOf(findstr, lastIndex)
  160. if (lastIndex != -1) {
  161. count++
  162. lastIndex += findstr.length()
  163. }
  164. }
  165. return count
  166. }
  167. }