From f20554307992e2e69f78ac812e16a03cdcb53b11 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Sun, 24 Feb 2019 21:16:11 +0100
Subject: [PATCH] add initial test for new feature

---
 tests/Makefile                          |  1 +
 tests/multipleFiles/.gitignore          |  8 ++--
 tests/resolverHelper/.gitignore         |  4 ++
 tests/resolverHelper/AbstractTests.java | 25 ++++++++++++
 tests/resolverHelper/All.java           | 51 +++++++++++++++++++++++++
 tests/resolverHelper/Grammar.relast     |  7 ++++
 tests/resolverHelper/Makefile           | 18 +++++++++
 tests/resolverHelper/MyRefResolver.jadd | 15 ++++++++
 tests/resolverHelper/Utils.jadd         | 41 ++++++++++++++++++++
 9 files changed, 167 insertions(+), 3 deletions(-)
 create mode 100644 tests/resolverHelper/.gitignore
 create mode 100644 tests/resolverHelper/AbstractTests.java
 create mode 100644 tests/resolverHelper/All.java
 create mode 100644 tests/resolverHelper/Grammar.relast
 create mode 100644 tests/resolverHelper/Makefile
 create mode 100644 tests/resolverHelper/MyRefResolver.jadd
 create mode 100644 tests/resolverHelper/Utils.jadd

diff --git a/tests/Makefile b/tests/Makefile
index 0b9d326..5a9e1b0 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -3,3 +3,4 @@ all:
 	cd valid && make test
 	cd errors && make test
 	cd multipleFiles && make test
+	cd resolverHelper && make test
diff --git a/tests/multipleFiles/.gitignore b/tests/multipleFiles/.gitignore
index 670d442..77ed314 100644
--- a/tests/multipleFiles/.gitignore
+++ b/tests/multipleFiles/.gitignore
@@ -1,3 +1,5 @@
-/AST/*
-/*Gen.ast
-/*Gen.jadd
+AST/*
+All.ast
+All.jadd
+AllGen.jadd
+AllGen.ast
\ No newline at end of file
diff --git a/tests/resolverHelper/.gitignore b/tests/resolverHelper/.gitignore
new file mode 100644
index 0000000..ce16505
--- /dev/null
+++ b/tests/resolverHelper/.gitignore
@@ -0,0 +1,4 @@
+/AST/*
+/All.ast
+All.jadd
+AllRefResolver.jadd
diff --git a/tests/resolverHelper/AbstractTests.java b/tests/resolverHelper/AbstractTests.java
new file mode 100644
index 0000000..3b86096
--- /dev/null
+++ b/tests/resolverHelper/AbstractTests.java
@@ -0,0 +1,25 @@
+public class AbstractTests {
+	protected void assertException() {
+		check(false, "should throw exception");
+	}
+	protected void assertTrue(boolean b) {
+		check(b, "value should be true (is false)");
+	}
+	protected void assertFalse(boolean b) {
+		check(!b, "value should be flase (is true)");
+	}
+	protected void assertNull(Object obj) {
+		check(obj == null, "Object not null: " + obj);
+	}
+	protected void assertSame(Object o1, Object o2) {
+		check(o1 == o2, "Objects not same: " + o1 + ", " + o2);
+	}
+	protected void assertEquals(Object o1, Object o2) {
+		check(o1.equals(o2), "Objects not equals: " + o1 + ", " + o2);
+	}
+	protected void check(boolean b, String message) {
+		if (!b) {
+			throw new RuntimeException(message);
+		}
+	}
+}
\ No newline at end of file
diff --git a/tests/resolverHelper/All.java b/tests/resolverHelper/All.java
new file mode 100644
index 0000000..e2f65cc
--- /dev/null
+++ b/tests/resolverHelper/All.java
@@ -0,0 +1,51 @@
+import AST.*;
+import java.util.*;
+
+@SuppressWarnings("ArraysAsListWithZeroOrOneArgument")
+public class All extends AbstractTests {
+  private Root r;
+  private A a1;
+  private A a2;
+  private A a3;
+  private B b1;
+  private B b2;
+  private B b3;
+
+  public static void main(String args[]) {
+    new All().test();
+  }
+
+  public void test() {
+    testNameRes1();
+  }
+
+
+
+  /**
+   * rel A.Di1 -> B;
+   */
+  private void testNameRes1() {
+    setup();
+    a1.setRel1(NamedElement.createRef("b2"));
+    System.out.println("Rel 1 of a1 has type " + a1.getRel1().getClass().getSimpleName());
+    assertSame(a1.getRel1(), b2);
+  }
+
+  private void setup() {
+    r = new Root();
+    a1 = new A("a1");
+    a2 = new A("a2");
+    a3 = new A("a3");
+    b1 = new B("b1");
+    b2 = new B("b2");
+    b3 = new B("b3");
+
+    r.addA(a1);
+    r.addA(a2);
+    r.addA(a3);
+    r.addB(b1);
+    r.addB(b2);
+    r.addB(b3);
+  }
+
+}
diff --git a/tests/resolverHelper/Grammar.relast b/tests/resolverHelper/Grammar.relast
new file mode 100644
index 0000000..51cfc61
--- /dev/null
+++ b/tests/resolverHelper/Grammar.relast
@@ -0,0 +1,7 @@
+Root ::= A* B*;
+abstract NamedElement ::= <Name:String>;
+A:NamedElement;
+B:NamedElement;
+
+rel A.Rel1  -> NamedElement;
+rel A.Rel2  -> NamedElement;
diff --git a/tests/resolverHelper/Makefile b/tests/resolverHelper/Makefile
new file mode 100644
index 0000000..3ffd58d
--- /dev/null
+++ b/tests/resolverHelper/Makefile
@@ -0,0 +1,18 @@
+all: build-jar test
+test: clean test1
+	@echo "#"
+	@echo "# RESOLVER HELPER TESTS OK"
+	@echo "#"
+
+build-jar:
+	(cd ../../ && ./gradlew jar)
+test1:
+	java -jar ../../build/libs/relast.jar Grammar.relast --file --grammarName=All --resolverHelper
+	java -jar ../../tools/jastadd2.jar --package=AST --rewrite=cnta All.ast All.jadd AllRefResolver.jadd MyRefResolver.jadd Utils.jadd
+	javac AST/*.java All.java
+	java All
+
+clean:
+	rm -rf AST
+	rm -f *.class
+	rm -f *.ast
\ No newline at end of file
diff --git a/tests/resolverHelper/MyRefResolver.jadd b/tests/resolverHelper/MyRefResolver.jadd
new file mode 100644
index 0000000..562f260
--- /dev/null
+++ b/tests/resolverHelper/MyRefResolver.jadd
@@ -0,0 +1,15 @@
+aspect MyRewrites {
+
+  // context-independent name resolution
+  refine RefResolverStubs eq ASTNode.resolveNamedElement(String id) {
+    System.out.println("resolving " + id + " to " + root().findNamedElement(id));
+    return root().findNamedElement(id);
+  }
+
+  refine RefResolverStubs eq A.resolveRel2(String id) {
+    // default to context-independent name resolution
+    return resolveNamedElement(id);
+  }
+
+}
+
diff --git a/tests/resolverHelper/Utils.jadd b/tests/resolverHelper/Utils.jadd
new file mode 100644
index 0000000..eb9729c
--- /dev/null
+++ b/tests/resolverHelper/Utils.jadd
@@ -0,0 +1,41 @@
+aspect Utils {
+  public String NamedElement.toString() {
+    return getName();
+  }
+
+  inh Root ASTNode.root();
+  eq Root.getA(int i).root() = this;
+  eq Root.getB(int i).root() = this;
+
+  syn NamedElement Root.findNamedElement(String name) {
+    for (A a : getAList()) {
+      if (a.getName().equals(name)) {
+        return a;
+      }
+    }
+    for (B b : getBList()) {
+      if (b.getName().equals(name)) {
+        return b;
+      }
+    }
+    return null;
+  }
+
+  syn A Root.findA(String name) {
+    for (A a : getAList()) {
+      if (a.getName().equals(name)) {
+        return a;
+      }
+    }
+    return null;
+  }
+
+  syn B Root.findB(String name) {
+    for (B b : getBList()) {
+      if (b.getName().equals(name)) {
+        return b;
+      }
+    }
+    return null;
+  }
+}
\ No newline at end of file
-- 
GitLab