diff --git a/tests/Makefile b/tests/Makefile index 0b9d3265bec7b925294981cfc55acd813c6519c9..5a9e1b07fe213bbcb5e4e8fbf7dd97c3ae214ea6 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 670d4423526234f1b4d5bfc56801b40603ac1e8b..77ed314598ad4c8abe45841380097893fb543efc 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 0000000000000000000000000000000000000000..ce16505a92247e9addf46d80d6298d41ca8314da --- /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 0000000000000000000000000000000000000000..3b86096602b5925e1bc0f41c7d75624404881bcb --- /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 0000000000000000000000000000000000000000..e2f65cc6056dc37d51eff0a71abb0b421f3af46e --- /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 0000000000000000000000000000000000000000..51cfc61b59813dc28828646b9e540672c96bb273 --- /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 0000000000000000000000000000000000000000..3ffd58d57ed35016e91bbf0cc086d622c7c279a4 --- /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 0000000000000000000000000000000000000000..562f260f181c76828b81a2cc2bf25002d4f67d7a --- /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 0000000000000000000000000000000000000000..eb9729cf42a323cfb654877e091f133316ca4a77 --- /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