Test update

This commit is contained in:
KingJulian 2024-06-28 11:13:22 +02:00
parent d4f98693d6
commit a3000d0ba1
31 changed files with 348 additions and 79 deletions

BIN
classWithMain.class Normal file

Binary file not shown.

BIN
emptyClass.class Normal file

Binary file not shown.

View File

@ -8,5 +8,17 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="TEST" name="Maven: org.antlr:antlr4-runtime:4.13.1" level="project" />
<orderEntry type="module" module-name="NichtHaskell" scope="TEST" />
<orderEntry type="module-library" scope="TEST">
<library name="JUnit4">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.13.1/junit-4.13.1.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>

View File

@ -18,7 +18,7 @@ public class Compiler {
public static void main(String[] args) throws Exception{
Path filePath = Paths.get("src/main/java/Input.java");
Path filePath = Paths.get("src/main/java/TestClass.java");
// todo remove this debug info

View File

@ -1,6 +1,5 @@
public class TestClass {
public static void main(String[] args){
// new Example();
// new Example2();
}
}

View File

@ -69,7 +69,10 @@ public class FieldDecl extends AbstractType implements Node {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FieldDecl fieldDecl = (FieldDecl) o;
return ( Objects.equals(type, fieldDecl.type)
&& Objects.equals(identifier, fieldDecl.identifier));
boolean result = Objects.equals(type, fieldDecl.type)
&& Objects.equals(identifier, fieldDecl.identifier);
System.out.println("In FieldDecl: " + result);
return result;
}
}

View File

@ -173,10 +173,12 @@ public class MethodDecl implements Node {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MethodDecl methodDecl = (MethodDecl) o;
return (Objects.equals(name, methodDecl.name)
boolean result = (Objects.equals(name, methodDecl.name)
&& Objects.equals(parameters, methodDecl.parameters)
&& Objects.equals(returnType, methodDecl.returnType)
&& Objects.equals(codeBlock, methodDecl.codeBlock));
System.out.println("In MethodDecl: " + result);
return result;
}
}

View File

@ -96,14 +96,16 @@ public class RefType extends AbstractType implements Node {
@Override
public boolean equals(Object o) {
System.out.println("Dont forget me ;)");
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RefType refType = (RefType) o;
return ( Objects.equals(name, refType.name)
boolean result = ( Objects.equals(name, refType.name)
&& Objects.equals(fieldDecls, refType.fieldDecls)
&& Objects.equals(methodDecls, refType.methodDecls)
&& Objects.equals(hasMain, refType.hasMain));
System.out.println("In RefType: " + result);
return result;
}
}

View File

@ -14,7 +14,10 @@ public class BoolDatatype extends AbstractType implements IDatatype{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BoolDatatype boolDatatype = (BoolDatatype) o;
return (Objects.equals(value, boolDatatype.value));
boolean result = Objects.equals(value, boolDatatype.value);
System.out.println("In BoolDataType: " + result);
return result;
}
@Override
public TypeCheckResult typeCheck() {
@ -39,4 +42,6 @@ public class BoolDatatype extends AbstractType implements IDatatype{
public TypeCheckResult getTypeCheckResult() {
return super.getTypeCheckResult();
}
}

View File

@ -32,7 +32,10 @@ public class CharDatatype extends AbstractType implements IDatatype{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CharDatatype charDatatype = (CharDatatype) o;
return (Objects.equals(value, charDatatype.value));
boolean result = Objects.equals(value, charDatatype.value);
System.out.println("In CharDataType: " + result);
return result;
}
@Override

View File

@ -36,7 +36,10 @@ public class IntDatatype extends AbstractType implements IDatatype{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
IntDatatype intDatatype = (IntDatatype) o;
return (Objects.equals(value, intDatatype.value));
boolean result = (Objects.equals(value, intDatatype.value));
System.out.println("In IntDataType: " + result);
return result;
}
@Override

View File

@ -181,10 +181,13 @@ public class BinaryExpression extends AbstractType implements IExpression{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BinaryExpression binaryExpression = (BinaryExpression) o;
return (Objects.equals(operator, binaryExpression.operator)
boolean result = (Objects.equals(operator, binaryExpression.operator)
&& Objects.equals(left, binaryExpression.left)
&& Objects.equals(right, binaryExpression.right)
);
System.out.println("In BinaryExpression: " + result);
return result;
}
@Override
public TypeCheckResult getTypeCheckResult() {

View File

@ -3,12 +3,14 @@ package abstractSyntaxTree.Expression;
import TypeCheck.AbstractType;
import TypeCheck.TypeCheckException;
import TypeCheck.TypeCheckResult;
import abstractSyntaxTree.Datatype.BoolDatatype;
import abstractSyntaxTree.Parameter.ParameterList;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Objects;
public class BooleanConstantExpression extends AbstractType implements IExpression{
public boolean value;
@ -37,4 +39,15 @@ public class BooleanConstantExpression extends AbstractType implements IExpressi
public TypeCheckResult getTypeCheckResult() {
return super.getTypeCheckResult();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BooleanConstantExpression boolDatatype = (BooleanConstantExpression) o;
boolean result = Objects.equals(value, boolDatatype.value);
System.out.println("In BooleanConstantExpression: " + result);
return result;
}
}

View File

@ -8,6 +8,7 @@ import org.objectweb.asm.Opcodes;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Objects;
public class CharConstantExpression extends AbstractType implements IExpression{
public char value;
@ -33,4 +34,15 @@ public class CharConstantExpression extends AbstractType implements IExpression{
public TypeCheckResult getTypeCheckResult() {
return super.getTypeCheckResult();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CharConstantExpression boolDatatype = (CharConstantExpression) o;
boolean result = Objects.equals(value, boolDatatype.value);
System.out.println("In CharConstantExpression: " + result);
return result;
}
}

View File

@ -80,9 +80,12 @@ public class InstVarExpression extends AbstractType implements IExpression{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
InstVarExpression instVarExpression = (InstVarExpression) o;
return (Objects.equals(thisClass, instVarExpression.thisClass)
boolean result = (Objects.equals(thisClass, instVarExpression.thisClass)
&& Objects.equals(fieldName, instVarExpression.fieldName)
);
System.out.println("In InstVarExpression: " + result);
return result;
}
@Override

View File

@ -37,8 +37,11 @@ public class IntConstantExpression extends AbstractType implements IExpression{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
IntConstantExpression intConstantExpression = (IntConstantExpression) o;
return (Objects.equals(value, intConstantExpression.value)
boolean result = (Objects.equals(value, intConstantExpression.value)
);
System.out.println("In intConstantExpression: " + result);
return result;
}
@Override

View File

@ -93,7 +93,10 @@ public class LocalVarIdentifier extends AbstractType implements IExpression{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LocalVarIdentifier localVarIdentifier = (LocalVarIdentifier) o;
return (Objects.equals(identifier, localVarIdentifier.identifier)
boolean result = (Objects.equals(identifier, localVarIdentifier.identifier)
);
System.out.println("In localVarIdentifier: " + result);
return result;
}
}

View File

@ -120,8 +120,7 @@ public class Program implements Node {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Program program = (Program) o;
System.out.println(classes);
System.out.println(program.classes);
System.out.println("In program: " + Objects.equals(classes, program.classes));
return (Objects.equals(classes, program.classes));
}
}

View File

@ -8,15 +8,22 @@ public class testAll {
AstComparer astComparer;
public testAll()
{
this.astComparer = new AstComparer("test/resources");
this.astComparer = new AstComparer("src/test/resources");
}
@Test
public void TestEmptyClass(){
public void testEmptyClass(){
Program ast = emptyClassAST.getEmptyProgramm();
String pathToCode = "basicClasses/emptyClass.java";
testAst(ast, pathToCode);
}
@Test
public void testEmptyClassWithConstructor(){
Program ast = emptyClassAST.getEmptyProgramm();
String pathToCode = "basicClasses/emptyClassWithConstructor.java";
testAst(ast, pathToCode);
}
public void testAst(Program ast, String pathToCode)
{

View File

@ -3,21 +3,24 @@ package ASTs;
import abstractSyntaxTree.Class.FieldDecl;
import abstractSyntaxTree.Class.MethodDecl;
import abstractSyntaxTree.Class.RefType;
import abstractSyntaxTree.Expression.IExpression;
import abstractSyntaxTree.Expression.InstVarExpression;
import abstractSyntaxTree.Expression.*;
import abstractSyntaxTree.Parameter.Parameter;
import abstractSyntaxTree.Parameter.ParameterList;
import abstractSyntaxTree.Program;
import abstractSyntaxTree.Statement.BlockStatement;
import abstractSyntaxTree.Statement.IStatement;
import abstractSyntaxTree.Statement.LocalVarDecl;
import abstractSyntaxTree.Statement.ReturnStatement;
import abstractSyntaxTree.StatementExpression.AssignStatementExpression;
import abstractSyntaxTree.StatementExpression.NewStatementExpression;
import abstractSyntaxTree.StatementExpression.ReceivingMethod;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/*
public class fourClassesAST extends Program {
public fourClassesAST()
@ -26,55 +29,174 @@ public class fourClassesAST extends Program {
}
private static List<RefType> staticClasses() {
/////////// Classes ///////////
///////// Class: FourClasses /////////
/////// Fields ///////
List<FieldDecl> fieldDeclList = new ArrayList<>();
ParameterList emptyParameterList = new ParameterList(new ArrayList<>());
/////// Methods ///////
// Main //
List<IStatement> emptyIStatementList = new ArrayList<>();
BlockStatement emptyBlockStatement = new BlockStatement(emptyIStatementList, "void");
MethodDecl constructor = new MethodDecl("emptyClassWithConstructor", "null", "emptyClassWithConstructor", emptyParameterList, emptyBlockStatement);
//IStatement
List<IStatement> fourClassesMainBlockIstatements = new ArrayList<>();
IExpression atntiLeft = new InstVarExpression("Test", "t");
IExpression atntiRight = new NewStatementExpression();
AssignStatementExpression atnti = new AssignStatementExpression(atntiLeft, "=", );
ReturnStatement fcmbiReturn = new ReturnStatement();
fourClassesMainBlockIstatements.add(atnti);
//BlockStatement
BlockStatement fourClassesMainBlock = new BlockStatement(fourClassesMainBlockIstatements, "int");
//Parameter
Parameter intI = new Parameter("int", "i");
List<Parameter> fourClassesMainParameterList = new ArrayList<>();
ParameterList fourClassesMainParameters = new ParameterList(fourClassesMainParameterList);
MethodDecl fourClassesMain = new MethodDecl("fourClasses", "int", "main", fourClassesMainParameters, fourClassesMainBlock);
List<MethodDecl> MethodDeclList = new ArrayList<>();
RefType emptyClass = new RefType("emptyClass", fieldDeclList, MethodDeclList, false);
List<RefType> classes = new ArrayList<>();
classes.add(emptyClass);
return classes;
return program;
}
}*/
public RefType Test() {
// Class Test
//public int x
FieldDecl publicIntX = new FieldDecl("int","x");
//public int y
FieldDecl publicIntY = new FieldDecl("int", "y");
//public Test3 test3
FieldDecl Test3test3 = new FieldDecl("Test3", "test3");
// FieldDeclList
List<FieldDecl> fieldDeclList = new ArrayList<>();
fieldDeclList.add(publicIntX);
fieldDeclList.add(publicIntY);
fieldDeclList.add(Test3test3);
// (int i)
List<Parameter> par11 = new ArrayList<>();
Parameter inti = new Parameter("int", "i");
par11.add(inti);
ParameterList par1 = new ParameterList(par11);
//this.x
InstVarExpression thisX = new InstVarExpression("X");
// i
LocalVarIdentifier i = new LocalVarIdentifier("i");
//this.x = i
AssignStatementExpression thisXeqI = new AssignStatementExpression("=", thisX, i);
//this.test3
LocalVarIdentifier thisTest3 = new LocalVarIdentifier("test3");
// 2
IntConstantExpression two = new IntConstantExpression(2);
//(i * 2)
BinaryExpression iTimes2 = new BinaryExpression("*", i, two);
//new Test3(i*2)
List<IExpression> exprNewTest3 = new ArrayList<>();
exprNewTest3.add(iTimes2);
NewStatementExpression newTest3 = new NewStatementExpression("Test3",exprNewTest3 );
//this.test3 = new Test3(i * 2);
AssignStatementExpression thisTesteqNewTest3 = new AssignStatementExpression("=", thisTest3, newTest3);
// {}
List<IStatement> ilistTest = new ArrayList<>();
ilistTest.add(thisTesteqNewTest3);
BlockStatement blockTest = new BlockStatement(ilistTest,"void");
//public Test (int i)
MethodDecl Test = new MethodDecl("Test", "void",
"Test", par1, blockTest);
// public Test3 getTest3() {return this.test3;}
//this.test3
//LocalVarIdentifier thisTest3 = new LocalVarIdentifier("test3")
// return this.test3
ReturnStatement returnThisTest3 = new ReturnStatement(thisTest3);
// {return this.test3}
List<IStatement> getTest3Stmts = new ArrayList<>();
getTest3Stmts.add(returnThisTest3);
BlockStatement blockReturnThisTest3 = new BlockStatement(getTest3Stmts, "Test3");
ParameterList emptyParamList = new ParameterList(null);
MethodDecl getTest3 = new MethodDecl("Test", "Test3",
"gettest3", emptyParamList, blockReturnThisTest3);
//this.x
//LocalVarIdentifier thisX = new LocalVarIdentifier("x");
//return this.x
ReturnStatement returnThisX = new ReturnStatement(thisX);
// {return this.x}
List<IStatement> stmtsBlockReturnX = new ArrayList<>();
stmtsBlockReturnX.add(returnThisX);
BlockStatement blockReturnX = new BlockStatement(stmtsBlockReturnX,"int");
//public int getX() {
// return this.x;
// }
MethodDecl getX = new MethodDecl("Test", "int",
"getX", emptyParamList, blockReturnX);
//MethodDeclList
List<MethodDecl> methodDeclList = new ArrayList<>();
methodDeclList.add(Test);
methodDeclList.add(getTest3);
methodDeclList.add(getX);
// Class Test
RefType ClassTest = new RefType("Test", fieldDeclList,
methodDeclList, false);
return ClassTest;
}
public RefType FourClasses() {
LocalVarDecl localVarDecl1 = () -> {
String type = Test2;
String identifier = "t2";
NewStatementExpression expression = () -> {
String className = "Test2";
List<IExpression> arguments = () -> {
InstVarExpression arg0 = () -> {
List<SubReceiver> receivers = () -> {
ArrayList subReceiverList = new ArrayList<>();
SubReceiver subreceiver1 = new SubReceiver();
subReceiverList.add(subreceiver1);
return subReceiverList;
};
List<ReceivingMethod> = () -> {
ArrayList receivingMethodList = new ArrayList<>();
ReceivingMethod receivingMethod01 = () -> {
new ReceivingMethod();
}
return receivingMethodList
};
return new InstVarExpression();
};
};
return new NewStatementExpression();
};
return new LocalVarDecl();
};
LocalVarIdentifier localVarIdentifier01 = new LocalVarIdentifier("i");
List<IExpression> localargumentList01 = new ArrayList<>();
localargumentList01.add(localVarIdentifier01);
NewStatementExpression newstmtexpr01 = new NewStatementExpression("Test", localargumentList01);
LocalVarDecl statement01 = new LocalVarDecl("Test", "t", newstmtexpr01);
List<IStatement> statements01 = new ArrayList<>();
statements01.add(statement01);
BlockStatement blockStatement0 = new BlockStatement(statements01, "int");
Parameter parameter01 = new Parameter("int", "i");
List<Parameter> parameterList0x = new ArrayList<>();
parameterList0x.add(parameter01);
ParameterList parameterList0 = new ParameterList(parameterList0x);
MethodDecl methodDecl0 = new MethodDecl("FourClasses", "int", "main", parameterList0, blockStatement0);
List<FieldDecl> fieldDeclsList = new ArrayList<>();
List<MethodDecl> methodDeclList = new ArrayList<>();
methodDeclList.add(methodDecl0);
RefType FourClassesClass = new RefType("FourClasses", fieldDeclsList, methodDeclList, true);
return FourClassesClass;
}
}
*/

View File

@ -4,18 +4,23 @@ import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
public class CompareByteCodeSyntax {
public static boolean haveSameBehavior(Class<?> class1, Class<?> class2) {
System.out.println("Comparing class signatures of " + class1.getName() + " and " + class2.getName());
if (!compareClassSignatures(class1, class2)) {
return false;
}
System.out.println("Comparing methods of " + class1.getName() + " and " + class2.getName());
if (!compareMethods(class1, class2)) {
return false;
}
System.out.println("Comparing fields of " + class1.getName() + " and " + class2.getName());
if (!compareFields(class1, class2)) {
return false;
}
System.out.println("Comparing annotations of " + class1.getName() + " and " + class2.getName());
if (!compareAnnotations(class1.getAnnotations(), class2.getAnnotations())) {
return false;
}
@ -24,9 +29,11 @@ public class CompareByteCodeSyntax {
public static boolean compareClassSignatures(Class<?> class1, Class<?> class2) {
if (!Arrays.equals(class1.getInterfaces(), class2.getInterfaces())) {
System.out.println("Interfaces do not match");
return false;
}
if (class1.getSuperclass() != class2.getSuperclass()) {
System.out.println("Superclasses do not match");
return false;
}
return true;
@ -36,6 +43,7 @@ public class CompareByteCodeSyntax {
Method[] methods1 = class1.getDeclaredMethods();
Method[] methods2 = class2.getDeclaredMethods();
if (methods1.length != methods2.length) {
System.out.println("Method counts do not match");
return false;
}
for (Method method1 : methods1) {
@ -49,6 +57,7 @@ public class CompareByteCodeSyntax {
}
}
if (!found) {
System.out.println("No matching method found for: " + method1.getName());
return false;
}
}
@ -57,15 +66,19 @@ public class CompareByteCodeSyntax {
public static boolean compareMethod(Method method1, Method method2) {
if (!method1.getReturnType().equals(method2.getReturnType())) {
System.out.println("Return types do not match for methods " + method1.getName() + " and " + method2.getName());
return false;
}
if (!Arrays.equals(method1.getParameterTypes(), method2.getParameterTypes())) {
System.out.println("Parameter types do not match for methods " + method1.getName() + " and " + method2.getName());
return false;
}
if (!Arrays.equals(method1.getExceptionTypes(), method2.getExceptionTypes())) {
System.out.println("Exception types do not match for methods " + method1.getName() + " and " + method2.getName());
return false;
}
if (!compareAnnotations(method1.getAnnotations(), method2.getAnnotations())) {
System.out.println("Annotations do not match for methods " + method1.getName() + " and " + method2.getName());
return false;
}
return true;
@ -75,6 +88,7 @@ public class CompareByteCodeSyntax {
Field[] fields1 = class1.getDeclaredFields();
Field[] fields2 = class2.getDeclaredFields();
if (fields1.length != fields2.length) {
System.out.println("Field counts do not match");
return false;
}
for (Field field1 : fields1) {
@ -88,6 +102,7 @@ public class CompareByteCodeSyntax {
}
}
if (!found) {
System.out.println("No matching field found for: " + field1.getName());
return false;
}
}
@ -96,9 +111,11 @@ public class CompareByteCodeSyntax {
public static boolean compareField(Field field1, Field field2) {
if (!field1.getType().equals(field2.getType())) {
System.out.println("Field types do not match for fields " + field1.getName() + " and " + field2.getName());
return false;
}
if (!compareAnnotations(field1.getAnnotations(), field2.getAnnotations())) {
System.out.println("Annotations do not match for fields " + field1.getName() + " and " + field2.getName());
return false;
}
return true;
@ -106,6 +123,7 @@ public class CompareByteCodeSyntax {
public static boolean compareAnnotations(Annotation[] annotations1, Annotation[] annotations2) {
if (annotations1.length != annotations2.length) {
System.out.println("Annotation counts do not match");
return false;
}
for (Annotation annotation1 : annotations1) {
@ -117,10 +135,10 @@ public class CompareByteCodeSyntax {
}
}
if (!found) {
System.out.println("No matching annotation found for: " + annotation1.annotationType().getName());
return false;
}
}
return true;
}
}

View File

@ -79,12 +79,14 @@ public class TestAll {
abstractSyntaxTree.typeCheck();
} catch (Exception e){
System.out.println("Le Exception in le type-check");
//fail();
}
try {
abstractSyntaxTree.codeGen();
} catch (Exception e){
System.out.println("Le Exception in le codegen");
fail();
}
try {
@ -112,5 +114,35 @@ public class TestAll {
//testByteCodeFromScratch(classPath, javacode, className);
}
@Test
public void testFourClasses() {
String classPath = "src/test/resources/basicClasses/FourClasses.class";
Program ast = emptyClassAST.getEmptyProgramm();
String className = "emptyClass";
String javacode = "src/test/resources/basicClasses/FourClasses.java";
//testByteCodeFromAst(classPath, ast ,className);
testByteCodeFromScratch(classPath, javacode, className);
}
@Test
public void testFakultaet() {
String classPath = "src/test/resources/basicClasses/Fakultaet.class";
Program ast = emptyClassAST.getEmptyProgramm();
String className = "Fakultät";
String javacode = "src/test/resources/basicClasses/Fakultaet.java";
//testByteCodeFromAst(classPath, ast ,className);
testByteCodeFromScratch(classPath, javacode, className);
}
@Test
public void testClassWithMain() {
String classPath = "src/test/resources/basicClasses/classWithMain.class";
Program ast = emptyClassAST.getEmptyProgramm();
String className = "classWithMain";
String javacode = "src/test/resources/basicClasses/classWithMain.java";
//testByteCodeFromAst(classPath, ast ,className);
testByteCodeFromScratch(classPath, javacode, className);
}
}

Binary file not shown.

View File

@ -0,0 +1,19 @@
class Fakultaet {
public int fak(int number) {
if (number < 0) {
return 1;
}
int factorial = 1;
int i = 0;
while(i < number){
factorial = factorial * i;
}
return factorial;
}
public static void main(String[] args){
}
}

View File

@ -19,11 +19,11 @@ class Test {
this.test3 = new Test3(i * 2);
}
public Test3 getTest3() {
public Test3 getTest3(int not) {
return this.test3;
}
public int getX() {
public int getX(int not) {
return this.x;
}
}
@ -46,11 +46,11 @@ class Test3 {
this.x = i;
}
public int getX() {
public int getX(int not) {
return this.x;
}
public int getY() {
public int getY(int not) {
return this.y;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,6 @@
class classWithMain {
public static void main(String[] args){
}
}

Binary file not shown.