You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2019/05/05 13:18:33 UTC

[plc4x] 01/02: Fixed Enum Factory.

This is an automated email from the ASF dual-hosted git repository.

jfeinauer pushed a commit to branch feature/code-gen
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit a11f01a5086c4e9ebbaadbb216c830d32ab1ecab
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Sun May 5 13:58:50 2019 +0200

    Fixed Enum Factory.
---
 .../plc4x/codegen/ast/ConstructorDeclaration.java  |   5 +
 .../org/apache/plc4x/codegen/ast/EnumFactory.java  | 130 +++++++++++++++++++++
 .../apache/plc4x/codegen/ast/FieldDeclaration.java |  22 +++-
 .../org/apache/plc4x/codegen/ast/Generator.java    |  12 +-
 .../apache/plc4x/codegen/ast/JavaGenerator.java    |  36 +++++-
 .../apache/plc4x/codegen/ast/MethodDefinition.java |   5 -
 .../org/apache/plc4x/codegen/ast/Modifier.java     |   7 ++
 .../apache/plc4x/codegen/ast/NewExpression.java    |   8 +-
 .../org/apache/plc4x/codegen/ast/PhpGenerator.java | 105 -----------------
 .../org/apache/plc4x/codegen/ast/PojoFactory.java  |  12 +-
 .../apache/plc4x/codegen/ast/PythonGenerator.java  |  26 ++++-
 .../apache/plc4x/codegen/ast/EnumFactoryTest.java  |  70 +++++++++++
 .../apache/plc4x/codegen/ast/PhpGeneratorTest.java |  23 ----
 13 files changed, 303 insertions(+), 158 deletions(-)

diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstructorDeclaration.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstructorDeclaration.java
index df5b02b..8dab2c8 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstructorDeclaration.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstructorDeclaration.java
@@ -1,9 +1,14 @@
 package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
+import java.util.Set;
 
 public class ConstructorDeclaration extends MethodDefinition {
 
+    public ConstructorDeclaration(Set<Modifier> modifiers, List<ParameterExpression> parameters, Block body) {
+        super(modifiers, null, null, parameters, body);
+    }
+
     public ConstructorDeclaration(List<ParameterExpression> parameters, Block body) {
         super(null, null, parameters, body);
     }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
new file mode 100644
index 0000000..b1b422f
--- /dev/null
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
@@ -0,0 +1,130 @@
+package org.apache.plc4x.codegen.ast;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Creates Enum Like things...
+ */
+public class EnumFactory {
+
+    public ClassDefinition create(PojoDescription desc, List<EnumEntry> enumEntries) {
+        // Create all Fields first
+        final List<Node> constructorStatements = new ArrayList<>();
+        final List<FieldDeclaration> fields = new ArrayList<>();
+        for (Field field1 : desc.fields) {
+            FieldDeclaration fieldDeclaration = new FieldDeclaration(field1.getType(), field1.getName(), Modifier.PRIVATE, Modifier.FINAL);
+            fields.add(fieldDeclaration);
+            constructorStatements.add(new AssignementExpression(
+                new FieldReference(field1.getType(), field1.getName()),
+                new ParameterExpression(field1.getType(), field1.getName())
+            ));
+        }
+
+        // Create the Getters
+        final List<MethodDefinition> getters = desc.fields.stream()
+            .map(field -> getMethodDefinition(field.getName(), field.getType()))
+            .collect(Collectors.toList());
+
+        // Now add all these getters
+        final List<MethodDefinition> methods = new ArrayList<>(getters);
+
+        final ArrayList<FieldDeclaration> finalFields = new ArrayList<>();
+
+        // Now add all these static methods on top
+        for (EnumEntry enumEntry : enumEntries) {
+            final TypeNode clazzType = new TypeNode(desc.getName());
+            final String fieldName = enumEntry.getName().toUpperCase();
+            finalFields.add(new FieldDeclaration(
+                new HashSet<>(Arrays.asList(Modifier.STATIC, Modifier.FINAL)),
+                clazzType,
+                fieldName,
+                new NewExpression(clazzType, enumEntry.getArguments())
+            ));
+        }
+
+        finalFields.addAll(fields);
+
+        // Add constructor
+        final ConstructorDeclaration constructor = new ConstructorDeclaration(Collections.singleton(Modifier.PRIVATE),
+            desc.fields.stream()
+                .map(field -> new ParameterExpression(field.getType(), field.getName())).collect(Collectors.toList()),
+            new Block(constructorStatements));
+
+
+        return new ClassDefinition("", desc.getName(), finalFields, Arrays.asList(constructor), methods, null);
+    }
+
+    static MethodDefinition getMethodDefinition(String name, TypeNode type) {
+        String getter = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
+        Block body = new Block(new ReturnStatement(new FieldReference(type, name)));
+        return new MethodDefinition(getter, type, Collections.emptyList(), body);
+    }
+
+    public static class EnumEntry {
+
+        private final String name;
+        private final List<Node> arguments;
+
+        public EnumEntry(String name, List<Node> arguments) {
+            this.name = name;
+            this.arguments = arguments;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public List<Node> getArguments() {
+            return arguments;
+        }
+    }
+
+    public static class PojoDescription {
+
+        private final String name;
+        private final List<Field> fields;
+
+        public PojoDescription(String name, Field... fields) {
+            this.name = name;
+            this.fields = Arrays.asList(fields);
+        }
+
+        public PojoDescription(String name, List<Field> fields) {
+            this.name = name;
+            this.fields = fields;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public List<Field> getFields() {
+            return fields;
+        }
+    }
+
+    public static class Field {
+
+        private final TypeNode type;
+        private final String name;
+
+        public Field(TypeNode type, String name) {
+            this.type = type;
+            this.name = name;
+        }
+
+        public TypeNode getType() {
+            return type;
+        }
+
+        public String getName() {
+            return name;
+        }
+    }
+
+}
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldDeclaration.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldDeclaration.java
index df13db2..a0fd2ae 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldDeclaration.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldDeclaration.java
@@ -1,13 +1,31 @@
 package org.apache.plc4x.codegen.ast;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
 public class FieldDeclaration implements Node {
 
+    private final Set<Modifier> modifiers;
     private final TypeNode type;
     private final String name;
 
-    public FieldDeclaration(TypeNode type, String name) {
+    private final Expression initializer;
+
+    public FieldDeclaration(Set<Modifier> modifiers, TypeNode type, String name, Expression initializer) {
+        this.modifiers = modifiers;
         this.type = type;
         this.name = name;
+        this.initializer = initializer;
+    }
+
+    public FieldDeclaration(TypeNode type, String name) {
+        this(Collections.emptySet(), type, name, null);
+    }
+
+    public FieldDeclaration(TypeNode type, String name, Modifier... modifiers) {
+        this(new HashSet<>(Arrays.asList(modifiers)), type, name, null);
     }
 
     @Override public <T> T accept(NodeVisitor<T> visitor) {
@@ -15,6 +33,6 @@ public class FieldDeclaration implements Node {
     }
 
     @Override public void write(Generator writer) {
-        writer.generateFieldDeclaration(type, name);
+        writer.generateFieldDeclaration(modifiers, type, name, initializer);
     }
 }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Generator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Generator.java
index 25a34e2..699b8c3 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Generator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Generator.java
@@ -1,9 +1,17 @@
 package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
+import java.util.Set;
 
 public interface Generator {
 
+    /**
+     * Do preliminary stuff.
+     * @param root
+     * @return
+     */
+    Node prepare(Node root);
+
     void generate(ConstantNode constantNode);
 
     void generateDeclarationWithInitializer(DeclarationStatement declarationStatement);
@@ -34,11 +42,11 @@ public interface Generator {
 
     void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDefinition> innerClasses, boolean mainClass);
 
-    void generateFieldDeclaration(TypeNode type, String name);
+    void generateFieldDeclaration(Set<Modifier> modifiers, TypeNode type, String name, Expression initializer);
 
     void generateFieldReference(TypeNode type, String name);
 
-    void generateConstructor(String className, List<ParameterExpression> parameters, Block body);
+    void generateConstructor(Set<Modifier> modifiers, String className, List<ParameterExpression> parameters, Block body);
 
     void generateFile(ClassDefinition mainClass, List<ClassDefinition> innerClasses);
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/JavaGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/JavaGenerator.java
index 2672e81..47b8171 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/JavaGenerator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/JavaGenerator.java
@@ -1,6 +1,7 @@
 package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
+import java.util.Set;
 
 public class JavaGenerator implements Generator {
 
@@ -10,6 +11,10 @@ public class JavaGenerator implements Generator {
         this.writer = writer;
     }
 
+    @Override public Node prepare(Node root) {
+        return root;
+    }
+
     @Override public void generate(ConstantNode constantNode) {
         writer.write(constantNode.getValue().toString());
     }
@@ -122,7 +127,7 @@ public class JavaGenerator implements Generator {
 
     @Override public void generate(MethodDefinition methodDefinition) {
         writer.startLine("public ");
-        if (methodDefinition.getModifiers().contains(MethodDefinition.Modifier.STATIC)) {
+        if (methodDefinition.getModifiers().contains(Modifier.STATIC)) {
             writer.write("static ");
         }
         // Special handling of VOID is necessary
@@ -177,7 +182,7 @@ public class JavaGenerator implements Generator {
         // Constructors
         if (constructors != null) {
             for (ConstructorDeclaration constructor : constructors) {
-                this.generateConstructor(className, constructor.getParameters(), constructor.getBody());
+                this.generateConstructor(constructor.getModifiers(), className, constructor.getParameters(), constructor.getBody());
                 writer.writeLine("");
             }
         }
@@ -199,11 +204,26 @@ public class JavaGenerator implements Generator {
         writer.writeLine("}");
     }
 
-    @Override public void generateFieldDeclaration(TypeNode type, String name) {
-        writer.startLine("public ");
+    @Override public void generateFieldDeclaration(Set<Modifier> modifiers, TypeNode type, String name, Expression initializer) {
+        if (modifiers.contains(Modifier.PRIVATE)) {
+            writer.startLine("private ");
+        } else {
+            writer.startLine("public ");
+        }
+        if (modifiers.contains(Modifier.STATIC)) {
+            writer.write("static ");
+        }
+        if (modifiers.contains(Modifier.FINAL)) {
+            writer.write("final ");
+        }
         type.write(this);
         writer.write(" ");
         writer.write(name);
+        // If it has an initializer, then do it here...
+        if (initializer != null) {
+            writer.write( " = ");
+            initializer.write(this);
+        }
         writer.write(";");
         writer.endLine();
     }
@@ -213,8 +233,12 @@ public class JavaGenerator implements Generator {
         writer.write(name);
     }
 
-    @Override public void generateConstructor(String className, List<ParameterExpression> parameters, Block body) {
-        writer.startLine("public ");
+    @Override public void generateConstructor(Set<Modifier> modifiers, String className, List<ParameterExpression> parameters, Block body) {
+        if (modifiers.contains(Modifier.PRIVATE)) {
+            writer.startLine("private ");
+        } else {
+            writer.startLine("public ");
+        }
         writer.write(className);
         writer.write("(");
         for (int i = 0; i < parameters.size(); i++) {
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/MethodDefinition.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/MethodDefinition.java
index 76f0346..d43fd1f 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/MethodDefinition.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/MethodDefinition.java
@@ -52,9 +52,4 @@ public class MethodDefinition implements Node {
         writer.generate(this);
     }
 
-    public enum Modifier {
-        STATIC,
-        PRIVATE
-    }
-
 }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Modifier.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Modifier.java
new file mode 100644
index 0000000..7d97fd0
--- /dev/null
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Modifier.java
@@ -0,0 +1,7 @@
+package org.apache.plc4x.codegen.ast;
+
+public enum Modifier {
+    STATIC,
+    PRIVATE,
+    FINAL
+}
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NewExpression.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NewExpression.java
index 012e321..597ea57 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NewExpression.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NewExpression.java
@@ -7,9 +7,13 @@ public class NewExpression extends Expression {
 
     private List<Node> arguments;
 
-    public NewExpression(TypeNode myClazz, Node... arguments) {
+    public NewExpression(TypeNode myClazz, List<Node> arguments) {
         super(myClazz);
-        this.arguments = Arrays.asList(arguments);
+        this.arguments = arguments;
+    }
+
+    public NewExpression(TypeNode myClazz, Node... arguments) {
+        this(myClazz, Arrays.asList(arguments));
     }
 
     public List<Node> getArguments() {
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PhpGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PhpGenerator.java
deleted file mode 100644
index f0fe64c..0000000
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PhpGenerator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.apache.plc4x.codegen.ast;
-
-import java.util.List;
-
-public class PhpGenerator implements Generator {
-
-    private final CodeWriter writer;
-
-    public PhpGenerator(CodeWriter writer) {
-        this.writer = writer;
-    }
-
-    @Override public void generate(ConstantNode constantNode) {
-        this.writer.write(constantNode.getValue().toString());
-    }
-
-    @Override public void generateDeclarationWithInitializer(DeclarationStatement declarationStatement) {
-        this.writer.startLine("");
-        this.writer.write("$");
-        this.writer.write(declarationStatement.getParameterExpression().getName());
-        this.writer.write(" = ");
-        declarationStatement.getInitializer().write(this);
-        this.writer.write("\n");
-    }
-
-    @Override public void generateDeclaration(DeclarationStatement declarationStatement) {
-
-    }
-
-    @Override public void generate(ParameterExpression parameterExpression) {
-        // not needed
-    }
-
-    @Override public void generate(Primitive primitive) {
-        // Not needed, php is typeless
-    }
-
-    @Override public void generate(IfStatement ifStatement) {
-
-    }
-
-    @Override public void writeBlock(Block statements) {
-
-    }
-
-    @Override public void generate(BinaryExpression binaryExpression) {
-
-    }
-
-    @Override public void generate(AssignementExpression assignementExpression) {
-
-    }
-
-    @Override public void generateStaticCall(Method method, List<Node> constantNode) {
-
-    }
-
-    @Override public void generateCall(Node target, Method method, List<Node> constantNode) {
-
-    }
-
-    @Override public void generate(NewExpression newExpression) {
-
-    }
-
-    @Override public void generate(MethodDefinition methodDefinition) {
-
-    }
-
-    @Override public void generateReturn(Expression value) {
-
-    }
-
-    @Override public void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDefinition> innerClasses, boolean mainClass) {
-
-    }
-
-    @Override public void generateFieldDeclaration(TypeNode type, String name) {
-
-    }
-
-    @Override public void generateFieldReference(TypeNode type, String name) {
-
-    }
-
-    @Override public void generateConstructor(String className, List<ParameterExpression> parameters, Block body) {
-
-    }
-
-    @Override public void generateFile(ClassDefinition mainClass, List<ClassDefinition> innerClasses) {
-
-    }
-
-    @Override public void generateType(String typeString) {
-
-    }
-
-    @Override public void generateComment(String comment) {
-
-    }
-
-    @Override public void generateNoOp() {
-
-    }
-}
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
index bfe345f..3f01e99 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
@@ -7,6 +7,8 @@ import java.util.List;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import static org.apache.plc4x.codegen.ast.EnumFactory.getMethodDefinition;
+
 public class PojoFactory {
 
     public ClassDefinition create(PojoDescription desc) {
@@ -17,13 +19,7 @@ public class PojoFactory {
 
         // Create the Getters
         final List<MethodDefinition> getters = desc.fields.stream()
-            .map(new Function<Field, MethodDefinition>() {
-                @Override public MethodDefinition apply(Field field) {
-                    String getter = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1, field.getName().length());
-                    Block body = new Block(new ReturnStatement(new FieldReference(field.getType(), field.getName())));
-                    return new MethodDefinition(getter, field.getType(), Collections.emptyList(), body);
-                }
-            })
+            .map(field -> getMethodDefinition(field.getName(), field.getType()))
             .collect(Collectors.toList());
 
         final List<MethodDefinition> methods = new ArrayList<>();
@@ -35,7 +31,7 @@ public class PojoFactory {
         ), new Block()));
 
         // Decode Method
-        methods.add(new MethodDefinition(Collections.singleton(MethodDefinition.Modifier.STATIC), "decode", new TypeNode(desc.getName()), Collections.singletonList(
+        methods.add(new MethodDefinition(Collections.singleton(Modifier.STATIC), "decode", new TypeNode(desc.getName()), Collections.singletonList(
             new ParameterExpression(new TypeNode("org.apache.plc4x.api.Buffer"), "buffer")
         ), new Block()));
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PythonGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PythonGenerator.java
index 5faedfb..cccaf61 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PythonGenerator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PythonGenerator.java
@@ -1,6 +1,7 @@
 package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
+import java.util.Set;
 
 public class PythonGenerator implements Generator {
 
@@ -10,6 +11,10 @@ public class PythonGenerator implements Generator {
         this.writer = writer;
     }
 
+    @Override public Node prepare(Node root) {
+        return null;
+    }
+
     @Override public void generate(ConstantNode constantNode) {
         writer.write(constantNode.getValue().toString());
     }
@@ -133,12 +138,16 @@ public class PythonGenerator implements Generator {
     }
 
     @Override public void generate(MethodDefinition methodDefinition) {
-        if (methodDefinition.getModifiers().contains(MethodDefinition.Modifier.STATIC)) {
+        if (methodDefinition.getModifiers().contains(Modifier.STATIC)) {
             writer.writeLine("@classmethod");
         }
         writer.startLine("def ");
         writer.write(methodDefinition.getName());
         writer.write("(");
+        writer.write("self");
+        if (!methodDefinition.getParameters().isEmpty()) {
+            writer.write(", ");
+        }
         for (int i = 0; i < methodDefinition.getParameters().size(); i++) {
             methodDefinition.getParameters().get(i).write(this);
             writer.write(": ");
@@ -190,7 +199,7 @@ public class PythonGenerator implements Generator {
         // Constructors
         if (constructors != null) {
             for (ConstructorDeclaration constructor : constructors) {
-                this.generateConstructor(className, constructor.getParameters(), constructor.getBody());
+                this.generateConstructor(constructor.getModifiers(), className, constructor.getParameters(), constructor.getBody());
                 writer.writeLine("");
             }
         }
@@ -211,11 +220,18 @@ public class PythonGenerator implements Generator {
         writer.endBlock();
     }
 
-    @Override public void generateFieldDeclaration(TypeNode type, String name) {
-        writer.startLine("self.");
+    @Override public void generateFieldDeclaration(Set<Modifier> modifiers, TypeNode type, String name, Expression initializer) {
+        writer.startLine("");
         writer.write(name);
         writer.write(": ");
         type.write(this);
+        // If its static, assign here
+        if (initializer != null) {
+            assert modifiers.contains(Modifier.STATIC);
+            // TODO Python cannot self reference
+            writer.write(" = ");
+            initializer.write(this);
+        }
         writer.endLine();
     }
 
@@ -224,7 +240,7 @@ public class PythonGenerator implements Generator {
         writer.write(name);
     }
 
-    @Override public void generateConstructor(String className, List<ParameterExpression> parameters, Block body) {
+    @Override public void generateConstructor(Set<Modifier> modifiers, String className, List<ParameterExpression> parameters, Block body) {
         writer.startLine("def __init__(");
         for (int i = 0; i < parameters.size(); i++) {
             parameters.get(i).getType().write(this);
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/EnumFactoryTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/EnumFactoryTest.java
new file mode 100644
index 0000000..df43cd7
--- /dev/null
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/EnumFactoryTest.java
@@ -0,0 +1,70 @@
+package org.apache.plc4x.codegen.ast;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+
+public class EnumFactoryTest {
+
+    @Test
+    public void createEnums() {
+        System.out.println("Java:");
+        System.out.println("----------");
+        final ClassDefinition MyEnum = newEnum();
+
+        final CodeWriter writer = new CodeWriter(4);
+        final JavaGenerator generator = new JavaGenerator(writer);
+
+        MyEnum.write(generator);
+
+        System.out.println(writer.getCode());
+    }
+
+    @Test
+    public void createEnumsInPython() {
+        System.out.println("Python:");
+        System.out.println("----------");
+        final ClassDefinition MyEnum = newEnum();
+
+        final CodeWriter writer = new CodeWriter(4);
+        final PythonGenerator generator = new PythonGenerator(writer);
+
+        MyEnum.write(generator);
+
+        System.out.println(writer.getCode());
+    }
+
+    private ClassDefinition newEnum() {
+        final EnumFactory factory = new EnumFactory();
+        final EnumFactory.PojoDescription description = new EnumFactory.PojoDescription("MyPojo",
+            new EnumFactory.Field(Primitive.DOUBLE, "field1"),
+            new EnumFactory.Field(Primitive.DOUBLE, "field2"),
+            new EnumFactory.Field(Primitive.DOUBLE, "field3")
+        );
+        return factory.create(description,
+            Arrays.asList(
+                new EnumFactory.EnumEntry("alternative1", Arrays.asList(
+                    new ConstantNode(1.0),
+                    new ConstantNode(2.0),
+                    new ConstantNode(3.0)
+                )),
+                new EnumFactory.EnumEntry("alternative2", Arrays.asList(
+                    new ConstantNode(1.0),
+                    new ConstantNode(2.0),
+                    new ConstantNode(3.0)
+                )),
+                new EnumFactory.EnumEntry("alternative3", Arrays.asList(
+                    new ConstantNode(1.0),
+                    new ConstantNode(2.0),
+                    new ConstantNode(3.0)
+                )),
+                new EnumFactory.EnumEntry("alternative4", Arrays.asList(
+                    new ConstantNode(1.0),
+                    new ConstantNode(2.0),
+                    new ConstantNode(3.0)
+                ))
+            )
+        );
+    }
+
+}
\ No newline at end of file
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PhpGeneratorTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PhpGeneratorTest.java
deleted file mode 100644
index f5ba88f..0000000
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PhpGeneratorTest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.apache.plc4x.codegen.ast;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class PhpGeneratorTest {
-
-    @Test
-    public void createSomeCode() {
-        final CodeWriter writer = new CodeWriter(4);
-
-        final DeclarationStatement stmt = new DeclarationStatement(new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantNode(5.0));
-
-        final Generator generator = new PhpGenerator(writer);
-
-        stmt.write(generator);
-
-        final String code = writer.getCode();
-
-        assertEquals("$a = 5.0\n", code);
-    }
-}
\ No newline at end of file