BasicParserTest.xtend 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package be.uantwerpen.ansymo.semanticadaptation.tests
  2. import java.util.regex.Pattern
  3. import org.eclipse.emf.ecore.EObject
  4. import org.eclipse.emf.ecore.resource.ResourceSet
  5. import org.eclipse.xtext.testing.util.ParseHelper
  6. import com.google.inject.Inject
  7. import org.eclipse.xtext.testing.validation.ValidationTestHelper
  8. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.SemanticAdaptation
  9. import java.io.File
  10. import java.util.List
  11. import org.eclipse.xtext.util.Arrays
  12. import org.eclipse.xtext.validation.Issue
  13. import com.google.common.base.Predicate
  14. import static org.junit.Assert.fail
  15. import static com.google.common.collect.Iterables.isEmpty
  16. import static com.google.common.collect.Iterables.filter
  17. import org.eclipse.xtext.diagnostics.Severity
  18. import java.io.BufferedReader
  19. import java.io.FileReader
  20. abstract class BasicParserTest extends AbstractSemanticAdaptationTest {
  21. @Inject extension ParseHelper<SemanticAdaptation>
  22. @Inject extension ValidationTestHelper
  23. def getDependencies(File file) {
  24. var List<String> dependencies = newArrayList;
  25. val BufferedReader in = new BufferedReader(new FileReader(file));
  26. var continue = true;
  27. while (continue) {
  28. val line = in.readLine();
  29. if (line.contains("module")) {
  30. continue = false;
  31. } else if (line.contains("import")) {
  32. val module = line.substring(line.indexOf("import") + 7, line.length());
  33. dependencies.add(module);
  34. }
  35. continue = in.ready && continue;
  36. }
  37. in.close();
  38. return dependencies;
  39. }
  40. def __parseNoErrors(File filename) {
  41. val model = __parse(filename)
  42. __assertNoParseErrors(model, filename)
  43. }
  44. def __parseNoErrorsPrint(File filename) {
  45. val root = __parse(filename)
  46. print_ast(root)
  47. __assertNoParseErrors(root, filename)
  48. }
  49. def __parse(File filename) {
  50. val model = readFile(filename).parse
  51. return model;
  52. }
  53. def __parse(File filename, ResourceSet resourceSetToUse) {
  54. return readFile(filename).parse(resourceSetToUse)
  55. }
  56. def __assertNoParseIssues(EObject root, File filename) {
  57. val List<Issue> validate = root.validate();
  58. val Iterable<Issue> issues = filter(validate, new Predicate<Issue>() {
  59. override apply(Issue input) {
  60. return Severity.ERROR == input.getSeverity() && !input.code.contains("Linking");
  61. // if (issuecode.equals(input.getCode())) {
  62. // return userData == null || Arrays.contains(input.getData(), userData);
  63. // }
  64. // return false;
  65. }
  66. });
  67. if (!isEmpty(issues))
  68. // fail("Expected no errors, but got :" + root.getIssuesAsString(resource, issues, new StringBuilder()));
  69. __assertNoParseErrors(root, filename) // we are bit lazy
  70. }
  71. def __assertNoParseErrors(EObject root, File filename) {
  72. try {
  73. root.assertNoErrors
  74. } catch (AssertionError e) {
  75. val p = Pattern.compile(".*, offset (?<offset>[0-9]+), length (?<length>[0-9]+)")
  76. val code = readFile(filename)
  77. for (String line : e.message.split("\n")) {
  78. val m = p.matcher(line)
  79. m.matches()
  80. val count = __occurrencesInString(code.subSequence(0, Integer.valueOf(m.group("offset"))).toString(),
  81. "\n")
  82. print(filename + " at line " + (count + 1) + ": ")
  83. println(line)
  84. }
  85. throw e
  86. }
  87. }
  88. def __occurrencesInString(String str, String findstr) {
  89. var lastIndex = 0
  90. var count = 0
  91. while (lastIndex != -1) {
  92. lastIndex = str.indexOf(findstr, lastIndex)
  93. if (lastIndex != -1) {
  94. count++
  95. lastIndex += findstr.length()
  96. }
  97. }
  98. return count
  99. }
  100. }