From 549c19c0916eb7820b75a232dbac4bd595ea600f Mon Sep 17 00:00:00 2001
From: Niklas Fors <niklas.fors@cs.lth.se>
Date: Fri, 6 Jul 2018 13:09:21 +0200
Subject: [PATCH] Add error tests

---
 .../org/jastadd/relast/compiler/Compiler.java | 30 +++++++++----------
 test/Makefile                                 | 11 -------
 tests/Makefile                                |  4 +++
 tests/errors/.gitignore                       |  1 +
 tests/errors/Errors.expected                  |  5 ++++
 tests/errors/Errors.relast                    |  8 +++++
 tests/errors/Makefile                         |  7 +++++
 {test => tests/valid}/.gitignore              |  0
 {test => tests/valid}/All.relast              |  0
 tests/valid/Makefile                          | 14 +++++++++
 {test => tests/valid}/Test.java               |  0
 {test => tests/valid}/Utils.jadd              |  0
 12 files changed, 54 insertions(+), 26 deletions(-)
 delete mode 100644 test/Makefile
 create mode 100644 tests/Makefile
 create mode 100644 tests/errors/.gitignore
 create mode 100644 tests/errors/Errors.expected
 create mode 100644 tests/errors/Errors.relast
 create mode 100644 tests/errors/Makefile
 rename {test => tests/valid}/.gitignore (100%)
 rename {test => tests/valid}/All.relast (100%)
 create mode 100644 tests/valid/Makefile
 rename {test => tests/valid}/Test.java (100%)
 rename {test => tests/valid}/Utils.jadd (100%)

diff --git a/src/java/org/jastadd/relast/compiler/Compiler.java b/src/java/org/jastadd/relast/compiler/Compiler.java
index 27f50ac..a6f8a1d 100644
--- a/src/java/org/jastadd/relast/compiler/Compiler.java
+++ b/src/java/org/jastadd/relast/compiler/Compiler.java
@@ -20,6 +20,7 @@ import beaver.Parser;
 public class Compiler {
 	protected ArrayList<Option<?>> options;
 	protected FlagOption optionWriteToFile;
+	protected FlagOption optionPrintAST;
 	protected CommandLine commandLine;
 
 	public Compiler(String args[]) throws CommandLineException {
@@ -37,7 +38,9 @@ public class Compiler {
 		Program p = parseProgram(filename);
 
 		if (!p.errors().isEmpty()) {
-			System.out.println(p.dumpTree());
+			if (optionPrintAST.isSet()) {
+				System.out.println(p.dumpTree());
+			}
 			System.err.println("Errors:");
 			for (ErrorMessage e: p.errors()) {
 				System.err.println(e);
@@ -50,8 +53,9 @@ public class Compiler {
 				String absPathExclExt = absPath.substring(0, absPath.lastIndexOf('.'));
 				writeToFile(absPathExclExt + "Gen.ast", p.generateAbstractGrammar());
 				writeToFile(absPathExclExt + "Gen.jadd", p.generateAspect());
-			}
-			else {
+			} else if (optionPrintAST.isSet()) {
+				System.out.println(p.dumpTree());
+			} else {
 				System.out.println(p.generateAbstractGrammar());
 				System.out.println(p.generateAspect());
 			}
@@ -60,7 +64,7 @@ public class Compiler {
 
 	protected void writeToFile(String filename, String str) {
 		try {
-			PrintWriter writer = new PrintWriter(filename, "UTF-8");
+			PrintWriter writer = new PrintWriter(filename);
 			writer.print(str);
 			writer.close();
 		} catch (Exception e) {
@@ -70,7 +74,8 @@ public class Compiler {
 	}
 
 	protected void addOptions() {
-		optionWriteToFile = addOption(new FlagOption("file", "write output to file"));
+		optionWriteToFile = addOption(new FlagOption("file", "write output to files <filename>Gen.ast and <filename>Gen.jadd"));
+		optionPrintAST = addOption(new FlagOption("ast", "print AST"));
 	}
 
 	protected <OptionType extends Option<?>> OptionType addOption(OptionType option) {
@@ -101,24 +106,19 @@ public class Compiler {
 			System.err.println("Parse error in file " + file);
 			System.err.println(e.getMessage());
 			System.exit(1);
-		} /*catch (ScannerError e) {
-			System.err.println("Scanner error in file " + file);
-			System.err.println(e.getMessage());
-			System.exit(1);
-		}*/
+		}
 		return null;
 	}
 
 	protected void error(String message) {
 		System.err.println("Error: " + message);
+		System.err.println();
+		System.err.println("Usage: java -jar relast-compiler.jar <filename> [--option1] [--option2=value] ...  ");
+		System.err.println("Options:");
+		System.err.print(commandLine.printOptionHelp());
 		System.exit(1);
 	}
 
-	private void showUsageAndExit() {
-		//System.out.println("Usage: java -jar bloqqi-compiler.jar [--option1] [--option2=value] ...  <filename1> [filename2] [filename3] ...");
-		//System.exit(1);
-	}
-
 	public static void main(String[] args) {
 		try {
 			new Compiler(args);
diff --git a/test/Makefile b/test/Makefile
deleted file mode 100644
index 4f66686..0000000
--- a/test/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-all: compile run check-idempotent
-compile:
-	(cd .. && ant jar)
-	java -jar ../relast-compiler.jar All.relast --file
-	java -jar ../tools/jastadd2.jar --package=AST AllGen.ast AllGen.jadd Utils.jadd
-run:
-	javac AST/*.java Test.java
-	java Test
-check-idempotent:
-	java -jar ../relast-compiler.jar AllGen.ast --file
-	diff AllGen.ast AllGenGen.ast
diff --git a/tests/Makefile b/tests/Makefile
new file mode 100644
index 0000000..d65477d
--- /dev/null
+++ b/tests/Makefile
@@ -0,0 +1,4 @@
+all:
+	cd ../ && ant jar
+	cd valid && make test
+	cd errors && make test
\ No newline at end of file
diff --git a/tests/errors/.gitignore b/tests/errors/.gitignore
new file mode 100644
index 0000000..e87afd9
--- /dev/null
+++ b/tests/errors/.gitignore
@@ -0,0 +1 @@
+/*.out
diff --git a/tests/errors/Errors.expected b/tests/errors/Errors.expected
new file mode 100644
index 0000000..93b0d7d
--- /dev/null
+++ b/tests/errors/Errors.expected
@@ -0,0 +1,5 @@
+Errors:
+Line 5, column 5: Role name missing for type 'A'
+Line 6, column 15: Role name missing for type 'B'
+Line 7, column 12: The target of a directed relation cannot have a role name
+Line 8, column 13: The target of a directed relation may only have multiplicity 1
diff --git a/tests/errors/Errors.relast b/tests/errors/Errors.relast
new file mode 100644
index 0000000..c5bfd75
--- /dev/null
+++ b/tests/errors/Errors.relast
@@ -0,0 +1,8 @@
+Program ::= A* B*;
+A;
+B;
+
+rel A -> B;
+rel A.bs* <-> B*;
+rel A.b -> B.b;
+rel A.b2 -> B*;
diff --git a/tests/errors/Makefile b/tests/errors/Makefile
new file mode 100644
index 0000000..75b5ba0
--- /dev/null
+++ b/tests/errors/Makefile
@@ -0,0 +1,7 @@
+all: build-jar test
+
+build-jar:
+	(cd ../../ && ant jar)
+test:
+	java -jar ../../relast-compiler.jar Errors.relast 2> Errors.out || true
+	diff Errors.out Errors.expected
\ No newline at end of file
diff --git a/test/.gitignore b/tests/valid/.gitignore
similarity index 100%
rename from test/.gitignore
rename to tests/valid/.gitignore
diff --git a/test/All.relast b/tests/valid/All.relast
similarity index 100%
rename from test/All.relast
rename to tests/valid/All.relast
diff --git a/tests/valid/Makefile b/tests/valid/Makefile
new file mode 100644
index 0000000..a18b821
--- /dev/null
+++ b/tests/valid/Makefile
@@ -0,0 +1,14 @@
+all: build-jar test
+test: compile run check-idempotent
+
+build-jar:
+	(cd ../../ && ant jar)
+compile:
+	java -jar ../../relast-compiler.jar All.relast --file
+	java -jar ../../tools/jastadd2.jar --package=AST AllGen.ast AllGen.jadd Utils.jadd
+run:
+	javac AST/*.java Test.java
+	java Test
+check-idempotent:
+	java -jar ../../relast-compiler.jar AllGen.ast --file
+	diff AllGen.ast AllGenGen.ast
diff --git a/test/Test.java b/tests/valid/Test.java
similarity index 100%
rename from test/Test.java
rename to tests/valid/Test.java
diff --git a/test/Utils.jadd b/tests/valid/Utils.jadd
similarity index 100%
rename from test/Utils.jadd
rename to tests/valid/Utils.jadd
-- 
GitLab