From f29be4fd8c07885dcd74c3091436bcaf3720e977 Mon Sep 17 00:00:00 2001 From: Lucas <89882946+notbad3500@users.noreply.github.com> Date: Thu, 4 Jul 2024 15:22:05 +0200 Subject: [PATCH] E2E tests done --- pom.xml | 35 +- readme.md | 68 + src/main/resources/input/CompilerInput.java | 1 - src/test/Makefile | 22 +- src/test/java/main/E2EReflectionsTest.java | 2067 ++++++++++++++++++- src/test/java/main/InputFilesTest.java | 144 +- src/test/java/main/MainTest.java | 39 +- src/test/java/main/ReflectionsTest.java | 145 -- src/test/java/semantic/SemanticTest.java | 436 ++++ 9 files changed, 2711 insertions(+), 246 deletions(-) create mode 100644 readme.md delete mode 100644 src/test/java/main/ReflectionsTest.java diff --git a/pom.xml b/pom.xml index 4712163..84326da 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,24 @@ 5.11.0-M2 test + + org.junit.platform + junit-platform-suite-engine + 1.11.0-M2 + test + + + org.junit.jupiter + junit-jupiter-api + 5.11.0-M2 + test + + + junit + junit + 4.13.1 + test + org.antlr antlr4-runtime @@ -44,18 +62,6 @@ 3.26.0 test - - org.junit.jupiter - junit-jupiter-api - 5.11.0-M2 - test - - - org.mockito - mockito-core - 5.11.0 - test - @@ -65,6 +71,11 @@ org.apache.maven.plugins maven-surefire-plugin 3.0.0-M5 + + + **/*Test.java + + maven-assembly-plugin diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..fc72bb8 --- /dev/null +++ b/readme.md @@ -0,0 +1,68 @@ +# "Nicht Haskel 2.0" Java Compiler + +Realisation of a subset of the Java Standard Compiler in the course Compiler Construction of the 4th semester Computer Science at the Duale Hochschule Suttgart (Horb). + +This project aims to provide a simplified version of the Java compiler, focusing on key language features and demonstrating the principles of compiler construction. + +## Realised Java syntax + +- **Data types**: `int`, `boolean`, `char` +- **Access modifier**: `public`, `protected`, `private` +- **Operators**: `=` `+` `-` `*` `%` `/` `>` `<` `>=` `<=` `==` `!=` `!` `&&` `||` `++` `--` +- **Keywords**: `class`, `this`, `while`, `do`, `if`, `else`, `for`, `return`, `new`, `switch`, `case`, `break`, `default`, `:` +- **Statements**: + - `if` ... `if else` ... `else`; + - `while` ... ; + - `do` ... `while`; + - `for`; + - `switch` ... `case` ... ; +- **Comments**: + - Single line: `// comment` + - Multi-line: `/* comment */` +- **Further functions**: + - All methods are overloadable + - High maintainability and expandability through implementation of the visitor pattern + - Logging Input and Outputs + - Error Handling in the Semantic Check + +## Project Structure + +```plain +src/ +└── main/ + ├── java/ + │ ├── ast/ -> Defining the structure of the AST + │ ├── bytecode/ -> Generate Java bytecode + │ ├── main/ -> Running the compiler + │ ├── parser/ + │ │ ├── astBuilder/ -> Builder creating the AST + │ │ ├── generated/ -> Antlr generated grammar + │ │ └── grammar/ -> Antlr grammar + │ ├── semantic/ -> Running the semantic check + │ └── visitor/ -> Visitor interface + └── resources/ +test/ +└── java/ +│ ├── main/ -> MainTest, E2ETests, UtilityTests +│ ├── parser/ -> Performs tests on the parser +│ └── semantic/ -> Performs tests on the semantic check +└── resources/ -> Ressources for running the Tests +``` + +## Class-Diagramm AST + +![AST Diagramm](ast.png) + +## Used Tools + +- [Maven 4.0](https://maven.apache.org/index.html) + - Used for automating the build process and managing dependencies. +- [ANTLR4 v.13.1](https://www.antlr.org/) + - Used to parse the input Java code into the Abstract Syntax Tree. + + +## How to run the compiler + +## Download + +```bash \ No newline at end of file diff --git a/src/main/resources/input/CompilerInput.java b/src/main/resources/input/CompilerInput.java index 825490d..463fab7 100644 --- a/src/main/resources/input/CompilerInput.java +++ b/src/main/resources/input/CompilerInput.java @@ -8,7 +8,6 @@ public class Node { public void main() { Compiler compiler = new Compiler(); int i = compiler.add(5, 8); - return i; } } diff --git a/src/test/Makefile b/src/test/Makefile index a19508b..54c905d 100644 --- a/src/test/Makefile +++ b/src/test/Makefile @@ -10,13 +10,7 @@ compile-javac: compile-raupenpiler: cd ../.. ; mvn -DskipTests install cd ../.. ; mvn exec:java -DgenJar=true -DgenClass=true -Dexec.mainClass="main.Main" -Dexec.args="'src/main/resources/input/CompilerInput.java' 'src/main/resources/output'" - cp ../main/resources/output/CompilerInput.class .java/resources/output/raupenpiler - -test: compile-javac compile-raupenpiler test-javac test-raupenpiler - -test-javac: - # gleich wie bei raupenpiler, kann ich ohne funktionierenden Compiler nicht testen - + # cp ../main/resources/output/CompilerInput.class .java/resources/output/raupenpiler test-raupenpiler: # move the compiled class to the test/main folder @@ -29,17 +23,19 @@ test-raupenpiler: clean: - # clean output folders + # clean main output folders rm -f ../main/resources/output/*.class rm -f ../main/resources/output/*.jar + # clean resources output folders rm -f ./resources/output/javac/*.class rm -f ./resources/output/raupenpiler/*.class + rm -f ./resources/output/raupenpiler/*.jar # clean logs - rm -f ../main/resources/logs/*.log + rm -f ../main/resources/logs/* # clean test/java/main folders from .class files for End-to-End tests rm -f ./java/main/*.class - # clean javac output from combinedFeatureTests - rm -f ./resources/input/combinedFeatureTests/*.class - rm -f ./resources/input/singleFeatureTests/*.class - rm -f ./resources/input/typedAstFeatureTests/*.class + # clean javac output from every folder + rm -f ./resources/input/*/*.class + # clean test results from maven surefire plugin + rm -f ../../target/surefire-reports/*.txt diff --git a/src/test/java/main/E2EReflectionsTest.java b/src/test/java/main/E2EReflectionsTest.java index f461417..78d479d 100644 --- a/src/test/java/main/E2EReflectionsTest.java +++ b/src/test/java/main/E2EReflectionsTest.java @@ -1,9 +1,14 @@ package main; +import java.io.IOException; + import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.Arrays; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import org.junit.jupiter.api.Test; @@ -14,77 +19,79 @@ import static org.junit.jupiter.api.Assertions.*; public class E2EReflectionsTest { @Test - public void AllFeaturesClassExampleTest(){ + public void CharTest() { + final String FILE_NAME = "Char"; try { - Main.main(new String[]{"src/test/resources/input/combinedFeatureTests/AllFeaturesClassExample.java", "src/test/resources/output/raupenpiler"}); + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); // Get the system Java compiler JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); // Assert that the compiler is available assertNotNull(javac, "Java Compiler is not available"); - javac.run(null, null, null, "src/test/resources/input/combinedFeatureTests/AllFeaturesClassExample.java"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); - Class clazz = Class.forName("src.resources.input.combinedFeatureTests.AllFeaturesClassExample"); - ClassLoader classLoader = getClass().getClassLoader(); - // Class clazz = classLoader.loadClass("main.AllFeaturesClassExample"); // Class Name - assertEquals("main.AllFeaturesClassExample", clazz.getName()); + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + // Constructors - Constructor[] actualConstructors = clazz.getDeclaredConstructors(); - assertTrue(actualConstructors.length > 0, "No constructors found"); + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); - Constructor expectedConstructor = clazz.getConstructor(int.class, boolean.class, char.class); + assertEquals(javacConstructors.length, raupenpilerConstructors.length); - boolean constructorFound = false; - for (Constructor constructor : actualConstructors) { - if (constructor.equals(expectedConstructor)) { - constructorFound = true; - break; + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } } } - assertTrue(constructorFound, "Expected constructor not found in actual constructors"); + // Methods - Method[] actualMethodNames = clazz.getDeclaredMethods(); - assertTrue(actualMethodNames.length > 0); - for (Method method : actualMethodNames) { - System.out.println("Method: " + method.getName()); + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); } - // Method Names - String[] expectedMethodNames = { - "controlStructures", - "logicalOperations", - "add", - "subtract", - "multiply", - "divide", - "modulo", - "main" - }; - - for (Method method : actualMethodNames) { - assertTrue(Arrays.asList(expectedMethodNames).contains(method.getName())); - } // Fields - Field[] actualFields = clazz.getDeclaredFields(); - assertTrue(actualFields.length > 0, "No fields found"); + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); - Field expectedField = clazz.getDeclaredField("c"); - assertEquals(expectedField.getType(), char.class); + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); - boolean fieldFound = false; - for (Field field : actualFields) { - if (field.equals(expectedField)) { - fieldFound = true; - break; + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } } } - assertTrue(fieldFound, "Expected field not found in actual fields"); - - } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { e.printStackTrace(); @@ -92,4 +99,1968 @@ public class E2EReflectionsTest { throw new RuntimeException(e); } } + + @Test + public void CommentsTest() { + final String FILE_NAME = "Comments"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void ConstructorMethodCallTest() { + final String FILE_NAME = "ConstructorMethodCall"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void ConstructorMethodCallParametersTest() { + final String FILE_NAME = "ConstructorMethodCallParameters"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void ConstructorParameterTest() { + final String FILE_NAME = "ConstructorParameter"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void ConstructorThisDotTest() { + final String FILE_NAME = "ConstructorThisDot"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void DoWhileTest() { + final String FILE_NAME = "DoWhile"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void EmptyClassTest() { + final String FILE_NAME = "EmptyClass"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void EmptyClassWithConstructorTest() { + final String FILE_NAME = "EmptyClassWithConstructor"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void FieldTest() { + final String FILE_NAME = "Field"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void FieldWithAccessModifierTest() { + final String FILE_NAME = "FieldWithAccessModifier"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void ForTest() { + final String FILE_NAME = "For"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @Test + public void IfTest() { + final String FILE_NAME = "If"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void IfElseTest() { + final String FILE_NAME = "IfElse"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void IfElseIfElseTest() { + final String FILE_NAME = "IfElseIfElse"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void IncrementTest() { + final String FILE_NAME = "Increment"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void MainMethodTest() { + final String FILE_NAME = "MainMethod"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void MultipleClassesTest() { + final String FILE_NAME = "MultipleClasses"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void NullTest() { + final String FILE_NAME = "Null"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void SelfReferenceTest() { + final String FILE_NAME = "SelfReference"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void ThisDotTest() { + final String FILE_NAME = "ThisDot"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void VariableCalculationTest() { + final String FILE_NAME = "VariableCalculation"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void VariableCompareTest() { + final String FILE_NAME = "VariableCompare"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void VoidMethodTest() { + final String FILE_NAME = "VoidMethod"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void WhileTest() { + final String FILE_NAME = "While"; + try { + // compile with raupenpiler + Main.main(new String[]{"src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java", "src/test/resources/output/raupenpiler"}); + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + // compile with javac + javac.run(null, null, null, "src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".java"); + moveFile("src/test/resources/input/singleFeatureTests/" + FILE_NAME + ".class", "src/test/resources/output/javac/" + FILE_NAME + ".class"); + + // Load the javac class + Path javacClassPath = Paths.get("src/test/resources/output/javac"); + ClassLoader javacClassLoader = new java.net.URLClassLoader(new java.net.URL[]{javacClassPath.toUri().toURL()}); + Class javacLoadedClass = javacClassLoader.loadClass(FILE_NAME); + + // Load the raupenpiler class + Path raupenpilerClassPath = Paths.get("src/test/resources/output/raupenpiler"); + ClassLoader raupenpilerClassLoader = new java.net.URLClassLoader(new java.net.URL[]{raupenpilerClassPath.toUri().toURL()}); + Class raupenpilerLoadedClass = raupenpilerClassLoader.loadClass(FILE_NAME); + + + // Class Name + assertEquals(FILE_NAME, javacLoadedClass.getName()); + assertEquals(FILE_NAME, raupenpilerLoadedClass.getName()); + + + // Constructors + Constructor[] javacConstructors = javacLoadedClass.getDeclaredConstructors(); + Constructor[] raupenpilerConstructors = raupenpilerLoadedClass.getDeclaredConstructors(); + + assertEquals(javacConstructors.length, raupenpilerConstructors.length); + + for(Constructor c : javacConstructors) { + for(Constructor raupenpilerConstructor : raupenpilerConstructors) { + assertEquals(c.getParameterCount(), raupenpilerConstructor.getParameterCount()); + if (c.getParameterCount() == raupenpilerConstructor.getParameterCount()) { + assertEquals(c.getName(), raupenpilerConstructor.getName()); + } + } + } + + + // Methods + Method[] javacMethods = javacLoadedClass.getDeclaredMethods(); + Method[] raupenpilerMethods = raupenpilerLoadedClass.getDeclaredMethods(); + + assertEquals(javacMethods.length, raupenpilerMethods.length); + + for (int i = 0; i < javacMethods.length; i++) { + assertEquals(javacMethods[i].getName(), raupenpilerMethods[i].getName()); + assertEquals(javacMethods[i].getReturnType(), raupenpilerMethods[i].getReturnType()); + assertEquals(javacMethods[i].getParameterCount(), raupenpilerMethods[i].getParameterCount()); + // assertEquals(javacMethods[i].getModifiers(), raupenpilerMethods[i].getModifiers()); + } + + + // Fields + Field[] javacLoadedClassDeclaredFields = javacLoadedClass.getDeclaredFields(); + Field[] raupenpilerLoadedClassDeclaredFields = raupenpilerLoadedClass.getDeclaredFields(); + + assertEquals(javacLoadedClassDeclaredFields.length, raupenpilerLoadedClassDeclaredFields.length); + + for (Field field : javacLoadedClassDeclaredFields) { + for (Field raupenpilerField : raupenpilerLoadedClassDeclaredFields) { + if (field.getName().equals(raupenpilerField.getName())) { + assertEquals(field.getType(), raupenpilerField.getType()); + // assertEquals(field.getModifiers(), raupenpilerField.getModifiers()); + } + } + } + + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + // Helpers + + public static void moveFile(String sourceFilePath, String destinationFilePath) throws IOException { + Path sourcePath = Paths.get(sourceFilePath); + Path destinationPath = Paths.get(destinationFilePath); + Files.move(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING); + } } \ No newline at end of file diff --git a/src/test/java/main/InputFilesTest.java b/src/test/java/main/InputFilesTest.java index 4529c9d..3ba18f3 100644 --- a/src/test/java/main/InputFilesTest.java +++ b/src/test/java/main/InputFilesTest.java @@ -1,5 +1,6 @@ package main; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import javax.tools.JavaCompiler; @@ -26,13 +27,17 @@ public class InputFilesTest { // Assert that the compiler is available assertNotNull(javac, "Java Compiler is not available"); - File folder1 = new File("src/test/resources/input/combinedFeatureTests"); - File folder2 = new File("src/test/resources/input/singleFeatureTests"); - File folder3 = new File("src/test/resources/input/typedAstFeatureTests"); + File combinedFeatureTests = new File("src/test/resources/input/combinedFeatureTests"); + File endabgabeTests = new File("src/test/resources/input/endabgabeTests"); + File singleFeatureSemanticTests = new File("src/test/resources/input/singleFeatureSemanticTests"); + File singleFeatureTests = new File("src/test/resources/input/singleFeatureTests"); + File typedAstFeatureTests = new File("src/test/resources/input/typedAstFeatureTests"); - List files = getJavaFilesFromDirectory(folder1); - files.addAll(getJavaFilesFromDirectory(folder2)); - files.addAll(getJavaFilesFromDirectory(folder3)); + List files = getJavaFilesFromDirectory(combinedFeatureTests); + // files.addAll(getJavaFilesFromDirectory(endabgabeTests)); + // files.addAll(getJavaFilesFromDirectory(singleFeatureSemanticTests)); + files.addAll(getJavaFilesFromDirectory(singleFeatureTests)); + // files.addAll(getJavaFilesFromDirectory(typedAstFeatureTests)); if (!files.isEmpty()) { for (File file : files) { @@ -47,6 +52,133 @@ public class InputFilesTest { } } + @Test + public void areCombinedFeatureTestsValid() throws IOException { + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + + File combinedFeatureTests = new File("src/test/resources/input/combinedFeatureTests"); + + List files = getJavaFilesFromDirectory(combinedFeatureTests); + + if (!files.isEmpty()) { + for (File file : files) { + // Try to compile the file and get the result + int result = javac.run(null, null, null, file.getPath()); + + // Assert that the compilation succeeded (i.e., the result is zero) + assertEquals(0, result, "Expected compilation success for " + file.getName()); + } + } else { + System.out.println("No files found in the directories."); + } + } + + @Test + @Disabled + public void areEndabgabeTestsActuallyValid() throws IOException { + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + + File endabgabeTests = new File("src/test/resources/input/endabgabeTests"); + + List files = getJavaFilesFromDirectory(endabgabeTests); + + if (!files.isEmpty()) { + for (File file : files) { + // Try to compile the file and get the result + int result = javac.run(null, null, null, file.getPath()); + + // Assert that the compilation succeeded (i.e., the result is zero) + assertEquals(0, result, "Expected compilation success for " + file.getName()); + } + } else { + System.out.println("No files found in the directories."); + } + } + + @Test + @Disabled + public void areSingleFeatureSemanticTestsActuallyValid() throws IOException { + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + + File singleFeatureSemanticTests = new File("src/test/resources/input/singleFeatureSemanticTests"); + + List files = getJavaFilesFromDirectory(singleFeatureSemanticTests); + + if (!files.isEmpty()) { + for (File file : files) { + // Try to compile the file and get the result + int result = javac.run(null, null, null, file.getPath()); + + // Assert that the compilation succeeded (i.e., the result is zero) + assertEquals(0, result, "Expected compilation success for " + file.getName()); + } + } else { + System.out.println("No files found in the directories."); + } + } + + + @Test + public void areSingleFeatureTestsActuallyValid() throws IOException { + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + + File singleFeatureTests = new File("src/test/resources/input/singleFeatureTests"); + + List files = getJavaFilesFromDirectory(singleFeatureTests); + + if (!files.isEmpty()) { + for (File file : files) { + // Try to compile the file and get the result + int result = javac.run(null, null, null, file.getPath()); + + // Assert that the compilation succeeded (i.e., the result is zero) + assertEquals(0, result, "Expected compilation success for " + file.getName()); + } + } else { + System.out.println("No files found in the directories."); + } + } + + + @Test + @Disabled + public void areTypedAstFeatureTestsActuallyValid() throws IOException { + // Get the system Java compiler + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + // Assert that the compiler is available + assertNotNull(javac, "Java Compiler is not available"); + + File typedAstFeatureTests = new File("src/test/resources/input/typedAstFeatureTests"); + + List files = getJavaFilesFromDirectory(typedAstFeatureTests); + + if (!files.isEmpty()) { + for (File file : files) { + // Try to compile the file and get the result + int result = javac.run(null, null, null, file.getPath()); + + // Assert that the compilation succeeded (i.e., the result is zero) + assertEquals(0, result, "Expected compilation success for " + file.getName()); + } + } else { + System.out.println("No files found in the directories."); + } + } + + + /** * This test method checks if invalid Java files fail to compile as expected. diff --git a/src/test/java/main/MainTest.java b/src/test/java/main/MainTest.java index 24389bc..890f4cd 100644 --- a/src/test/java/main/MainTest.java +++ b/src/test/java/main/MainTest.java @@ -1,28 +1,25 @@ package main; -import org.junit.jupiter.api.Test; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.CharStreams; - -import java.io.IOException; -import java.nio.file.Paths; - +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import parser.ParserTest; +import parser.ScannerTest; +import semantic.EndToTypedAstTest; +import semantic.SemanticTest; /** - * run every test: mvn test - * Nutzen dieser Klasse: Eigentlich nicht vorhanden, in der Main gibts nichts zu testen + * This class is a test suite that runs all the test classes in the project. + *

run: mvn test + *

check results in console or target/surefire-reports */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + InputFilesTest.class, + ScannerTest.class, + ParserTest.class, + SemanticTest.class, + EndToTypedAstTest.class +}) public class MainTest { - @Test - void test() { - CharStream codeCharStream = null; - try { - codeCharStream = CharStreams.fromPath(Paths.get("src/main/test/resources/CompilerInput.java")); - Main.compileFile(codeCharStream, "src/main/test/resources/output"); - } catch (IOException e) { - System.err.println("Error reading the file: " + e.getMessage()); - } - } + // This class remains empty, it is used only as a holder for the above annotations } - - diff --git a/src/test/java/main/ReflectionsTest.java b/src/test/java/main/ReflectionsTest.java deleted file mode 100644 index d47d95a..0000000 --- a/src/test/java/main/ReflectionsTest.java +++ /dev/null @@ -1,145 +0,0 @@ -package main; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; - -import org.antlr.v4.runtime.CharStream; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - - -public class ReflectionsTest { - - @Test - public void testSimpleJavaLexerClass() throws ClassNotFoundException, NoSuchMethodException { - Class clazz = Class.forName("parser.generated.SimpleJavaLexer"); - - // Class Name - assertEquals("parser.generated.SimpleJavaLexer", clazz.getName()); - - // Constructors - Constructor[] actualConstructors = clazz.getDeclaredConstructors(); - assertTrue(actualConstructors.length > 0, "No constructors found"); - - Constructor expectedConstructor = clazz.getConstructor(CharStream.class); - - boolean constructorFound = false; - for (Constructor constructor : actualConstructors) { - if (constructor.equals(expectedConstructor)) { - constructorFound = true; - break; - } - } - assertTrue(constructorFound, "Expected constructor not found in actual constructors"); - - - - // Methods - Method[] actualMethodNames = clazz.getDeclaredMethods(); - assertTrue(actualMethodNames.length > 0); - Arrays.stream(actualMethodNames).forEach(method -> System.out.println("Method: " + method.getName())); - - List expectedMethodNames = Arrays.asList( - "getTokenNames", - "getVocabulary", - "getGrammarFileName", - "getRuleNames", - "getSerializedATN", - "getChannelNames", - "getModeNames", - "getATN", - "makeRuleNames", - "makeLiteralNames", - "makeSymbolicNames" - ); - - for (Method method : actualMethodNames) { - assertTrue(expectedMethodNames.contains(method.getName())); - } - - for (String expectedMethodName : expectedMethodNames) { - boolean methodFound = false; - for (Method method : actualMethodNames) { - if (method.getName().equals(expectedMethodName)) { - methodFound = true; - break; - } - } - assertTrue(methodFound, "Expected method " + expectedMethodName + " not found in actual methods"); - } - - - // Fields - Field[] actualFieldNames = clazz.getDeclaredFields(); - assertTrue(actualFieldNames.length > 0); - Arrays.stream(actualFieldNames).forEach(field -> System.out.println("Field: " + field.getName())); - - List expectedFieldNames = Arrays.asList( - "_decisionToDFA", - "_sharedContextCache", - "channelNames", - "modeNames", - "ruleNames", - "_LITERAL_NAMES", - "_SYMBOLIC_NAMES", - "VOCABULARY", - "tokenNames", - "_serializedATN", - "_ATN" - ); - - for (Field field : actualFieldNames) { - assertTrue(expectedFieldNames.contains(field.getName())); - } - } - - @Test - public void testSimpleJavaParserClass() throws ClassNotFoundException { - Class clazz = Class.forName("parser.generated.SimpleJavaParser"); - - // Class Name - assertEquals("parser.generated.SimpleJavaParser", clazz.getName()); - - // Constructors - Constructor[] constructors = clazz.getDeclaredConstructors(); - assertTrue(constructors.length > 0); - - // Methods - Method[] methods = clazz.getDeclaredMethods(); - assertTrue(methods.length > 0); - Arrays.stream(methods).forEach(method -> System.out.println("Method: " + method.getName())); - - // Fields - Field[] fields = clazz.getDeclaredFields(); - assertTrue(fields.length > 0); - Arrays.stream(fields).forEach(field -> System.out.println("Field: " + field.getName())); - } - - @Test - public void testASTBuilderClass() throws ClassNotFoundException { - Class clazz = Class.forName("parser.astBuilder.ASTBuilder"); - - // Class Name - assertEquals("parser.astBuilder.ASTBuilder", clazz.getName()); - - // Constructors - Constructor[] constructors = clazz.getDeclaredConstructors(); - assertTrue(constructors.length > 0); - - // Methods - Method[] methods = clazz.getDeclaredMethods(); - assertTrue(methods.length > 0); - Arrays.stream(methods).forEach(method -> System.out.println("Method: " + method.getName())); - - // Fields - Field[] fields = clazz.getDeclaredFields(); - assertTrue(fields.length > 0); - Arrays.stream(fields).forEach(field -> System.out.println("Field: " + field.getName())); - } - - // Similarly, you can add tests for SemanticAnalyzer and ByteCodeGenerator -} diff --git a/src/test/java/semantic/SemanticTest.java b/src/test/java/semantic/SemanticTest.java index f406580..ac7393f 100644 --- a/src/test/java/semantic/SemanticTest.java +++ b/src/test/java/semantic/SemanticTest.java @@ -1,5 +1,441 @@ package semantic; +import ast.ASTNode; +import ast.ClassNode; +import ast.ProgramNode; +import ast.expressions.IExpressionNode; +import ast.expressions.unaryexpressions.MemberAccessNode; +import ast.expressions.unaryexpressions.UnaryNode; +import ast.members.ConstructorNode; +import ast.members.FieldNode; +import ast.members.MethodNode; +import ast.parameters.ParameterNode; +import ast.statementexpressions.AssignNode; +import ast.statementexpressions.AssignableNode; +import ast.statementexpressions.methodcallstatementnexpressions.MethodCallNode; +import ast.statements.BlockNode; +import ast.statements.ReturnNode; +import ast.type.AccessModifierNode; +import ast.type.EnumValueNode; +import ast.type.ValueNode; +import ast.type.type.BaseType; +import ast.type.type.TypeEnum; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import parser.Helper; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + public class SemanticTest { + @BeforeEach + public void setUp() { + SemanticAnalyzer.clearAnalyzer(); + } + + @Test + @DisplayName("Empty Class Test") + public void emptyClassTest() { + ClassNode emptyClass = Helper.generateEmptyClass("EmptyClass"); + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(emptyClass); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + + @Test + @DisplayName("Multiple Empty Classes Test") + public void multipleEmptyClassesTest() { + ClassNode class1 = Helper.generateEmptyClass("MultipleClasses"); + ClassNode class2 = Helper.generateEmptyClass("TestClass2"); + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + abstractSyntaxTree.addClass(class2); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + + @Test + @DisplayName("Empty Class Test with Constructor") + public void emptyClassWithConstructorTest() { + ClassNode class1 = Helper.generateEmptyClass("EmptyClassWithConstructor"); + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("Field Test") + public void fieldTest() { + ClassNode class1 = Helper.generateEmptyClass("Field"); + class1.addMember(new FieldNode(new AccessModifierNode("public"), new BaseType(TypeEnum.INT), "a")); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("Field Test with Accessmodifier") + public void fieldTestWithModifier() { + ClassNode class1 = Helper.generateEmptyClass("FieldWithAccessModifier"); + class1.addMember(new FieldNode(new AccessModifierNode("public"), new BaseType(TypeEnum.INT), "a")); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("Comments Ignore Test") + public void commentsIgnoreTest() { + ClassNode class1 = Helper.generateEmptyClass("Comments"); + class1.addMember(new FieldNode(new AccessModifierNode("private"), new BaseType(TypeEnum.INT), "a")); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("Constructor Parameter Test") + public void constructorParameterTest() { + BlockNode block = new BlockNode(); + block.addStatement(new ReturnNode(null)); + ConstructorNode constructor = new ConstructorNode("public", "ConstructorParameter", block); + constructor.addParameter(new ParameterNode(new BaseType(TypeEnum.INT), "a")); + constructor.addParameter(new ParameterNode(new BaseType(TypeEnum.INT), "b")); + + ClassNode class1 = new ClassNode("public", "ConstructorParameter"); + class1.addMember(constructor); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("This Dot Test") + public void thisDotTest() { + BlockNode block = new BlockNode(); + MemberAccessNode memberAccess = new MemberAccessNode(true); + memberAccess.addIdentifier("a"); + + AssignableNode assignable = new AssignableNode(memberAccess); + + ValueNode value = new ValueNode(EnumValueNode.INT_VALUE, "1"); + IExpressionNode expression = new UnaryNode(value); + + block.addStatement(new AssignNode(assignable, expression)); + block.addStatement(new ReturnNode(null)); + ConstructorNode constructor = new ConstructorNode("public", "ThisDot", block); + + ClassNode class1 = new ClassNode("public", "ThisDot"); + class1.addMember(new FieldNode(new AccessModifierNode("public"), new BaseType(TypeEnum.INT), "a")); + class1.addMember(constructor); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("Constructor This Dot Test") + public void constructorThisDotTest() { + BlockNode block = new BlockNode(); + MemberAccessNode memberAccess = new MemberAccessNode(true); + memberAccess.addIdentifier("a"); + + AssignableNode assignable = new AssignableNode(memberAccess); + + IExpressionNode expression = new UnaryNode("a"); + + block.addStatement(new AssignNode(assignable, expression)); + block.addStatement(new ReturnNode(null)); + ConstructorNode constructor = new ConstructorNode("public", "ConstructorThisDot", block); + constructor.addParameter(new ParameterNode(new BaseType(TypeEnum.INT), "a")); + + ClassNode class1 = new ClassNode("public", "ConstructorThisDot"); + class1.addMember(new FieldNode(new AccessModifierNode("private"), new BaseType(TypeEnum.INT), "a")); + class1.addMember(constructor); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("Void Methoden Test") + public void voidMethodenTest() { + ClassNode class1 = Helper.generateEmptyClass("VoidMethod"); + BlockNode block = new BlockNode(); + block.addStatement(new ReturnNode(null)); + class1.addMember(new MethodNode("public", null, true, "test", block)); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("Constructor Method call Test") + public void constructorMethodCallTest() { + BlockNode blockCon = new BlockNode(); + MemberAccessNode memberAccess = new MemberAccessNode(true); + memberAccess.addIdentifier("a"); + + AssignableNode assignable = new AssignableNode(memberAccess); + + IExpressionNode expression = new UnaryNode(new MethodCallNode(null, "testMethod")); + + blockCon.addStatement(new AssignNode(assignable, expression)); + blockCon.addStatement(new ReturnNode(null)); + ConstructorNode constructor = new ConstructorNode("public", "ConstructorMethodCall", blockCon); + + BlockNode blockMethod = new BlockNode(); + blockMethod.addStatement(new ReturnNode(new UnaryNode(new ValueNode(EnumValueNode.INT_VALUE, "1")))); + MethodNode method = new MethodNode("public", new BaseType(TypeEnum.INT), false, "testMethod", blockMethod); + + ClassNode class1 = new ClassNode("public", "ConstructorMethodCall"); + class1.addMember(new FieldNode(new AccessModifierNode("public"), new BaseType(TypeEnum.INT), "a")); + class1.addMember(constructor); + class1.addMember(method); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("Constructor Method call Parameters Test") + public void constructorMethodCallParametersTest() { + BlockNode blockCon = new BlockNode(); + MemberAccessNode memberAccess = new MemberAccessNode(true); + memberAccess.addIdentifier("a"); + + AssignableNode assignable = new AssignableNode(memberAccess); + + MethodCallNode methodCall = new MethodCallNode(null, "testMethod"); + methodCall.addExpression(new UnaryNode("a")); + IExpressionNode expression = new UnaryNode(methodCall); + + blockCon.addStatement(new AssignNode(assignable, expression)); + blockCon.addStatement(new ReturnNode(null)); + ConstructorNode constructor = new ConstructorNode("public", "ConstructorMethodCallParameters", blockCon); + constructor.addParameter(new ParameterNode(new BaseType(TypeEnum.INT), "a")); + + BlockNode blockMethod = new BlockNode(); + blockMethod.addStatement(new ReturnNode(new UnaryNode("a"))); + MethodNode method = new MethodNode("public", new BaseType(TypeEnum.INT), false, "testMethod", blockMethod); + method.addParameter(new ParameterNode(new BaseType(TypeEnum.INT), "a")); + + ClassNode class1 = new ClassNode("public", "ConstructorMethodCallParameters"); + class1.addMember(new FieldNode(new AccessModifierNode("public"), new BaseType(TypeEnum.INT), "a")); + class1.addMember(constructor); + class1.addMember(method); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("Char Test") + public void charTest() { + BlockNode blockCon = new BlockNode(); + MemberAccessNode memberAccess = new MemberAccessNode(true); + memberAccess.addIdentifier("a"); + + AssignableNode assignable = new AssignableNode(memberAccess); + + MethodCallNode methodCall = new MethodCallNode(null, "testMethod"); + methodCall.addExpression(new UnaryNode("a")); + IExpressionNode expression = new UnaryNode(methodCall); + + blockCon.addStatement(new AssignNode(assignable, expression)); + blockCon.addStatement(new ReturnNode(null)); + ConstructorNode constructor = new ConstructorNode("public", "Char", blockCon); + constructor.addParameter(new ParameterNode(new BaseType(TypeEnum.CHAR), "a")); + + BlockNode blockMethod = new BlockNode(); + blockMethod.addStatement(new ReturnNode(new UnaryNode("a"))); + MethodNode method = new MethodNode("public", new BaseType(TypeEnum.CHAR), false, "testMethod", blockMethod); + method.addParameter(new ParameterNode(new BaseType(TypeEnum.CHAR), "a")); + + ClassNode class1 = new ClassNode("public", "Char"); + class1.addMember(new FieldNode(new AccessModifierNode("public"), new BaseType(TypeEnum.CHAR), "a")); + class1.addMember(constructor); + class1.addMember(method); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("Null Test") + public void nullTest() { + BlockNode blockCon = new BlockNode(); + MemberAccessNode memberAccess = new MemberAccessNode(true); + memberAccess.addIdentifier("a"); + + AssignableNode assignable = new AssignableNode(memberAccess); + + blockCon.addStatement(new AssignNode(assignable, new UnaryNode(new ValueNode(EnumValueNode.NULL_VALUE, "null")))); + blockCon.addStatement(new ReturnNode(null)); + ConstructorNode constructor = new ConstructorNode("public", "Null", blockCon); + + ClassNode class1 = new ClassNode("public", "Null"); + class1.addMember(new FieldNode(new AccessModifierNode("public"), new BaseType(TypeEnum.INT), "a")); + class1.addMember(constructor); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(class1); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } + + @Test + @DisplayName("Self Reference Test") + public void selfReferenceTest() { + + } + + @Test + @DisplayName("Variable Compare Test") + public void variableCompareTest() { + + } + + @Test + @DisplayName("Variable Calculation Test") + public void variableCalculationTest() { + + } + + @Test + @DisplayName("Main Method Test") + public void mainMethodTest() { + + } + + @Test + @DisplayName("While Test") + public void whileTest() { + + } + + @Test + @DisplayName("Do While Test") + public void doWhileTest() { + + } + + @Test + @DisplayName("For Test") + public void forTest() { + + } + + @Test + @DisplayName("Increment Test") + public void incrementTest() { + ClassNode classNode = Helper.generateEmptyClass("Increment"); + classNode.addMember(new FieldNode(new AccessModifierNode("public"), new BaseType(TypeEnum.INT), "a")); + + ProgramNode abstractSyntaxTree = new ProgramNode(); + abstractSyntaxTree.addClass(classNode); + + ASTNode typedAst = SemanticAnalyzer.generateTast(abstractSyntaxTree); + for (Exception runtimeException : SemanticAnalyzer.errors) { + runtimeException.printStackTrace(); + } + assertTrue(SemanticAnalyzer.errors.isEmpty()); + assertNotNull(typedAst); + } } \ No newline at end of file