From 66f9729b9de974e6210ae827026a55a0bf063cb8 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Mon, 25 Feb 2019 14:25:52 +0100
Subject: [PATCH] move multiple files test to junit/gradle

---
 .gitignore                                    |   4 +-
 build.gradle                                  |  34 +-
 .../test/jastadd/multiple/Part1.relast        |   0
 .../test/jastadd/multiple/Part2.relast        |   0
 .../test/jastadd/multiple/Part3.relast        |   0
 .../jastadd/relast/tests/MultipleFiles.java   | 618 +++++++++++++++++
 tests/multipleFiles/.gitignore                |   5 -
 tests/multipleFiles/AbstractTests.java        |  25 -
 tests/multipleFiles/All.ast                   |   3 -
 tests/multipleFiles/All.jadd                  | 560 ----------------
 tests/multipleFiles/All.java                  | 629 ------------------
 tests/multipleFiles/Makefile                  |  20 -
 tests/multipleFiles/Utils.jadd                |   9 -
 13 files changed, 652 insertions(+), 1255 deletions(-)
 rename tests/multipleFiles/Rules1.relast => src/test/jastadd/multiple/Part1.relast (100%)
 rename tests/multipleFiles/Rules2.relast => src/test/jastadd/multiple/Part2.relast (100%)
 rename tests/multipleFiles/Rules3.relast => src/test/jastadd/multiple/Part3.relast (100%)
 create mode 100644 src/test/java/org/jastadd/relast/tests/MultipleFiles.java
 delete mode 100644 tests/multipleFiles/.gitignore
 delete mode 100644 tests/multipleFiles/AbstractTests.java
 delete mode 100644 tests/multipleFiles/All.ast
 delete mode 100644 tests/multipleFiles/All.jadd
 delete mode 100644 tests/multipleFiles/All.java
 delete mode 100644 tests/multipleFiles/Makefile
 delete mode 100644 tests/multipleFiles/Utils.jadd

diff --git a/.gitignore b/.gitignore
index 991c176..457059f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,4 +8,6 @@ src/gen/
 src/test/jastadd/relations/Relations.ast
 src/test/jastadd/relations/Relations.jadd
 src/test/jastadd/lowerbounds/LowerBounds.ast
-src/test/jastadd/lowerbounds/LowerBounds.jadd
\ No newline at end of file
+src/test/jastadd/lowerbounds/LowerBounds.jadd
+src/test/jastadd/multiple/Multiple.ast
+src/test/jastadd/multiple/Multiple.jadd
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index a8176e2..8d6b210 100644
--- a/build.gradle
+++ b/build.gradle
@@ -157,13 +157,41 @@ task compileLowerBoundsTest(type: JavaExec, group: 'verification') {
     args '--o=src/test/java-gen/', '--package=lowerbounds.ast', 'src/test/jastadd/lowerbounds/LowerBounds.ast', 'src/test/jastadd/lowerbounds/LowerBounds.jadd', 'src/test/jastadd/Utils.jadd'
 }
 
+task preprocessMultipleTest(type: JavaExec, group: 'verification') {
+
+    doFirst {
+        delete 'src/test/jastadd/multiple/Multiple.ast', 'src/test/jastadd/multiple/Multiple.jadd'
+    }
+
+    classpath = sourceSets.main.runtimeClasspath
+    main = 'org.jastadd.relast.compiler.Compiler'
+    args 'src/test/jastadd/multiple/Part1.relast', 'src/test/jastadd/multiple/Part2.relast', 'src/test/jastadd/multiple/Part3.relast', '--file', '--grammarName=src/test/jastadd/multiple/Multiple'
+}
+
+task compileMultipleTest(type: JavaExec, group: 'verification') {
+
+    doFirst {
+        delete 'src/test/java-gen/multiple'
+    }
+
+    classpath = sourceSets.main.runtimeClasspath
+    main = 'org.jastadd.JastAdd'
+    args '--o=src/test/java-gen/', '--package=multiple.ast', 'src/test/jastadd/multiple/Multiple.ast', 'src/test/jastadd/multiple/Multiple.jadd', 'src/test/jastadd/Utils.jadd'
+}
+
+
 test {
     outputs.upToDateWhen { false }
     useJUnitPlatform()
 }
 
+
 test.dependsOn compileRelationTest
-test.dependsOn compileLowerBoundsTest
-doublePreprocessRelationTest.dependsOn preprocessRelationTest
 compileRelationTest.dependsOn doublePreprocessRelationTest
-compileLowerBoundsTest.dependsOn preprocessLowerBoundsTest
\ No newline at end of file
+doublePreprocessRelationTest.dependsOn preprocessRelationTest
+
+test.dependsOn compileLowerBoundsTest
+compileLowerBoundsTest.dependsOn preprocessLowerBoundsTest
+
+test.dependsOn compileMultipleTest
+compileMultipleTest.dependsOn preprocessMultipleTest
\ No newline at end of file
diff --git a/tests/multipleFiles/Rules1.relast b/src/test/jastadd/multiple/Part1.relast
similarity index 100%
rename from tests/multipleFiles/Rules1.relast
rename to src/test/jastadd/multiple/Part1.relast
diff --git a/tests/multipleFiles/Rules2.relast b/src/test/jastadd/multiple/Part2.relast
similarity index 100%
rename from tests/multipleFiles/Rules2.relast
rename to src/test/jastadd/multiple/Part2.relast
diff --git a/tests/multipleFiles/Rules3.relast b/src/test/jastadd/multiple/Part3.relast
similarity index 100%
rename from tests/multipleFiles/Rules3.relast
rename to src/test/jastadd/multiple/Part3.relast
diff --git a/src/test/java/org/jastadd/relast/tests/MultipleFiles.java b/src/test/java/org/jastadd/relast/tests/MultipleFiles.java
new file mode 100644
index 0000000..607c019
--- /dev/null
+++ b/src/test/java/org/jastadd/relast/tests/MultipleFiles.java
@@ -0,0 +1,618 @@
+package org.jastadd.relast.tests;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import relations.ast.A;
+import relations.ast.B;
+import relations.ast.Root;
+
+import java.util.Arrays;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+
+@SuppressWarnings("ArraysAsListWithZeroOrOneArgument")
+class MultipleFiles {
+  private Root r;
+  private A a1;
+  private A a2;
+  private A a3;
+  private B b1;
+  private B b2;
+  private B b3;
+
+  /**
+   * rel A.Di1 -> B;
+   */
+  @Test
+  void testDi1() {
+    setup();
+    a1.setDi1(b2);
+    a2.setDi1(b1);
+
+    assertSame(a1.getDi1(), b2);
+    assertSame(a2.getDi1(), b1);
+
+    a2.setDi1(b2);
+
+    assertSame(a1.getDi1(), b2);
+    assertSame(a2.getDi1(), b2);
+
+    try {
+      a3.setDi1(null);
+      fail("should throw an exception");
+    } catch (Exception e) {
+      // OK
+    }
+  }
+
+
+  /**
+   * rel A.Di2? -> B;
+   */
+  @Test
+  void testDi2() {
+    setup();
+    a1.setDi2(b2);
+    a2.setDi2(b1);
+
+    assertSame(a1.getDi2(), b2);
+    assertSame(a2.getDi2(), b1);
+
+    a2.setDi2(b2);
+
+    assertSame(a1.getDi2(), b2);
+    assertSame(a2.getDi2(), b2);
+
+    a2.clearDi2();
+
+    assertSame(a1.getDi2(), b2);
+    assertNull(a2.getDi2());
+
+    assertTrue(a1.hasDi2());
+    assertFalse(a2.hasDi2());
+    assertFalse(a3.hasDi2());
+  }
+
+
+  /**
+   * rel A.Di3* -> B;
+   */
+  @Test
+  void testDi3() {
+    setup();
+    a1.addDi3(b1);
+    a1.addDi3(b2);
+    a1.addDi3(b3);
+    a2.addDi3(b2);
+
+    assertEquals(a1.getDi3s(), Arrays.asList(b1, b2, b3));
+    assertEquals(a1.getDi3List(), Arrays.asList(b1, b2, b3));
+    assertEquals(a2.getDi3s(), Arrays.asList(b2));
+    assertEquals(a2.getDi3List(), Arrays.asList(b2));
+    assertEquals(a3.getDi3s(), Arrays.asList());
+    assertEquals(a3.getDi3List(), Arrays.asList());
+
+    a1.addDi3(b1);
+    a2.addDi3(b1);
+    a2.addDi3(b2);
+
+    assertEquals(a1.getDi3s(), Arrays.asList(b1, b2, b3, b1));
+    assertEquals(a1.getDi3List(), Arrays.asList(b1, b2, b3, b1));
+    assertEquals(a2.getDi3s(), Arrays.asList(b2, b1, b2));
+    assertEquals(a2.getDi3List(), Arrays.asList(b2, b1, b2));
+    assertEquals(a3.getDi3s(), Arrays.asList());
+    assertEquals(a3.getDi3List(), Arrays.asList());
+
+    a1.removeDi3(b1);
+    a2.removeDi3(b2);
+
+    assertEquals(a1.getDi3s(), Arrays.asList(b2, b3, b1));
+    assertEquals(a1.getDi3List(), Arrays.asList(b2, b3, b1));
+    assertEquals(a2.getDi3s(), Arrays.asList(b1, b2));
+    assertEquals(a2.getDi3List(), Arrays.asList(b1, b2));
+    assertEquals(a3.getDi3s(), Arrays.asList());
+    assertEquals(a3.getDi3List(), Arrays.asList());
+  }
+
+
+  /**
+   * rel A.Bi1 <-> B.Bi1;
+   */
+
+
+  @Test
+  void testBi11() {
+    // Init
+    setup();
+    a1.setBi1(b1);
+    a2.setBi1(b2);
+
+    // Change
+    a2.setBi1(b1);
+
+    assertNull(a1.getBi1());
+    assertSame(a2.getBi1(), b1);
+    assertSame(b1.getBi1(), a2);
+    assertNull(b2.getBi1());
+  }
+
+  @Test
+  void testBi12() {
+    // Init
+    setup();
+    a1.setBi1(b2);
+
+    // Change
+    a2.setBi1(b2);
+
+    assertNull(a1.getBi1());
+    assertSame(a2.getBi1(), b2);
+    assertNull(b1.getBi1());
+    assertSame(b2.getBi1(), a2);
+  }
+
+
+  /**
+   * rel A.Bi2 <-> B.Bi2?;
+   */
+
+  @Test
+  void testBi21() {
+    // Init
+    setup();
+    a1.setBi2(b1);
+    a2.setBi2(b2);
+
+    // Change
+    a2.setBi2(b1);
+
+    assertNull(a1.getBi2());
+    assertSame(a2.getBi2(), b1);
+    assertSame(b1.getBi2(), a2);
+    assertNull(b2.getBi2());
+  }
+
+  @Test
+  void testBi22() {
+    // Init
+    setup();
+    a1.setBi2(b2);
+
+    // Change
+    a2.setBi2(b2);
+
+    assertNull(a1.getBi2());
+    assertSame(a2.getBi2(), b2);
+    assertNull(b1.getBi2());
+    assertSame(b2.getBi2(), a2);
+  }
+
+
+  /**
+   * rel A.Bi3 <-> B.Bi3*;
+   */
+  @Test
+  void testBi3() {
+    setup();
+    a2.setBi3(b2);
+
+    assertNull(a1.getBi3());
+    assertSame(a2.getBi3(), b2);
+    assertEquals(b1.getBi3s(), Arrays.asList());
+    assertEquals(b1.getBi3List(), Arrays.asList());
+    assertEquals(b2.getBi3s(), Arrays.asList(a2));
+    assertEquals(b2.getBi3List(), Arrays.asList(a2));
+    assertEquals(b3.getBi3s(), Arrays.asList());
+    assertEquals(b3.getBi3List(), Arrays.asList());
+
+    a2.setBi3(b3);
+
+    assertNull(a1.getBi3());
+    assertSame(a2.getBi3(), b3);
+    assertEquals(b1.getBi3s(), Arrays.asList());
+    assertEquals(b1.getBi3List(), Arrays.asList());
+    assertEquals(b2.getBi3s(), Arrays.asList());
+    assertEquals(b2.getBi3List(), Arrays.asList());
+    assertEquals(b3.getBi3s(), Arrays.asList(a2));
+    assertEquals(b3.getBi3List(), Arrays.asList(a2));
+
+    a1.setBi3(b3);
+    a3.setBi3(b3);
+
+    assertSame(a1.getBi3(), b3);
+    assertSame(a2.getBi3(), b3);
+    assertSame(a3.getBi3(), b3);
+    assertEquals(b1.getBi3s(), Arrays.asList());
+    assertEquals(b1.getBi3List(), Arrays.asList());
+    assertEquals(b2.getBi3s(), Arrays.asList());
+    assertEquals(b2.getBi3List(), Arrays.asList());
+    assertEquals(b3.getBi3s(), Arrays.asList(a2, a1, a3));
+    assertEquals(b3.getBi3List(), Arrays.asList(a2, a1, a3));
+
+    a2.setBi3(b1);
+
+    assertSame(a1.getBi3(), b3);
+    assertSame(a2.getBi3(), b1);
+    assertSame(a3.getBi3(), b3);
+    assertEquals(b1.getBi3s(), Arrays.asList(a2));
+    assertEquals(b1.getBi3List(), Arrays.asList(a2));
+    assertEquals(b2.getBi3s(), Arrays.asList());
+    assertEquals(b2.getBi3List(), Arrays.asList());
+    assertEquals(b3.getBi3s(), Arrays.asList(a1, a3));
+    assertEquals(b3.getBi3List(), Arrays.asList(a1, a3));
+
+    try {
+      a2.setBi3(null);
+      fail("should throw an exception");
+    } catch (Exception e) {
+      // OK
+    }
+  }
+
+
+  /**
+   * rel A.Bi4? <-> B.Bi4;
+   */
+  @Test
+  void testBi41() {
+    // Init
+    setup();
+    a1.setBi4(b1);
+    a2.setBi4(b2);
+
+    // Change
+    a2.setBi4(b1);
+
+    assertNull(a1.getBi4());
+    assertSame(a2.getBi4(), b1);
+    assertSame(b1.getBi4(), a2);
+    assertNull(b2.getBi4());
+  }
+
+  @Test
+  void testBi42() {
+    // Init
+    setup();
+    a1.setBi4(b2);
+
+    // Change
+    a2.setBi4(b2);
+
+    assertNull(a1.getBi4());
+    assertSame(a2.getBi4(), b2);
+    assertNull(b1.getBi4());
+    assertSame(b2.getBi4(), a2);
+  }
+
+
+  /**
+   * rel A.Bi5? <-> B.Bi5?;
+   */
+  @Test
+  void testBi51() {
+    // Init
+    setup();
+    a1.setBi5(b1);
+    a2.setBi5(b2);
+
+    // Change
+    a2.setBi5(b1);
+
+    assertNull(a1.getBi5());
+    assertSame(a2.getBi5(), b1);
+    assertSame(b1.getBi5(), a2);
+    assertNull(b2.getBi5());
+  }
+
+  @Test
+  void testBi52() {
+    // Init
+    setup();
+    a1.setBi5(b2);
+
+    // Change
+    a2.setBi5(b2);
+
+    assertNull(a1.getBi5());
+    assertSame(a2.getBi5(), b2);
+    assertNull(b1.getBi5());
+    assertSame(b2.getBi5(), a2);
+  }
+
+
+  /**
+   * rel A.Bi6? <-> B.Bi6*;
+   */
+  @Test
+  void testBi6() {
+    setup();
+    a2.setBi6(b2);
+
+    assertNull(a1.getBi6());
+    assertSame(a2.getBi6(), b2);
+    assertEquals(b1.getBi6s(), Arrays.asList());
+    assertEquals(b1.getBi6List(), Arrays.asList());
+    assertEquals(b2.getBi6s(), Arrays.asList(a2));
+    assertEquals(b2.getBi6List(), Arrays.asList(a2));
+    assertEquals(b3.getBi6s(), Arrays.asList());
+    assertEquals(b3.getBi6List(), Arrays.asList());
+
+    a2.setBi6(b3);
+
+    assertNull(a1.getBi6());
+    assertSame(a2.getBi6(), b3);
+    assertEquals(b1.getBi6s(), Arrays.asList());
+    assertEquals(b1.getBi6List(), Arrays.asList());
+    assertEquals(b2.getBi6s(), Arrays.asList());
+    assertEquals(b2.getBi6List(), Arrays.asList());
+    assertEquals(b3.getBi6s(), Arrays.asList(a2));
+    assertEquals(b3.getBi6List(), Arrays.asList(a2));
+
+    a1.setBi6(b3);
+    a3.setBi6(b3);
+
+    assertSame(a1.getBi6(), b3);
+    assertSame(a2.getBi6(), b3);
+    assertSame(a3.getBi6(), b3);
+    assertEquals(b1.getBi6s(), Arrays.asList());
+    assertEquals(b1.getBi6List(), Arrays.asList());
+    assertEquals(b2.getBi6s(), Arrays.asList());
+    assertEquals(b2.getBi6List(), Arrays.asList());
+    assertEquals(b3.getBi6s(), Arrays.asList(a2, a1, a3));
+    assertEquals(b3.getBi6List(), Arrays.asList(a2, a1, a3));
+
+    a2.setBi6(b1);
+
+    assertSame(a1.getBi6(), b3);
+    assertSame(a2.getBi6(), b1);
+    assertSame(a3.getBi6(), b3);
+    assertEquals(b1.getBi6s(), Arrays.asList(a2));
+    assertEquals(b1.getBi6List(), Arrays.asList(a2));
+    assertEquals(b2.getBi6s(), Arrays.asList());
+    assertEquals(b2.getBi6List(), Arrays.asList());
+    assertEquals(b3.getBi6s(), Arrays.asList(a1, a3));
+    assertEquals(b3.getBi6List(), Arrays.asList(a1, a3));
+
+    a2.clearBi6();
+
+    assertSame(a1.getBi6(), b3);
+    assertNull(a2.getBi6());
+    assertSame(a3.getBi6(), b3);
+    assertEquals(b1.getBi6s(), Arrays.asList());
+    assertEquals(b1.getBi6List(), Arrays.asList());
+    assertEquals(b2.getBi6s(), Arrays.asList());
+    assertEquals(b2.getBi6List(), Arrays.asList());
+    assertEquals(b3.getBi6s(), Arrays.asList(a1, a3));
+    assertEquals(b3.getBi6List(), Arrays.asList(a1, a3));
+
+    assertTrue(a1.hasBi6());
+    assertFalse(a2.hasBi6());
+    assertTrue(a3.hasBi6());
+  }
+
+
+  /**
+   * rel A.Bi7* <-> B.Bi7;
+   */
+  @Test
+  void testBi7() {
+    setup();
+    a2.addBi7(b2);
+
+    assertEquals(a1.getBi7s(), Arrays.asList());
+    assertEquals(a1.getBi7List(), Arrays.asList());
+    assertEquals(a2.getBi7s(), Arrays.asList(b2));
+    assertEquals(a2.getBi7List(), Arrays.asList(b2));
+    assertNull(b1.getBi7());
+    assertSame(b2.getBi7(), a2);
+    assertNull(b3.getBi7());
+
+    a2.addBi7(b3);
+    a1.addBi7(b2);
+
+    assertEquals(a1.getBi7s(), Arrays.asList(b2));
+    assertEquals(a1.getBi7List(), Arrays.asList(b2));
+    assertEquals(a2.getBi7s(), Arrays.asList(b3));
+    assertEquals(a2.getBi7List(), Arrays.asList(b3));
+    assertNull(b1.getBi7());
+    assertSame(b2.getBi7(), a1);
+    assertSame(b3.getBi7(), a2);
+
+    a1.addBi7(b1);
+
+    assertEquals(a1.getBi7s(), Arrays.asList(b2, b1));
+    assertEquals(a1.getBi7List(), Arrays.asList(b2, b1));
+    assertEquals(a2.getBi7s(), Arrays.asList(b3));
+    assertEquals(a2.getBi7List(), Arrays.asList(b3));
+    assertSame(b1.getBi7(), a1);
+    assertSame(b2.getBi7(), a1);
+    assertSame(b3.getBi7(), a2);
+
+    a1.addBi7(b1);
+
+    assertEquals(a1.getBi7s(), Arrays.asList(b2, b1));
+    assertEquals(a1.getBi7List(), Arrays.asList(b2, b1));
+    assertEquals(a2.getBi7s(), Arrays.asList(b3));
+    assertEquals(a2.getBi7List(), Arrays.asList(b3));
+    assertSame(b1.getBi7(), a1);
+    assertSame(b2.getBi7(), a1);
+    assertSame(b3.getBi7(), a2);
+
+    a1.removeBi7(b1);
+
+    assertEquals(a1.getBi7s(), Arrays.asList(b2));
+    assertEquals(a1.getBi7List(), Arrays.asList(b2));
+    assertEquals(a2.getBi7s(), Arrays.asList(b3));
+    assertEquals(a2.getBi7List(), Arrays.asList(b3));
+    assertNull(b1.getBi7());
+    assertSame(b2.getBi7(), a1);
+    assertSame(b3.getBi7(), a2);
+  }
+
+
+  /**
+   * rel A.Bi8* <-> B.Bi8?;
+   */
+  @Test
+  void testBi8() {
+    setup();
+    a2.addBi8(b2);
+
+    assertEquals(a1.getBi8s(), Arrays.asList());
+    assertEquals(a1.getBi8List(), Arrays.asList());
+    assertEquals(a2.getBi8s(), Arrays.asList(b2));
+    assertEquals(a2.getBi8List(), Arrays.asList(b2));
+    assertNull(b1.getBi8());
+    assertSame(b2.getBi8(), a2);
+    assertNull(b3.getBi8());
+
+    a2.addBi8(b3);
+    a1.addBi8(b2);
+
+    assertEquals(a1.getBi8s(), Arrays.asList(b2));
+    assertEquals(a1.getBi8List(), Arrays.asList(b2));
+    assertEquals(a2.getBi8s(), Arrays.asList(b3));
+    assertEquals(a2.getBi8List(), Arrays.asList(b3));
+    assertNull(b1.getBi8());
+    assertSame(b2.getBi8(), a1);
+    assertSame(b3.getBi8(), a2);
+
+    a1.addBi8(b1);
+
+    assertEquals(a1.getBi8s(), Arrays.asList(b2, b1));
+    assertEquals(a1.getBi8List(), Arrays.asList(b2, b1));
+    assertEquals(a2.getBi8s(), Arrays.asList(b3));
+    assertEquals(a2.getBi8List(), Arrays.asList(b3));
+    assertSame(b1.getBi8(), a1);
+    assertSame(b2.getBi8(), a1);
+    assertSame(b3.getBi8(), a2);
+
+    a1.addBi8(b1);
+
+    assertEquals(a1.getBi8s(), Arrays.asList(b2, b1));
+    assertEquals(a1.getBi8List(), Arrays.asList(b2, b1));
+    assertEquals(a2.getBi8s(), Arrays.asList(b3));
+    assertEquals(a2.getBi8List(), Arrays.asList(b3));
+    assertSame(b1.getBi8(), a1);
+    assertSame(b2.getBi8(), a1);
+    assertSame(b3.getBi8(), a2);
+
+    a1.removeBi8(b1);
+
+    assertEquals(a1.getBi8s(), Arrays.asList(b2));
+    assertEquals(a1.getBi8List(), Arrays.asList(b2));
+    assertEquals(a2.getBi8s(), Arrays.asList(b3));
+    assertEquals(a2.getBi8List(), Arrays.asList(b3));
+    assertNull(b1.getBi8());
+    assertSame(b2.getBi8(), a1);
+    assertSame(b3.getBi8(), a2);
+  }
+
+
+  /**
+   * rel A.Bi9* <-> B.Bi9*;
+   */
+  @Test
+  void testBi9() {
+    setup();
+    a1.addBi9(b1);
+    a1.addBi9(b2);
+
+    assertEquals(a1.getBi9s(), Arrays.asList(b1, b2));
+    assertEquals(a1.getBi9List(), Arrays.asList(b1, b2));
+    assertEquals(a2.getBi9s(), Arrays.asList());
+    assertEquals(a2.getBi9List(), Arrays.asList());
+    assertEquals(a3.getBi9s(), Arrays.asList());
+    assertEquals(a3.getBi9List(), Arrays.asList());
+    assertEquals(b1.getBi9s(), Arrays.asList(a1));
+    assertEquals(b1.getBi9List(), Arrays.asList(a1));
+    assertEquals(b2.getBi9s(), Arrays.asList(a1));
+    assertEquals(b2.getBi9List(), Arrays.asList(a1));
+    assertEquals(b3.getBi9s(), Arrays.asList());
+    assertEquals(b3.getBi9List(), Arrays.asList());
+
+    b3.addBi9(a1);
+    b3.addBi9(a3);
+    b3.addBi9(a1);
+
+    assertEquals(a1.getBi9s(), Arrays.asList(b1, b2, b3, b3));
+    assertEquals(a1.getBi9List(), Arrays.asList(b1, b2, b3, b3));
+    assertEquals(a2.getBi9s(), Arrays.asList());
+    assertEquals(a2.getBi9List(), Arrays.asList());
+    assertEquals(a3.getBi9s(), Arrays.asList(b3));
+    assertEquals(a3.getBi9List(), Arrays.asList(b3));
+    assertEquals(b1.getBi9s(), Arrays.asList(a1));
+    assertEquals(b1.getBi9List(), Arrays.asList(a1));
+    assertEquals(b2.getBi9s(), Arrays.asList(a1));
+    assertEquals(b2.getBi9List(), Arrays.asList(a1));
+    assertEquals(b3.getBi9s(), Arrays.asList(a1, a3, a1));
+    assertEquals(b3.getBi9List(), Arrays.asList(a1, a3, a1));
+
+    b3.removeBi9(a1);
+
+    assertEquals(a1.getBi9s(), Arrays.asList(b1, b2, b3));
+    assertEquals(a1.getBi9List(), Arrays.asList(b1, b2, b3));
+    assertEquals(a2.getBi9s(), Arrays.asList());
+    assertEquals(a2.getBi9List(), Arrays.asList());
+    assertEquals(a3.getBi9s(), Arrays.asList(b3));
+    assertEquals(a3.getBi9List(), Arrays.asList(b3));
+    assertEquals(b1.getBi9s(), Arrays.asList(a1));
+    assertEquals(b1.getBi9List(), Arrays.asList(a1));
+    assertEquals(b2.getBi9s(), Arrays.asList(a1));
+    assertEquals(b2.getBi9List(), Arrays.asList(a1));
+    assertEquals(b3.getBi9s(), Arrays.asList(a3, a1));
+    assertEquals(b3.getBi9List(), Arrays.asList(a3, a1));
+  }
+
+
+  @Test
+  void testImmutableList() {
+    setup();
+
+    a1.addDi3(b1);
+    a1.addDi3(b2);
+    try {
+      a1.getDi3s().add(b3);
+      fail("should throw an exception");
+    } catch (Exception e) {
+      // OK
+    }
+
+    a1.addBi7(b1);
+    a1.addBi7(b2);
+    try {
+      a1.getBi7s().add(b3);
+      fail("should throw an exception");
+    } catch (Exception e) {
+      // OK
+    }
+
+    a1.addBi9(b1);
+    a1.addBi9(b2);
+    try {
+      a1.getBi9s().add(b3);
+      fail("should throw an exception");
+    } catch (Exception e) {
+      // OK
+    }
+  }
+
+  @BeforeEach
+  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/multipleFiles/.gitignore b/tests/multipleFiles/.gitignore
deleted file mode 100644
index bcf9cd3..0000000
--- a/tests/multipleFiles/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-AST/*
-Relations.ast
-Relations.jadd
-AllGen.jadd
-AllGen.ast
\ No newline at end of file
diff --git a/tests/multipleFiles/AbstractTests.java b/tests/multipleFiles/AbstractTests.java
deleted file mode 100644
index 3b86096..0000000
--- a/tests/multipleFiles/AbstractTests.java
+++ /dev/null
@@ -1,25 +0,0 @@
-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/multipleFiles/All.ast b/tests/multipleFiles/All.ast
deleted file mode 100644
index 6241574..0000000
--- a/tests/multipleFiles/All.ast
+++ /dev/null
@@ -1,3 +0,0 @@
-B ::= <Name:String> <_impl_Bi9:ArrayList<A>> <_impl_Bi4:A> <_impl_Bi5:A> <_impl_Bi1:A> <_impl_Bi8:A> <_impl_Bi7:A> <_impl_Bi2:A> <_impl_Bi3:ArrayList<A>> <_impl_Bi6:ArrayList<A>>;
-Root ::= A* B*;
-A ::= <Name:String> <_impl_Bi1:B> <_impl_Bi7:ArrayList<B>> <_impl_Bi5:B> <_impl_Di1:B> <_impl_Bi3:B> <_impl_Di3:ArrayList<B>> <_impl_Bi8:ArrayList<B>> <_impl_Di2:B> <_impl_Bi2:B> <_impl_Bi9:ArrayList<B>> <_impl_Bi6:B> <_impl_Bi4:B>;
diff --git a/tests/multipleFiles/All.jadd b/tests/multipleFiles/All.jadd
deleted file mode 100644
index f6e7bca..0000000
--- a/tests/multipleFiles/All.jadd
+++ /dev/null
@@ -1,560 +0,0 @@
-import java.util.ArrayList;
-import java.util.Collections;
-aspect RelAstAPI {
-  public B.B(String Name) {
-    setName(Name);
-  }
-  public A.A(String Name) {
-    setName(Name);
-  }
-  // rel A.Di1 -> B
-  public B A.getDi1() {
-    return get_impl_Di1();
-  }
-  public void A.setDi1(B o) {
-    assertNotNull(o);
-    set_impl_Di1(o);
-  }
-
-  // rel A.Di2? -> B
-  public B A.getDi2() {
-    return get_impl_Di2();
-  }
-  public void A.setDi2(B o) {
-    set_impl_Di2(o);
-  }
-  public boolean A.hasDi2() {
-    return getDi2() != null;
-  }
-  public void A.clearDi2() {
-    setDi2(null);
-  }
-
-  // rel A.Di3* -> B
-  public java.util.List<B> A.getDi3s() {
-    return getDi3List();
-  }
-  public java.util.List<B> A.getDi3List() {
-    ArrayList<B> l = get_impl_Di3();
-    return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();
-  }
-  public void A.addDi3(B o) {
-    assertNotNull(o);
-    ArrayList<B> list = get_impl_Di3();
-    if (list == null) {
-      list = new ArrayList<>();
-    }
-    list.add(o);
-    set_impl_Di3(list);
-  }
-  public void A.removeDi3(B o) {
-    assertNotNull(o);
-    ArrayList<B> list = get_impl_Di3();
-    if (list != null && list.remove(o)) {
-      set_impl_Di3(list);
-    }
-  }
-
-  // rel A.Bi1 <-> B.Bi1
-  public B A.getBi1() {
-    return get_impl_Bi1();
-  }
-  public void A.setBi1(B o) {
-    assertNotNull(o);
-    if (get_impl_Bi1() != null) {
-      get_impl_Bi1().set_impl_Bi1(null);
-    }
-    if (o != null && o.get_impl_Bi1() != null) {
-      o.get_impl_Bi1().set_impl_Bi1(null);
-    }
-    set_impl_Bi1(o);
-    o.set_impl_Bi1(this);
-  }
-  public A B.getBi1() {
-    return get_impl_Bi1();
-  }
-  public void B.setBi1(A o) {
-    assertNotNull(o);
-    if (get_impl_Bi1() != null) {
-      get_impl_Bi1().set_impl_Bi1(null);
-    }
-    if (o != null && o.get_impl_Bi1() != null) {
-      o.get_impl_Bi1().set_impl_Bi1(null);
-    }
-    set_impl_Bi1(o);
-    o.set_impl_Bi1(this);
-  }
-
-  // rel A.Bi2 <-> B.Bi2?
-  public B A.getBi2() {
-    return get_impl_Bi2();
-  }
-  public void A.setBi2(B o) {
-    assertNotNull(o);
-    if (get_impl_Bi2() != null) {
-      get_impl_Bi2().set_impl_Bi2(null);
-    }
-    if (o != null && o.get_impl_Bi2() != null) {
-      o.get_impl_Bi2().set_impl_Bi2(null);
-    }
-    set_impl_Bi2(o);
-    o.set_impl_Bi2(this);
-  }
-  public A B.getBi2() {
-    return get_impl_Bi2();
-  }
-  public void B.setBi2(A o) {
-    if (get_impl_Bi2() != null) {
-      get_impl_Bi2().set_impl_Bi2(null);
-    }
-    if (o != null && o.get_impl_Bi2() != null) {
-      o.get_impl_Bi2().set_impl_Bi2(null);
-    }
-    set_impl_Bi2(o);
-    if (o != null) {
-      o.set_impl_Bi2(this);
-    }
-  }
-  public boolean B.hasBi2() {
-    return getBi2() != null;
-  }
-  public void B.clearBi2() {
-    setBi2(null);
-  }
-
-  // rel A.Bi3 <-> B.Bi3*
-  public B A.getBi3() {
-    return get_impl_Bi3();
-  }
-  public void A.setBi3(B o) {
-    assertNotNull(o);
-    if (get_impl_Bi3() != null) {
-      ArrayList<A> list2 = get_impl_Bi3().get_impl_Bi3();
-      list2.remove(this);
-      get_impl_Bi3().set_impl_Bi3(list2);
-    }
-    set_impl_Bi3(o);
-    ArrayList<A> list = o.get_impl_Bi3();
-    if (list == null) {
-      list = new ArrayList<>();
-    }
-    list.add(this);
-    o.set_impl_Bi3(list);
-  }
-  public java.util.List<A> B.getBi3s() {
-    return getBi3List();
-  }
-  public java.util.List<A> B.getBi3List() {
-    ArrayList<A> l = get_impl_Bi3();
-    return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();
-  }
-  public void B.addBi3(A o) {
-    assertNotNull(o);
-    if (o != null && o.get_impl_Bi3() != null) {
-      ArrayList<A> list2 = o.get_impl_Bi3().get_impl_Bi3();
-      if (list2.remove(o))
-        o.get_impl_Bi3().set_impl_Bi3(list2);
-    }
-    ArrayList<A> list = get_impl_Bi3();
-    if (list == null) {
-      list = new ArrayList<>();
-    }
-    list.add(o);
-    set_impl_Bi3(list);
-    o.set_impl_Bi3(this);
-  }
-  public void B.removeBi3(A o) {
-    assertNotNull(o);
-    ArrayList<A> list = get_impl_Bi3();
-    if (list != null && list.remove(o)) {
-      set_impl_Bi3(list);
-      if (o.get_impl_Bi3() == this) {
-        o.set_impl_Bi3(null);
-      }
-    }
-  }
-
-  // rel A.Bi4? <-> B.Bi4
-  public B A.getBi4() {
-    return get_impl_Bi4();
-  }
-  public void A.setBi4(B o) {
-    if (get_impl_Bi4() != null) {
-      get_impl_Bi4().set_impl_Bi4(null);
-    }
-    if (o != null && o.get_impl_Bi4() != null) {
-      o.get_impl_Bi4().set_impl_Bi4(null);
-    }
-    set_impl_Bi4(o);
-    if (o != null) {
-      o.set_impl_Bi4(this);
-    }
-  }
-  public boolean A.hasBi4() {
-    return getBi4() != null;
-  }
-  public void A.clearBi4() {
-    setBi4(null);
-  }
-  public A B.getBi4() {
-    return get_impl_Bi4();
-  }
-  public void B.setBi4(A o) {
-    assertNotNull(o);
-    if (get_impl_Bi4() != null) {
-      get_impl_Bi4().set_impl_Bi4(null);
-    }
-    if (o != null && o.get_impl_Bi4() != null) {
-      o.get_impl_Bi4().set_impl_Bi4(null);
-    }
-    set_impl_Bi4(o);
-    o.set_impl_Bi4(this);
-  }
-
-  // rel A.Bi5? <-> B.Bi5?
-  public B A.getBi5() {
-    return get_impl_Bi5();
-  }
-  public void A.setBi5(B o) {
-    if (get_impl_Bi5() != null) {
-      get_impl_Bi5().set_impl_Bi5(null);
-    }
-    if (o != null && o.get_impl_Bi5() != null) {
-      o.get_impl_Bi5().set_impl_Bi5(null);
-    }
-    set_impl_Bi5(o);
-    if (o != null) {
-      o.set_impl_Bi5(this);
-    }
-  }
-  public boolean A.hasBi5() {
-    return getBi5() != null;
-  }
-  public void A.clearBi5() {
-    setBi5(null);
-  }
-  public A B.getBi5() {
-    return get_impl_Bi5();
-  }
-  public void B.setBi5(A o) {
-    if (get_impl_Bi5() != null) {
-      get_impl_Bi5().set_impl_Bi5(null);
-    }
-    if (o != null && o.get_impl_Bi5() != null) {
-      o.get_impl_Bi5().set_impl_Bi5(null);
-    }
-    set_impl_Bi5(o);
-    if (o != null) {
-      o.set_impl_Bi5(this);
-    }
-  }
-  public boolean B.hasBi5() {
-    return getBi5() != null;
-  }
-  public void B.clearBi5() {
-    setBi5(null);
-  }
-
-  // rel A.Bi6? <-> B.Bi6*
-  public B A.getBi6() {
-    return get_impl_Bi6();
-  }
-  public void A.setBi6(B o) {
-    if (get_impl_Bi6() != null) {
-      ArrayList<A> list2 = get_impl_Bi6().get_impl_Bi6();
-      list2.remove(this);
-      get_impl_Bi6().set_impl_Bi6(list2);
-    }
-    set_impl_Bi6(o);
-    if (o != null) {
-      ArrayList<A> list = o.get_impl_Bi6();
-      if (list == null) {
-        list = new ArrayList<>();
-      }
-      list.add(this);
-      o.set_impl_Bi6(list);
-    }
-  }
-  public boolean A.hasBi6() {
-    return getBi6() != null;
-  }
-  public void A.clearBi6() {
-    setBi6(null);
-  }
-  public java.util.List<A> B.getBi6s() {
-    return getBi6List();
-  }
-  public java.util.List<A> B.getBi6List() {
-    ArrayList<A> l = get_impl_Bi6();
-    return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();
-  }
-  public void B.addBi6(A o) {
-    assertNotNull(o);
-    if (o != null && o.get_impl_Bi6() != null) {
-      ArrayList<A> list2 = o.get_impl_Bi6().get_impl_Bi6();
-      if (list2.remove(o))
-        o.get_impl_Bi6().set_impl_Bi6(list2);
-    }
-    ArrayList<A> list = get_impl_Bi6();
-    if (list == null) {
-      list = new ArrayList<>();
-    }
-    list.add(o);
-    set_impl_Bi6(list);
-    o.set_impl_Bi6(this);
-  }
-  public void B.removeBi6(A o) {
-    assertNotNull(o);
-    ArrayList<A> list = get_impl_Bi6();
-    if (list != null && list.remove(o)) {
-      set_impl_Bi6(list);
-      if (o.get_impl_Bi6() == this) {
-        o.set_impl_Bi6(null);
-      }
-    }
-  }
-
-  // rel A.Bi7* <-> B.Bi7
-  public java.util.List<B> A.getBi7s() {
-    return getBi7List();
-  }
-  public java.util.List<B> A.getBi7List() {
-    ArrayList<B> l = get_impl_Bi7();
-    return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();
-  }
-  public void A.addBi7(B o) {
-    assertNotNull(o);
-    if (o != null && o.get_impl_Bi7() != null) {
-      ArrayList<B> list2 = o.get_impl_Bi7().get_impl_Bi7();
-      if (list2.remove(o))
-        o.get_impl_Bi7().set_impl_Bi7(list2);
-    }
-    ArrayList<B> list = get_impl_Bi7();
-    if (list == null) {
-      list = new ArrayList<>();
-    }
-    list.add(o);
-    set_impl_Bi7(list);
-    o.set_impl_Bi7(this);
-  }
-  public void A.removeBi7(B o) {
-    assertNotNull(o);
-    ArrayList<B> list = get_impl_Bi7();
-    if (list != null && list.remove(o)) {
-      set_impl_Bi7(list);
-      if (o.get_impl_Bi7() == this) {
-        o.set_impl_Bi7(null);
-      }
-    }
-  }
-  public A B.getBi7() {
-    return get_impl_Bi7();
-  }
-  public void B.setBi7(A o) {
-    assertNotNull(o);
-    if (get_impl_Bi7() != null) {
-      ArrayList<B> list2 = get_impl_Bi7().get_impl_Bi7();
-      list2.remove(this);
-      get_impl_Bi7().set_impl_Bi7(list2);
-    }
-    set_impl_Bi7(o);
-    ArrayList<B> list = o.get_impl_Bi7();
-    if (list == null) {
-      list = new ArrayList<>();
-    }
-    list.add(this);
-    o.set_impl_Bi7(list);
-  }
-
-  // rel A.Bi8* <-> B.Bi8?
-  public java.util.List<B> A.getBi8s() {
-    return getBi8List();
-  }
-  public java.util.List<B> A.getBi8List() {
-    ArrayList<B> l = get_impl_Bi8();
-    return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();
-  }
-  public void A.addBi8(B o) {
-    assertNotNull(o);
-    if (o != null && o.get_impl_Bi8() != null) {
-      ArrayList<B> list2 = o.get_impl_Bi8().get_impl_Bi8();
-      if (list2.remove(o))
-        o.get_impl_Bi8().set_impl_Bi8(list2);
-    }
-    ArrayList<B> list = get_impl_Bi8();
-    if (list == null) {
-      list = new ArrayList<>();
-    }
-    list.add(o);
-    set_impl_Bi8(list);
-    o.set_impl_Bi8(this);
-  }
-  public void A.removeBi8(B o) {
-    assertNotNull(o);
-    ArrayList<B> list = get_impl_Bi8();
-    if (list != null && list.remove(o)) {
-      set_impl_Bi8(list);
-      if (o.get_impl_Bi8() == this) {
-        o.set_impl_Bi8(null);
-      }
-    }
-  }
-  public A B.getBi8() {
-    return get_impl_Bi8();
-  }
-  public void B.setBi8(A o) {
-    if (get_impl_Bi8() != null) {
-      ArrayList<B> list2 = get_impl_Bi8().get_impl_Bi8();
-      list2.remove(this);
-      get_impl_Bi8().set_impl_Bi8(list2);
-    }
-    set_impl_Bi8(o);
-    if (o != null) {
-      ArrayList<B> list = o.get_impl_Bi8();
-      if (list == null) {
-        list = new ArrayList<>();
-      }
-      list.add(this);
-      o.set_impl_Bi8(list);
-    }
-  }
-  public boolean B.hasBi8() {
-    return getBi8() != null;
-  }
-  public void B.clearBi8() {
-    setBi8(null);
-  }
-
-  // rel A.Bi9* <-> B.Bi9*
-  public java.util.List<B> A.getBi9s() {
-    return getBi9List();
-  }
-  public java.util.List<B> A.getBi9List() {
-    ArrayList<B> l = get_impl_Bi9();
-    return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();
-  }
-  public void A.addBi9(B o) {
-    assertNotNull(o);
-    ArrayList<B> list = get_impl_Bi9();
-    if (list == null) {
-      list = new ArrayList<>();
-    }
-    ArrayList<A> list2 = o.get_impl_Bi9();
-    if (list2 == null) {
-      list2 = new ArrayList<>();
-    }
-    list.add(o);
-    list2.add(this);
-    set_impl_Bi9(list);
-    o.set_impl_Bi9(list2);
-  }
-  public void A.removeBi9(B o) {
-    assertNotNull(o);
-    ArrayList<B> list = get_impl_Bi9();
-    if (list != null && list.remove(o)) {
-      ArrayList<A> list2 = o.get_impl_Bi9();
-      if (list2 != null) list2.remove(this);
-      set_impl_Bi9(list);
-      o.set_impl_Bi9(list2);
-    }
-  }
-  public java.util.List<A> B.getBi9s() {
-    return getBi9List();
-  }
-  public java.util.List<A> B.getBi9List() {
-    ArrayList<A> l = get_impl_Bi9();
-    return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();
-  }
-  public void B.addBi9(A o) {
-    assertNotNull(o);
-    ArrayList<A> list = get_impl_Bi9();
-    if (list == null) {
-      list = new ArrayList<>();
-    }
-    ArrayList<B> list2 = o.get_impl_Bi9();
-    if (list2 == null) {
-      list2 = new ArrayList<>();
-    }
-    list.add(o);
-    list2.add(this);
-    set_impl_Bi9(list);
-    o.set_impl_Bi9(list2);
-  }
-  public void B.removeBi9(A o) {
-    assertNotNull(o);
-    ArrayList<A> list = get_impl_Bi9();
-    if (list != null && list.remove(o)) {
-      ArrayList<B> list2 = o.get_impl_Bi9();
-      if (list2 != null) list2.remove(this);
-      set_impl_Bi9(list);
-      o.set_impl_Bi9(list2);
-    }
-  }
-
-  public boolean ASTNode.violatesLowerBounds() {
-    return !getLowerBoundsViolations().isEmpty();
-  }
-  public java.util.List<Pair<ASTNode, String>> ASTNode.getLowerBoundsViolations() {
-    ArrayList<Pair<ASTNode, String>> list = new ArrayList<>();
-    computeLowerBoundsViolations(list);
-    return list;
-  }
-  public void ASTNode.computeLowerBoundsViolations(java.util.List<Pair<ASTNode, String>> list) {
-    for (int i = 0; i < getNumChildNoTransform(); i++) {
-      getChildNoTransform(i).computeLowerBoundsViolations(list);
-    }
-  }
-  public void B.computeLowerBoundsViolations(java.util.List<Pair<ASTNode, String>> list) {
-    if (getBi4() == null) {
-      list.add(new Pair<>(this, "Bi4"));
-    }
-    if (getBi1() == null) {
-      list.add(new Pair<>(this, "Bi1"));
-    }
-    if (getBi7() == null) {
-      list.add(new Pair<>(this, "Bi7"));
-    }
-    super.computeLowerBoundsViolations(list);
-  }
-  public void A.computeLowerBoundsViolations(java.util.List<Pair<ASTNode, String>> list) {
-    if (getBi1() == null) {
-      list.add(new Pair<>(this, "Bi1"));
-    }
-    if (getDi1() == null) {
-      list.add(new Pair<>(this, "Di1"));
-    }
-    if (getBi3() == null) {
-      list.add(new Pair<>(this, "Bi3"));
-    }
-    if (getBi2() == null) {
-      list.add(new Pair<>(this, "Bi2"));
-    }
-    super.computeLowerBoundsViolations(list);
-  }
-  public class Pair<T1, T2> {
-    public final T1 _1;
-    public final T2 _2;
-    public Pair(T1 _1, T2 _2) {
-      ASTNode.assertNotNull(_1);
-      ASTNode.assertNotNull(_2);
-      this._1 = _1;
-      this._2 = _2;
-    }
-    public boolean equals(Object other) {
-      if (other instanceof Pair) {
-        Pair<?,?> p = (Pair<?,?>) other;
-        return _1.equals(p._1) && _2.equals(p._2);
-      } else {
-        return false;
-      }
-    }
-    public int hashCode() {
-      return 31*_1.hashCode() + _2.hashCode();
-    }
-  }
-  public static void ASTNode.assertNotNull(Object obj) {
-    if (obj == null) {
-      throw new NullPointerException();
-    }
-  }
-}
diff --git a/tests/multipleFiles/All.java b/tests/multipleFiles/All.java
deleted file mode 100644
index 404f3fc..0000000
--- a/tests/multipleFiles/All.java
+++ /dev/null
@@ -1,629 +0,0 @@
-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() {
-		testDi1();
-		testDi2();
-		testDi3();
-
-		testBi1();
-		testBi2();
-		testBi3();
-		testBi4();
-		testBi5();
-		testBi6();
-		testBi7();
-		testBi8();
-		testBi9();
-
-		testImmutableList();
-	}
-
-	/**
-	 * rel A.Di1 -> B;
-	 */
-	private void testDi1() {
-		setup();
-		a1.setDi1(b2);
-		a2.setDi1(b1);
-
-		assertSame(a1.getDi1(), b2);
-		assertSame(a2.getDi1(), b1);
-
-		a2.setDi1(b2);
-
-		assertSame(a1.getDi1(), b2);
-		assertSame(a2.getDi1(), b2);
-
-		try {
-			a3.setDi1(null);
-			assertException();
-		} catch (Exception e) {
-			// OK
-		}
-	}
-
-
-	/**
-	 * rel A.Di2? -> B;
-	 */
-	private void testDi2() {
-		setup();
-		a1.setDi2(b2);
-		a2.setDi2(b1);
-
-		assertSame(a1.getDi2(), b2);
-		assertSame(a2.getDi2(), b1);
-
-		a2.setDi2(b2);
-
-		assertSame(a1.getDi2(), b2);
-		assertSame(a2.getDi2(), b2);
-
-		a2.clearDi2();
-
-		assertSame(a1.getDi2(), b2);
-		assertNull(a2.getDi2());
-
-		assertTrue(a1.hasDi2());
-		assertFalse(a2.hasDi2());
-		assertFalse(a3.hasDi2());
-	}
-
-
-	/**
-	 * rel A.Di3* -> B;
-	 */
-	private void testDi3() {
-		setup();
-		a1.addDi3(b1);
-		a1.addDi3(b2);
-		a1.addDi3(b3);
-		a2.addDi3(b2);
-		
-		assertEquals(a1.getDi3s(), Arrays.asList(b1, b2, b3));
-		assertEquals(a1.getDi3List(), Arrays.asList(b1, b2, b3));
-		assertEquals(a2.getDi3s(), Arrays.asList(b2));
-		assertEquals(a2.getDi3List(), Arrays.asList(b2));
-		assertEquals(a3.getDi3s(), Arrays.asList());
-		assertEquals(a3.getDi3List(), Arrays.asList());
-
-		a1.addDi3(b1);
-		a2.addDi3(b1);
-		a2.addDi3(b2);
-
-		assertEquals(a1.getDi3s(), Arrays.asList(b1, b2, b3, b1));
-		assertEquals(a1.getDi3List(), Arrays.asList(b1, b2, b3, b1));
-		assertEquals(a2.getDi3s(), Arrays.asList(b2, b1, b2));
-		assertEquals(a2.getDi3List(), Arrays.asList(b2, b1, b2));
-		assertEquals(a3.getDi3s(), Arrays.asList());
-		assertEquals(a3.getDi3List(), Arrays.asList());
-
-		a1.removeDi3(b1);
-		a2.removeDi3(b2);
-
-		assertEquals(a1.getDi3s(), Arrays.asList(b2, b3, b1));
-		assertEquals(a1.getDi3List(), Arrays.asList(b2, b3, b1));
-		assertEquals(a2.getDi3s(), Arrays.asList(b1, b2));
-		assertEquals(a2.getDi3List(), Arrays.asList(b1, b2));
-		assertEquals(a3.getDi3s(), Arrays.asList());
-		assertEquals(a3.getDi3List(), Arrays.asList());
-	}
-
-
-	/**
-	 * rel A.Bi1 <-> B.Bi1;
-	 */
-	private void testBi1() {
-		testBi11();
-		testBi12();
-	}
-	private void testBi11() {
-		// Init
-		setup();
-		a1.setBi1(b1);
-		a2.setBi1(b2);
-
-		// Change
-		a2.setBi1(b1);
-
-		assertNull(a1.getBi1());
-		assertSame(a2.getBi1(), b1);
-		assertSame(b1.getBi1(), a2);
-		assertNull(b2.getBi1());
-	}
-	private void testBi12() {
-		// Init
-		setup();
-		a1.setBi1(b2);
-
-		// Change
-		a2.setBi1(b2);
-
-		assertNull(a1.getBi1());
-		assertSame(a2.getBi1(), b2);
-		assertNull(b1.getBi1());
-		assertSame(b2.getBi1(), a2);
-	}
-
-
-
-	/**
-	 * rel A.Bi2 <-> B.Bi2?;
-	 */
-	private void testBi2() {
-		testBi21();
-		testBi22();
-	}
-	private void testBi21() {
-		// Init
-		setup();
-		a1.setBi2(b1);
-		a2.setBi2(b2);
-
-		// Change
-		a2.setBi2(b1);
-
-		assertNull(a1.getBi2());
-		assertSame(a2.getBi2(), b1);
-		assertSame(b1.getBi2(), a2);
-		assertNull(b2.getBi2());
-	}
-	private void testBi22() {
-		// Init
-		setup();
-		a1.setBi2(b2);
-
-		// Change
-		a2.setBi2(b2);
-
-		assertNull(a1.getBi2());
-		assertSame(a2.getBi2(), b2);
-		assertNull(b1.getBi2());
-		assertSame(b2.getBi2(), a2);
-	}
-
-
-
-	/**
-	 * rel A.Bi3 <-> B.Bi3*;
-	 */
-	private void testBi3() {
-		setup();
-		a2.setBi3(b2);
-
-		assertNull(a1.getBi3());
-		assertSame(a2.getBi3(), b2);
-		assertEquals(b1.getBi3s(), Arrays.asList());
-		assertEquals(b1.getBi3List(), Arrays.asList());
-		assertEquals(b2.getBi3s(), Arrays.asList(a2));
-		assertEquals(b2.getBi3List(), Arrays.asList(a2));
-		assertEquals(b3.getBi3s(), Arrays.asList());
-		assertEquals(b3.getBi3List(), Arrays.asList());
-
-		a2.setBi3(b3);
-
-		assertNull(a1.getBi3());
-		assertSame(a2.getBi3(), b3);
-		assertEquals(b1.getBi3s(), Arrays.asList());
-		assertEquals(b1.getBi3List(), Arrays.asList());
-		assertEquals(b2.getBi3s(), Arrays.asList());
-		assertEquals(b2.getBi3List(), Arrays.asList());
-		assertEquals(b3.getBi3s(), Arrays.asList(a2));
-		assertEquals(b3.getBi3List(), Arrays.asList(a2));
-
-		a1.setBi3(b3);
-		a3.setBi3(b3);
-
-		assertSame(a1.getBi3(), b3);
-		assertSame(a2.getBi3(), b3);
-		assertSame(a3.getBi3(), b3);
-		assertEquals(b1.getBi3s(), Arrays.asList());
-		assertEquals(b1.getBi3List(), Arrays.asList());
-		assertEquals(b2.getBi3s(), Arrays.asList());
-		assertEquals(b2.getBi3List(), Arrays.asList());
-		assertEquals(b3.getBi3s(), Arrays.asList(a2, a1, a3));
-		assertEquals(b3.getBi3List(), Arrays.asList(a2, a1, a3));
-
-		a2.setBi3(b1);
-
-		assertSame(a1.getBi3(), b3);
-		assertSame(a2.getBi3(), b1);
-		assertSame(a3.getBi3(), b3);
-		assertEquals(b1.getBi3s(), Arrays.asList(a2));
-		assertEquals(b1.getBi3List(), Arrays.asList(a2));
-		assertEquals(b2.getBi3s(), Arrays.asList());
-		assertEquals(b2.getBi3List(), Arrays.asList());
-		assertEquals(b3.getBi3s(), Arrays.asList(a1, a3));
-		assertEquals(b3.getBi3List(), Arrays.asList(a1, a3));
-
-		try {
-			a2.setBi3(null);
-			assertException();
-		} catch (Exception e) {
-			// OK
-		}
-	}
-
-
-
-	/**
-	 * rel A.Bi4? <-> B.Bi4;
-	 */
-	private void testBi4() {
-		testBi41();
-		testBi42();
-	}
-	private void testBi41() {
-		// Init
-		setup();
-		a1.setBi4(b1);
-		a2.setBi4(b2);
-
-		// Change
-		a2.setBi4(b1);
-
-		assertNull(a1.getBi4());
-		assertSame(a2.getBi4(), b1);
-		assertSame(b1.getBi4(), a2);
-		assertNull(b2.getBi4());
-	}
-	private void testBi42() {
-		// Init
-		setup();
-		a1.setBi4(b2);
-
-		// Change
-		a2.setBi4(b2);
-
-		assertNull(a1.getBi4());
-		assertSame(a2.getBi4(), b2);
-		assertNull(b1.getBi4());
-		assertSame(b2.getBi4(), a2);
-	}
-
-
-
-	/**
-	 * rel A.Bi5? <-> B.Bi5?;
-	 */
-	private void testBi5() {
-		testBi51();
-		testBi52();
-	}
-	private void testBi51() {
-		// Init
-		setup();
-		a1.setBi5(b1);
-		a2.setBi5(b2);
-
-		// Change
-		a2.setBi5(b1);
-
-		assertNull(a1.getBi5());
-		assertSame(a2.getBi5(), b1);
-		assertSame(b1.getBi5(), a2);
-		assertNull(b2.getBi5());
-	}
-	private void testBi52() {
-		// Init
-		setup();
-		a1.setBi5(b2);
-
-		// Change
-		a2.setBi5(b2);
-
-		assertNull(a1.getBi5());
-		assertSame(a2.getBi5(), b2);
-		assertNull(b1.getBi5());
-		assertSame(b2.getBi5(), a2);
-	}
-
-
-
-	/**
-	 * rel A.Bi6? <-> B.Bi6*;
-	 */
-	private void testBi6() {
-		setup();
-		a2.setBi6(b2);
-
-		assertNull(a1.getBi6());
-		assertSame(a2.getBi6(), b2);
-		assertEquals(b1.getBi6s(), Arrays.asList());
-		assertEquals(b1.getBi6List(), Arrays.asList());
-		assertEquals(b2.getBi6s(), Arrays.asList(a2));
-		assertEquals(b2.getBi6List(), Arrays.asList(a2));
-		assertEquals(b3.getBi6s(), Arrays.asList());
-		assertEquals(b3.getBi6List(), Arrays.asList());
-
-		a2.setBi6(b3);
-
-		assertNull(a1.getBi6());
-		assertSame(a2.getBi6(), b3);
-		assertEquals(b1.getBi6s(), Arrays.asList());
-		assertEquals(b1.getBi6List(), Arrays.asList());
-		assertEquals(b2.getBi6s(), Arrays.asList());
-		assertEquals(b2.getBi6List(), Arrays.asList());
-		assertEquals(b3.getBi6s(), Arrays.asList(a2));
-		assertEquals(b3.getBi6List(), Arrays.asList(a2));
-
-		a1.setBi6(b3);
-		a3.setBi6(b3);
-
-		assertSame(a1.getBi6(), b3);
-		assertSame(a2.getBi6(), b3);
-		assertSame(a3.getBi6(), b3);
-		assertEquals(b1.getBi6s(), Arrays.asList());
-		assertEquals(b1.getBi6List(), Arrays.asList());
-		assertEquals(b2.getBi6s(), Arrays.asList());
-		assertEquals(b2.getBi6List(), Arrays.asList());
-		assertEquals(b3.getBi6s(), Arrays.asList(a2, a1, a3));
-		assertEquals(b3.getBi6List(), Arrays.asList(a2, a1, a3));
-
-		a2.setBi6(b1);
-
-		assertSame(a1.getBi6(), b3);
-		assertSame(a2.getBi6(), b1);
-		assertSame(a3.getBi6(), b3);
-		assertEquals(b1.getBi6s(), Arrays.asList(a2));
-		assertEquals(b1.getBi6List(), Arrays.asList(a2));
-		assertEquals(b2.getBi6s(), Arrays.asList());
-		assertEquals(b2.getBi6List(), Arrays.asList());
-		assertEquals(b3.getBi6s(), Arrays.asList(a1, a3));
-		assertEquals(b3.getBi6List(), Arrays.asList(a1, a3));
-
-		a2.clearBi6();
-
-		assertSame(a1.getBi6(), b3);
-		assertNull(a2.getBi6());
-		assertSame(a3.getBi6(), b3);
-		assertEquals(b1.getBi6s(), Arrays.asList());
-		assertEquals(b1.getBi6List(), Arrays.asList());
-		assertEquals(b2.getBi6s(), Arrays.asList());
-		assertEquals(b2.getBi6List(), Arrays.asList());
-		assertEquals(b3.getBi6s(), Arrays.asList(a1, a3));
-		assertEquals(b3.getBi6List(), Arrays.asList(a1, a3));
-
-		assertTrue(a1.hasBi6());
-		assertFalse(a2.hasBi6());
-		assertTrue(a3.hasBi6());
-	}
-
-
-
-	/**
-	 * rel A.Bi7* <-> B.Bi7;
-	 */
-	private void testBi7() {
-		setup();
-		a2.addBi7(b2);
-
-		assertEquals(a1.getBi7s(), Arrays.asList());
-		assertEquals(a1.getBi7List(), Arrays.asList());
-		assertEquals(a2.getBi7s(), Arrays.asList(b2));
-		assertEquals(a2.getBi7List(), Arrays.asList(b2));
-		assertNull(b1.getBi7());
-		assertSame(b2.getBi7(), a2);
-		assertNull(b3.getBi7());
-
-		a2.addBi7(b3);
-		a1.addBi7(b2);
-
-		assertEquals(a1.getBi7s(), Arrays.asList(b2));
-		assertEquals(a1.getBi7List(), Arrays.asList(b2));
-		assertEquals(a2.getBi7s(), Arrays.asList(b3));
-		assertEquals(a2.getBi7List(), Arrays.asList(b3));
-		assertNull(b1.getBi7());
-		assertSame(b2.getBi7(), a1);
-		assertSame(b3.getBi7(), a2);
-
-		a1.addBi7(b1);
-
-		assertEquals(a1.getBi7s(), Arrays.asList(b2, b1));
-		assertEquals(a1.getBi7List(), Arrays.asList(b2, b1));
-		assertEquals(a2.getBi7s(), Arrays.asList(b3));
-		assertEquals(a2.getBi7List(), Arrays.asList(b3));
-		assertSame(b1.getBi7(), a1);
-		assertSame(b2.getBi7(), a1);
-		assertSame(b3.getBi7(), a2);
-
-		a1.addBi7(b1);
-
-		assertEquals(a1.getBi7s(), Arrays.asList(b2, b1));
-		assertEquals(a1.getBi7List(), Arrays.asList(b2, b1));
-		assertEquals(a2.getBi7s(), Arrays.asList(b3));
-		assertEquals(a2.getBi7List(), Arrays.asList(b3));
-		assertSame(b1.getBi7(), a1);
-		assertSame(b2.getBi7(), a1);
-		assertSame(b3.getBi7(), a2);
-
-		a1.removeBi7(b1);
-
-		assertEquals(a1.getBi7s(), Arrays.asList(b2));
-		assertEquals(a1.getBi7List(), Arrays.asList(b2));
-		assertEquals(a2.getBi7s(), Arrays.asList(b3));
-		assertEquals(a2.getBi7List(), Arrays.asList(b3));
-		assertNull(b1.getBi7());
-		assertSame(b2.getBi7(), a1);
-		assertSame(b3.getBi7(), a2);
-	}
-
-
-
-	/**
-	 * rel A.Bi8* <-> B.Bi8?;
-	 */
-	private void testBi8() {
-		setup();
-		a2.addBi8(b2);
-
-		assertEquals(a1.getBi8s(), Arrays.asList());
-		assertEquals(a1.getBi8List(), Arrays.asList());
-		assertEquals(a2.getBi8s(), Arrays.asList(b2));
-		assertEquals(a2.getBi8List(), Arrays.asList(b2));
-		assertNull(b1.getBi8());
-		assertSame(b2.getBi8(), a2);
-		assertNull(b3.getBi8());
-
-		a2.addBi8(b3);
-		a1.addBi8(b2);
-
-		assertEquals(a1.getBi8s(), Arrays.asList(b2));
-		assertEquals(a1.getBi8List(), Arrays.asList(b2));
-		assertEquals(a2.getBi8s(), Arrays.asList(b3));
-		assertEquals(a2.getBi8List(), Arrays.asList(b3));
-		assertNull(b1.getBi8());
-		assertSame(b2.getBi8(), a1);
-		assertSame(b3.getBi8(), a2);
-
-		a1.addBi8(b1);
-
-		assertEquals(a1.getBi8s(), Arrays.asList(b2, b1));
-		assertEquals(a1.getBi8List(), Arrays.asList(b2, b1));
-		assertEquals(a2.getBi8s(), Arrays.asList(b3));
-		assertEquals(a2.getBi8List(), Arrays.asList(b3));
-		assertSame(b1.getBi8(), a1);
-		assertSame(b2.getBi8(), a1);
-		assertSame(b3.getBi8(), a2);
-
-		a1.addBi8(b1);
-
-		assertEquals(a1.getBi8s(), Arrays.asList(b2, b1));
-		assertEquals(a1.getBi8List(), Arrays.asList(b2, b1));
-		assertEquals(a2.getBi8s(), Arrays.asList(b3));
-		assertEquals(a2.getBi8List(), Arrays.asList(b3));
-		assertSame(b1.getBi8(), a1);
-		assertSame(b2.getBi8(), a1);
-		assertSame(b3.getBi8(), a2);
-
-		a1.removeBi8(b1);
-
-		assertEquals(a1.getBi8s(), Arrays.asList(b2));
-		assertEquals(a1.getBi8List(), Arrays.asList(b2));
-		assertEquals(a2.getBi8s(), Arrays.asList(b3));
-		assertEquals(a2.getBi8List(), Arrays.asList(b3));
-		assertNull(b1.getBi8());
-		assertSame(b2.getBi8(), a1);
-		assertSame(b3.getBi8(), a2);
-	}
-
-
-
-	/**
-	 * rel A.Bi9* <-> B.Bi9*;
-	 */
-	private void testBi9() {
-		setup();
-		a1.addBi9(b1);
-		a1.addBi9(b2);
-
-		assertEquals(a1.getBi9s(), Arrays.asList(b1, b2));
-		assertEquals(a1.getBi9List(), Arrays.asList(b1, b2));
-		assertEquals(a2.getBi9s(), Arrays.asList());
-		assertEquals(a2.getBi9List(), Arrays.asList());
-		assertEquals(a3.getBi9s(), Arrays.asList());
-		assertEquals(a3.getBi9List(), Arrays.asList());
-		assertEquals(b1.getBi9s(), Arrays.asList(a1));
-		assertEquals(b1.getBi9List(), Arrays.asList(a1));
-		assertEquals(b2.getBi9s(), Arrays.asList(a1));
-		assertEquals(b2.getBi9List(), Arrays.asList(a1));
-		assertEquals(b3.getBi9s(), Arrays.asList());
-		assertEquals(b3.getBi9List(), Arrays.asList());
-
-		b3.addBi9(a1);
-		b3.addBi9(a3);
-		b3.addBi9(a1);
-
-		assertEquals(a1.getBi9s(), Arrays.asList(b1, b2, b3, b3));
-		assertEquals(a1.getBi9List(), Arrays.asList(b1, b2, b3, b3));
-		assertEquals(a2.getBi9s(), Arrays.asList());
-		assertEquals(a2.getBi9List(), Arrays.asList());
-		assertEquals(a3.getBi9s(), Arrays.asList(b3));
-		assertEquals(a3.getBi9List(), Arrays.asList(b3));
-		assertEquals(b1.getBi9s(), Arrays.asList(a1));
-		assertEquals(b1.getBi9List(), Arrays.asList(a1));
-		assertEquals(b2.getBi9s(), Arrays.asList(a1));
-		assertEquals(b2.getBi9List(), Arrays.asList(a1));
-		assertEquals(b3.getBi9s(), Arrays.asList(a1, a3, a1));
-		assertEquals(b3.getBi9List(), Arrays.asList(a1, a3, a1));
-
-		b3.removeBi9(a1);
-
-		assertEquals(a1.getBi9s(), Arrays.asList(b1, b2, b3));
-		assertEquals(a1.getBi9List(), Arrays.asList(b1, b2, b3));
-		assertEquals(a2.getBi9s(), Arrays.asList());
-		assertEquals(a2.getBi9List(), Arrays.asList());
-		assertEquals(a3.getBi9s(), Arrays.asList(b3));
-		assertEquals(a3.getBi9List(), Arrays.asList(b3));
-		assertEquals(b1.getBi9s(), Arrays.asList(a1));
-		assertEquals(b1.getBi9List(), Arrays.asList(a1));
-		assertEquals(b2.getBi9s(), Arrays.asList(a1));
-		assertEquals(b2.getBi9List(), Arrays.asList(a1));
-		assertEquals(b3.getBi9s(), Arrays.asList(a3, a1));
-		assertEquals(b3.getBi9List(), Arrays.asList(a3, a1));
-	}
-
-
-	public void testImmutableList() {
-		setup();
-
-		a1.addDi3(b1);
-		a1.addDi3(b2);
-		try {
-			a1.getDi3s().add(b3);
-			assertException();
-		} catch (Exception e) {
-			// OK
-		}
-
-		a1.addBi7(b1);
-		a1.addBi7(b2);
-		try {
-			a1.getBi7s().add(b3);
-			assertException();
-		} catch (Exception e) {
-			// OK
-		}
-
-		a1.addBi9(b1);
-		a1.addBi9(b2);
-		try {
-			a1.getBi9s().add(b3);
-			assertException();
-		} catch (Exception e) {
-			// OK
-		}
-	}
-
-	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/multipleFiles/Makefile b/tests/multipleFiles/Makefile
deleted file mode 100644
index 9a98a4a..0000000
--- a/tests/multipleFiles/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-all: build-jar test
-test: clean test1
-	@echo "#"
-	@echo "# MULTIPLE FILES TESTS OK"
-	@echo "#"
-
-build-jar:
-	(cd ../../ && ./gradlew jar)
-test1:
-	java -jar ../../build/libs/relast.jar Rules1.relast Rules2.relast Rules3.relast --file --grammarName=Relations
-	java -jar ../../tools/jastadd2.jar --package=AST Relations.ast Relations.jadd Utils.jadd
-	javac AST/*.java Relations.java
-	java Relations
-	java -jar ../../build/libs/relast.jar Relations.ast --file --grammarName=AllGen
-	diff Relations.ast AllGen.ast
-
-clean:
-	rm -rf AST
-	rm -f *.class
-	rm -f *.ast
\ No newline at end of file
diff --git a/tests/multipleFiles/Utils.jadd b/tests/multipleFiles/Utils.jadd
deleted file mode 100644
index d7acb1b..0000000
--- a/tests/multipleFiles/Utils.jadd
+++ /dev/null
@@ -1,9 +0,0 @@
-aspect Utils {
-	public String A.toString() {
-		return getName();
-	}
-
-	public String B.toString() {
-		return getName();
-	}
-}
\ No newline at end of file
-- 
GitLab