diff Resources/CodeGeneration/stonegentool_test.py @ 491:8e7e151ef472 bgo-commands-codegen

Unit tests pass for enum generation
author bgo-osimis
date Wed, 20 Feb 2019 20:51:30 +0100
parents f6b7f113cf27
children 6fbf2eae7c88
line wrap: on
line diff
--- a/Resources/CodeGeneration/stonegentool_test.py	Mon Feb 18 15:38:05 2019 +0100
+++ b/Resources/CodeGeneration/stonegentool_test.py	Wed Feb 20 20:51:30 2019 +0100
@@ -1,8 +1,46 @@
+#
+#        1         2         3         4         5         6         7         8
+# 345678901234567890123456789012345678901234567890123456789012345678901234567890
+#
+
 from stonegentool import \
-EatToken,SplitListOfTypes,ParseTemplateType,LoadSchema,CheckSchemaSchema,ProcessSchema
+EatToken,SplitListOfTypes,ParseTemplateType,ProcessSchema, \
+CheckSchemaSchema,LoadSchema,trim,ComputeRequiredDeclarationOrder, \
+GetTemplatingDictFromSchemaFilename
 import unittest
 import os
 import re
+import pprint
+from jinja2 import Template
+
+ymlSchema = trim("""rootName: VsolMessages
+
+struct B:
+  someAs: vector<A>
+  someInts: vector<int32>
+
+struct C:
+  someBs: vector<B>
+  ddd:    vector<string>
+
+struct A:
+  someStrings: vector<string>
+  someInts2: vector<int32>
+  movies: vector<MovieType>
+
+enum MovieType:
+  - RomCom
+  - Horror
+  - ScienceFiction
+  - Vegetables
+
+enum CrispType:
+ - SaltAndPepper
+ - CreamAndChives
+ - Paprika
+ - Barbecue
+)
+""")
 
 def RemoveDateTimeLine(s : str):
   # regex are non-multiline by default, and $ does NOT match the end of the line
@@ -78,129 +116,87 @@
     self.assertEqual(b4,["int","vector<string>"])
     
   def test_ParseSchema(self):
-    fn = os.path.join(os.path.dirname(__file__), 'test', 'test1.jsonc')
+    fn = os.path.join(os.path.dirname(__file__), 'test_data', 'test1.yaml')
     obj = LoadSchema(fn)
-    # we're happy if it does not crash
+    # we're happy if it does not crash :)
     CheckSchemaSchema(obj)
 
-  def test_ParseSchema_bogus_json(self):
-    fn = os.path.join(os.path.dirname(__file__), 'test', 'test1_bogus_json.jsonc')
-    self.assertRaises(Exception,LoadSchema,fn)
+  # def test_ParseSchema_bogus_json(self):
+  #   fn = os.path.join(os.path.dirname(__file__), 'test', 'test1_bogus_json.jsonc')
+  #   self.assertRaises(Exception,LoadSchema,fn)
+
+  # def test_ParseSchema_bogus_schema(self):
+  #   fn = os.path.join(os.path.dirname(__file__), 'test', 'test1_bogus_schema.jsonc')
+  #   obj = LoadSchema(fn)
+  #   self.assertRaises(Exception,CheckSchemaSchema,obj) 
 
-  def test_ParseSchema_bogus_schema(self):
-    fn = os.path.join(os.path.dirname(__file__), 'test', 'test1_bogus_schema.jsonc')
+  def test_ComputeRequiredDeclarationOrder(self):
+    fn = os.path.join(os.path.dirname(__file__), 'test_data', 'test1.yaml')
     obj = LoadSchema(fn)
-    self.assertRaises(Exception,CheckSchemaSchema,obj) 
+    genOrder: str = ComputeRequiredDeclarationOrder(obj)
+    self.assertEqual(3,len(genOrder))
+    self.assertEqual("A",genOrder[0])
+    self.assertEqual("B",genOrder[1])
+    self.assertEqual("C",genOrder[2])
 
-  def test_GenOrderQueue(self):
-    fn = os.path.join(os.path.dirname(__file__), 'test', 'test1.jsonc')
+  # def test_GeneratePreambleEnumerationAndStructs(self):
+  #   fn = os.path.join(os.path.dirname(__file__), 'test', 'test1.jsonc')
+  #   obj = LoadSchema(fn)
+  #   (_,genc,_) = ProcessSchema(obj)
+
+  def test_genEnums(self):
+    fn = os.path.join(os.path.dirname(__file__), 'test_data', 'test1.yaml')
     obj = LoadSchema(fn)
-    genOrderQueue:str
-    _, _, genOrderQueue = ProcessSchema(obj)
-    self.assertEqual(3,len(genOrderQueue))
-    self.assertEqual("A",genOrderQueue[0])
-    self.assertEqual("B",genOrderQueue[1])
-    self.assertEqual("C",genOrderQueue[2])
+    genOrder: str = ComputeRequiredDeclarationOrder(obj)
+    processedSchema = ProcessSchema(obj, genOrder)
+    processedSchemaStr = pprint.pformat(processedSchema,indent=2)
+    processedSchemaStrRef = """{ 'enums': [ { 'fields': ['RomCom', 'Horror', 'ScienceFiction', 'Vegetables'],
+               'name': 'MovieType'},
+             { 'fields': [ 'SaltAndPepper',
+                           'CreamAndChives',
+                           'Paprika',
+                           'Barbecue'],
+               'name': 'CrispType'}],
+  'rootName': 'VsolMessages',
+  'structs': [ { 'fields': { 'movies': 'vector<MovieType>',
+                             'someInts2': 'vector<int32>',
+                             'someStrings': 'vector<string>'},
+                 'name': 'A'},
+               { 'fields': {'someAs': 'vector<A>', 'someInts': 'vector<int32>'},
+                 'name': 'B'},
+               { 'fields': {'ddd': 'vector<string>', 'someBs': 'vector<B>'},
+                 'name': 'C'}]}"""
 
-  def test_GeneratePreambleEnumerationAndStructs(self):
-    fn = os.path.join(os.path.dirname(__file__), 'test', 'test1.jsonc')
-    obj = LoadSchema(fn)
-    (_,outputStreams,_) = ProcessSchema(obj)
+    self.assertEqual(processedSchemaStrRef,processedSchemaStr)
 
-    tsPreambleRef: str = "// autogenerated by stonegentool on Fri Feb 15 07:36:51 2019\n"
-    tsEnumsRef: str = """enum MovieType
-{
-    Romcom,
+  def test_GenerateTypeScriptEnums(self):
+    fn = os.path.join(os.path.dirname(__file__), 'test_data', 'test1.yaml')
+    tdico = GetTemplatingDictFromSchemaFilename(fn)
+    template = Template("""  // end of generic methods
+{% for enum in enums%}  export enum {{enum['name']}} {
+{% for key in enum['fields']%}    {{key}},
+{%endfor%}  };
+
+{%endfor%}""")
+    renderedCode = template.render(**tdico)
+    renderedCodeRef = """  // end of generic methods
+  export enum MovieType {
+    RomCom,
     Horror,
     ScienceFiction,
-    Vegetables
-};
+    Vegetables,
+  };
 
-enum CrispType
-{
+  export enum CrispType {
     SaltAndPepper,
     CreamAndChives,
     Paprika,
-    Barbecue
-};
-
-"""
-
-    tsStructsRef: str = """class A
-{
-    public Array<string> someStrings;
-    public Array<number> someInts2;
-};
-
-class B
-{
-    public Array<A> someAs;
-    public Array<number> someInts;
-};
-
-class C
-{
-    public Array<B> someBs;
-    public Array<D> ddd;
-};
-
-"""
-
-    tsPreambleRefCastrated: str = RemoveDateTimeLine(tsPreambleRef)
-    tsPreambleCastrated: str = RemoveDateTimeLine(outputStreams.tsPreamble.getvalue())
-    self.assertEqual(tsPreambleRefCastrated,tsPreambleCastrated)
-    self.assertEqual(tsEnumsRef,outputStreams.tsEnums.getvalue())
-    self.assertEqual(tsStructsRef,outputStreams.tsStructs.getvalue())
-  
-    cppPreambleRef: str = """// autogenerated by stonegentool on Fri Feb 15 07:36:51 2019
-#include <cstdint>
-#include <string>
-#include <vector>
-#include <map>
+    Barbecue,
+  };
 
 """
-
-    cppEnumsRef: str = """enum MovieType
-{
-    Romcom,
-    Horror,
-    ScienceFiction,
-    Vegetables
-};
-
-enum CrispType
-{
-    SaltAndPepper,
-    CreamAndChives,
-    Paprika,
-    Barbecue
-};
+    self.assertEqual(renderedCodeRef,renderedCode)
 
-"""
-    cppStructsRef: str = """struct A
-{
-    std::vector<string> someStrings;
-    std::vector<int32_t> someInts2;
-};
-
-struct B
-{
-    std::vector<A> someAs;
-    std::vector<int32_t> someInts;
-};
-
-struct C
-{
-    std::vector<B> someBs;
-    std::vector<D> ddd;
-};
-
-"""  
-    cppPreambleRefCastrated: str = RemoveDateTimeLine(cppPreambleRef)
-    cppPreambleCastrated: str = RemoveDateTimeLine(outputStreams.cppPreamble.getvalue())
-    self.assertEqual(cppPreambleRefCastrated,cppPreambleCastrated)
-    self.assertEqual(cppEnumsRef,outputStreams.cppEnums.getvalue())
-    self.assertEqual(cppStructsRef,outputStreams.cppStructs.getvalue())
 
   def test_GenerateTypeScriptHandlerInterface(self):
     pass