From cd6f36449473a21831dd70a71d151c03fd520a48 Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Tue, 1 Jun 2021 19:26:50 +0200
Subject: [PATCH] Prepare to test for missing trailing newline.

---
 .../regression-tests/issue27/.gitignore       |  1 +
 .../regression-tests/issue27/README.md        |  3 ++
 .../regression-tests/issue27/Test.connect     |  1 +
 .../regression-tests/issue27/Test.relast      |  1 +
 .../org/jastadd/ragconnect/tests/Errors.java  | 52 +++++--------------
 .../ragconnect/tests/RegressionTests.java     | 39 ++++++++++++++
 .../jastadd/ragconnect/tests/TestUtils.java   | 51 +++++++++++++++++-
 7 files changed, 108 insertions(+), 40 deletions(-)
 create mode 100644 ragconnect.tests/src/test/01-input/regression-tests/issue27/.gitignore
 create mode 100644 ragconnect.tests/src/test/01-input/regression-tests/issue27/README.md
 create mode 100644 ragconnect.tests/src/test/01-input/regression-tests/issue27/Test.connect
 create mode 100644 ragconnect.tests/src/test/01-input/regression-tests/issue27/Test.relast
 create mode 100644 ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/RegressionTests.java

diff --git a/ragconnect.tests/src/test/01-input/regression-tests/issue27/.gitignore b/ragconnect.tests/src/test/01-input/regression-tests/issue27/.gitignore
new file mode 100644
index 0000000..607b761
--- /dev/null
+++ b/ragconnect.tests/src/test/01-input/regression-tests/issue27/.gitignore
@@ -0,0 +1 @@
+/*.noNewLine.*
diff --git a/ragconnect.tests/src/test/01-input/regression-tests/issue27/README.md b/ragconnect.tests/src/test/01-input/regression-tests/issue27/README.md
new file mode 100644
index 0000000..96595af
--- /dev/null
+++ b/ragconnect.tests/src/test/01-input/regression-tests/issue27/README.md
@@ -0,0 +1,3 @@
+# Issue27
+
+Regression test for failing parser when missing newline at end of specification.
diff --git a/ragconnect.tests/src/test/01-input/regression-tests/issue27/Test.connect b/ragconnect.tests/src/test/01-input/regression-tests/issue27/Test.connect
new file mode 100644
index 0000000..28827bb
--- /dev/null
+++ b/ragconnect.tests/src/test/01-input/regression-tests/issue27/Test.connect
@@ -0,0 +1 @@
+receive A.Name ;
diff --git a/ragconnect.tests/src/test/01-input/regression-tests/issue27/Test.relast b/ragconnect.tests/src/test/01-input/regression-tests/issue27/Test.relast
new file mode 100644
index 0000000..4c479a5
--- /dev/null
+++ b/ragconnect.tests/src/test/01-input/regression-tests/issue27/Test.relast
@@ -0,0 +1 @@
+A ::= <Name:String> ;
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java
index 47fa7c7..4d32adf 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java
@@ -2,7 +2,6 @@ package org.jastadd.ragconnect.tests;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.jastadd.ragconnect.compiler.Compiler;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -10,14 +9,14 @@ import org.junit.jupiter.api.Test;
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.Charset;
-import java.util.ArrayList;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.jastadd.ragconnect.tests.TestUtils.exec;
 import static org.jastadd.ragconnect.tests.TestUtils.readFile;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -25,8 +24,8 @@ public class Errors {
 
   private static final Logger logger = LogManager.getLogger(Errors.class);
   private static final String FILENAME_PATTERN = "$FILENAME";
-  private static final String INPUT_DIRECTORY = "./src/test/01-input/errors/";
-  private static final String OUTPUT_DIRECTORY = "./src/test/02-after-ragconnect/errors/";
+  private static final String ERROR_DIRECTORY = "errors/";
+  private static final String OUTPUT_DIRECTORY = TestUtils.OUTPUT_DIRECTORY_PREFIX + ERROR_DIRECTORY;
 
   private static final String DEFAULT_GRAMMAR_NAME = "Errors";
 
@@ -48,44 +47,21 @@ public class Errors {
 
   @SuppressWarnings("SameParameterValue")
   private void test(String expectedName, String rootNode, String... connectNames) throws IOException {
-    String grammarFile = INPUT_DIRECTORY + DEFAULT_GRAMMAR_NAME + ".relast";
-//    String ragconnectFile = INPUT_DIRECTORY + name + ".connect";
-    String outFile = OUTPUT_DIRECTORY + expectedName + ".out";
-    String expectedFile = INPUT_DIRECTORY + expectedName + ".expected";
-
-    assertThat(connectNames).isNotEmpty();
-
-    try {
-      logger.debug("user.dir: {}", System.getProperty("user.dir"));
-      List<String> args = new ArrayList<>() {{
-          add("--o=" + OUTPUT_DIRECTORY);
-          add("--rootNode=" + rootNode);
-          add("--verbose");
-          add(grammarFile);
-      }};
-      for (String connectName : connectNames) {
-        args.add(INPUT_DIRECTORY + connectName + ".connect");
-      }
-
-      int returnValue = exec(Compiler.class, args.toArray(new String[0]), new File(outFile));
-      Assertions.assertEquals(1, returnValue, "RagConnect did not return with value 1");
-    } catch (IOException | InterruptedException e) {
-      e.printStackTrace();
-    }
+    String grammarFile = ERROR_DIRECTORY + DEFAULT_GRAMMAR_NAME + ".relast";
+    List<String> connectFiles = Arrays.stream(connectNames)
+        .map(connectName -> ERROR_DIRECTORY + connectName + ".connect")
+        .collect(Collectors.toList());
+    Path outPath = TestUtils.runCompiler(grammarFile, connectFiles, rootNode, ERROR_DIRECTORY, 1);
 
     final String startOfErrorsPattern = "SEVERE: Errors:";
-    String out = readFile(outFile, Charset.defaultCharset());
+    String out = readFile(outPath, Charset.defaultCharset());
     assertThat(out).contains(startOfErrorsPattern);
     out = out.substring(out.indexOf(startOfErrorsPattern) + 16);
 
-    String expected = readFile(expectedFile, Charset.defaultCharset());
-//    if (inFiles.size() == 1) {
-//      expected = expected.replace(FILENAME_PATTERN, name + ".connect");
-//    } else {
-//      for (int i = 0; i < inFiles.size(); i++) {
-//        expected = expected.replace(FILENAME_PATTERN + (i + 1), inFiles.get(i));
-//      }
-//    }
+    Path expectedPath = Paths.get(TestUtils.INPUT_DIRECTORY_PREFIX)
+        .resolve(ERROR_DIRECTORY)
+        .resolve(expectedName + ".expected");
+    String expected = readFile(expectedPath, Charset.defaultCharset());
     List<String> outList = Arrays.asList(out.split("\n"));
     Collections.sort(outList);
     List<String> expectedList = Arrays.stream(expected.split("\n"))
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/RegressionTests.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/RegressionTests.java
new file mode 100644
index 0000000..5aeca96
--- /dev/null
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/RegressionTests.java
@@ -0,0 +1,39 @@
+package org.jastadd.ragconnect.tests;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.nio.file.*;
+import java.util.Collections;
+
+/**
+ * Regression tests for fixed issues.
+ *
+ * @author rschoene - Initial contribution
+ */
+public class RegressionTests {
+
+  private static final String REGRESSION_TEST_OUTPUT_DIRECTORY = "regression-test/";
+
+  @Test
+  public void issue27() throws IOException {
+    String grammarFile = "regression-tests/issue27/Test.relast";
+    String connectFile = "regression-tests/issue27/Test.connect";
+    grammarFile = ensureNoTrailingNewLine(grammarFile);
+    connectFile = ensureNoTrailingNewLine(connectFile);
+    // FIXME Once fixed in pre-processor, change expected return value from 1 to 0
+    TestUtils.runCompiler(grammarFile, Collections.singletonList(connectFile), "A", REGRESSION_TEST_OUTPUT_DIRECTORY, 1);
+  }
+
+  private String ensureNoTrailingNewLine(String inputFileSuffix) throws IOException {
+    int dotIndex = inputFileSuffix.lastIndexOf('.');
+    String outFileSuffix = inputFileSuffix.substring(0, dotIndex) + ".noNewLine" + inputFileSuffix.substring(dotIndex);
+    Path inputPath = Paths.get(TestUtils.INPUT_DIRECTORY_PREFIX).resolve(inputFileSuffix);
+    Path outputPath = Paths.get(TestUtils.INPUT_DIRECTORY_PREFIX).resolve(outFileSuffix);
+
+    String content = Files.readString(inputPath);
+    Files.writeString(outputPath, content.stripTrailing(), StandardOpenOption.CREATE);
+
+    return outFileSuffix;
+  }
+}
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java
index 2d08ccb..c09059c 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java
@@ -1,13 +1,22 @@
 package org.jastadd.ragconnect.tests;
 
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.jastadd.ragconnect.compiler.Compiler;
+import org.junit.jupiter.api.Assertions;
+
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
 /**
@@ -17,7 +26,10 @@ import static org.junit.jupiter.api.Assertions.fail;
  */
 public class TestUtils {
 
+  private static final Logger logger = LogManager.getLogger(TestUtils.class);
   public static final double DELTA = 0.001d;
+  public static final String INPUT_DIRECTORY_PREFIX = "./src/test/01-input/";
+  public static final String OUTPUT_DIRECTORY_PREFIX = "./src/test/02-after-ragconnect/";
 
   public static String getMqttHost() {
     if (System.getenv("GITLAB_CI") != null) {
@@ -41,6 +53,41 @@ public class TestUtils {
     return 1883;
   }
 
+  public static Path runCompiler(String grammarFile, Iterable<String> connectFiles, String rootNode, String outputDirectory, int expectedReturnValue) {
+
+    assertThat(connectFiles).isNotEmpty();
+
+    Path outPath = Paths.get(OUTPUT_DIRECTORY_PREFIX)
+        .resolve(outputDirectory)
+        .resolve("Compiler.out");
+    ensureCreated(outPath.getParent());
+
+    try {
+      logger.debug("user.dir: {}", System.getProperty("user.dir"));
+      List<String> args = new ArrayList<>() {{
+        add("--o=" + OUTPUT_DIRECTORY_PREFIX + outputDirectory);
+        add("--rootNode=" + rootNode);
+        add("--verbose");
+        add(INPUT_DIRECTORY_PREFIX + grammarFile);
+      }};
+      connectFiles.forEach(connectFile -> args.add(INPUT_DIRECTORY_PREFIX + connectFile));
+
+      int returnValue = exec(Compiler.class, args.toArray(new String[0]), outPath.toFile());
+      Assertions.assertEquals(expectedReturnValue, returnValue, "RagConnect did not return with value " + expectedReturnValue);
+    } catch (IOException | InterruptedException e) {
+      fail(e);
+    }
+    return outPath;
+  }
+
+  private static void ensureCreated(Path directory) {
+    File directoryFile = directory.toFile();
+    if (directoryFile.exists() && directoryFile.isDirectory()) {
+      return;
+    }
+    assertTrue(directoryFile.mkdirs());
+  }
+
   public static int exec(Class<?> klass, String[] args, File err) throws IOException,
       InterruptedException {
     String javaHome = System.getProperty("java.home");
@@ -79,9 +126,9 @@ public class TestUtils {
     }
   }
 
-  public static String readFile(String path, Charset encoding)
+  public static String readFile(Path path, Charset encoding)
       throws IOException {
-    byte[] encoded = Files.readAllBytes(Paths.get(path));
+    byte[] encoded = Files.readAllBytes(path);
     return new String(encoded, encoding);
   }
 
-- 
GitLab