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