Mercurial > hg > orthanc-stone
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