From 78bb20ddfef0e9d66c1051f8ed3bd8dc3508be36 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Mon, 11 Mar 2019 13:35:03 +0100
Subject: [PATCH] fi token and enum serialisation and add tests

---
 src/main/jastadd/Backend.jadd                 | 24 ++++++++-------
 src/test/jastadd/Utils.jadd                   | 16 ++++++----
 src/test/jastadd/serializer/Serializer.relast | 15 +++++++++-
 .../org/jastadd/relast/tests/Serializer.java  | 30 +++++++++++++++++++
 4 files changed, 67 insertions(+), 18 deletions(-)

diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd
index 9b0fce8..f4f4322 100644
--- a/src/main/jastadd/Backend.jadd
+++ b/src/main/jastadd/Backend.jadd
@@ -84,6 +84,8 @@ aspect BackendAspect {
   public void Program.generateAspect(StringBuilder sb) {
     sb.append("import java.util.ArrayList;\n");
     sb.append("import java.util.Collections;\n");
+    sb.append("import java.time.Instant;\n");
+    sb.append("import java.time.Period;\n");
     sb.append("aspect RelAstAPI {\n");
 
     for (TypeDecl td: getTypeDecls()) {
@@ -1034,15 +1036,15 @@ aspect Serializer {
       case "String":
         sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "());\n");
         break;
-      case "java.time.Instant":
-        sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "()).toString());\n");
+      case "Instant":
+        sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().toString());\n");
         break;
-      case "java.time.Period":
-        sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "()).toString());\n");
+      case "Period":
+        sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().toString());\n");
         break;
       default:
         // assume that the type is an enum. there is no way of checking this here
-        sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "()).name());\n");
+        sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().name());\n");
         // sb.append("throw new DeserializationException(\"Unable to deserialize child node of type \"" + getTypeUse() + "\"\")")
     }
   }
@@ -1192,7 +1194,7 @@ aspect Serializer {
       case "Character":
         sb.append(ind(indent) + "String chars = children.get(\"" + getID() + "\").asText();\n");
         sb.append(ind(indent) + "if (chars.length() == 1) {\n");
-        sb.append(ind(indent + 2) + "element.set" + getID() + "(chars.charAt(0))\n");
+        sb.append(ind(indent + 2) + "element.set" + getID() + "(chars.charAt(0));\n");
         sb.append(ind(indent) + "} else {\n");
         sb.append(ind(indent + 2) + "throw new DeserializationException(\"unable to deserialize char '\" + chars + \"'\");\n");
         sb.append(ind(indent) + "}\n");
@@ -1200,15 +1202,15 @@ aspect Serializer {
       case "String":
         sb.append(ind(indent) + "element.set" + getID() + "(children.get(\"" + getID() + "\").asText());\n");
         break;
-      case "java.time.Instant":
-        sb.append(ind(indent) + "element.set" + getID() + "(java.time.Instant.parse(children.get(\"" + getID() + "\").asText()));\n");
+      case "Instant":
+        sb.append(ind(indent) + "element.set" + getID() + "(Instant.parse(children.get(\"" + getID() + "\").asText()));\n");
         break;
-      case "java.time.Period":
-        sb.append(ind(indent) + "element.set" + getID() + "(java.time.Period.parse(children.get(\"" + getID() + "\").asText()));\n");
+      case "Period":
+        sb.append(ind(indent) + "element.set" + getID() + "(Period.parse(children.get(\"" + getID() + "\").asText()));\n");
         break;
       default:
         // assume that the type is an enum. there is no way of checking this here
-        sb.append(ind(indent) + "element.set" + getID() + "Enum.valueOf(" + type + ".getClass(), children.get(\"" + getID() + "\".asText())));\n");
+        sb.append(ind(indent) + "element.set" + getID() + "(Enum.valueOf(" + type + ".class, children.get(\"" + getID() + "\").asText()));\n");
 
         // sb.append("throw new DeserializationException(\"Unable to deserialize child node of type \"" + getTypeUse() + "\"\")")
     }
diff --git a/src/test/jastadd/Utils.jadd b/src/test/jastadd/Utils.jadd
index d7acb1b..e0e012f 100644
--- a/src/test/jastadd/Utils.jadd
+++ b/src/test/jastadd/Utils.jadd
@@ -1,9 +1,13 @@
 aspect Utils {
-	public String A.toString() {
-		return getName();
-	}
+  public String A.toString() {
+    return getName();
+  }
 
-	public String B.toString() {
-		return getName();
-	}
+  public String B.toString() {
+    return getName();
+  }
+
+  public enum Weekday {
+    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
+  }
 }
\ No newline at end of file
diff --git a/src/test/jastadd/serializer/Serializer.relast b/src/test/jastadd/serializer/Serializer.relast
index 41c9e62..6bbd44b 100644
--- a/src/test/jastadd/serializer/Serializer.relast
+++ b/src/test/jastadd/serializer/Serializer.relast
@@ -2,7 +2,20 @@
 Root ::= A* B* C;
 A:NamedElement;
 B:NamedElement;
-C:NamedElement ::= D1:D [D2:D] D3:D* <F1:float> <F2:Float>;
+C:NamedElement ::= D1:D [D2:D] D3:D*
+    <F1:float> <F2:Float>
+    <DD1:double> <DD2:Double>
+    <I1:int> <I2:Integer>
+    <S1:short> <S2:Short>
+    <L1:long> <L2:Long>
+    <B1:byte> <B2:Byte>
+    <O1:boolean> <O2:Boolean>
+    <C1:char> <C2:Character>
+    <T1:String>
+    <T2>
+    <N:Instant>
+    <P:Period>
+    <Day:Weekday>;
 D:NamedElement;
 
 abstract NamedElement ::= <Name>;
diff --git a/src/test/java/org/jastadd/relast/tests/Serializer.java b/src/test/java/org/jastadd/relast/tests/Serializer.java
index 3289ef2..96a57d4 100644
--- a/src/test/java/org/jastadd/relast/tests/Serializer.java
+++ b/src/test/java/org/jastadd/relast/tests/Serializer.java
@@ -5,6 +5,8 @@ import serializer.ast.*;
 
 import java.io.File;
 import java.io.IOException;
+import java.time.Instant;
+import java.time.Period;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -37,6 +39,34 @@ class Serializer {
     c.setF1(42f);
     c.setF2(42.13f);
 
+    c.setDD1(42.d);
+    c.setDD2(42.13d);
+
+    c.setI1(23);
+    c.setI2(42);
+    c.setS1((short)66);
+    c.setS2((short)77);
+
+    c.setL1(342l);
+    c.setL2(5453L);
+
+    c.setB1((byte)5);
+    c.setB2((byte)'c');
+
+    c.setO1(true);
+    c.setO2(false);
+
+    c.setC1('c');
+    c.setC2((char)5);
+
+    c.setT1("23");
+    c.setT2("dfjsv");
+
+    c.setN(Instant.now());
+    c.setP(Period.ofDays(1));
+
+    c.setDay(Weekday.FRIDAY);
+
     r.setC(c);
 
     // non-containment relations
-- 
GitLab