Mercurial > hg > orthanc-stone
comparison 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 |
comparison
equal
deleted
inserted
replaced
490:6470248790db | 491:8e7e151ef472 |
---|---|
1 # | |
2 # 1 2 3 4 5 6 7 8 | |
3 # 345678901234567890123456789012345678901234567890123456789012345678901234567890 | |
4 # | |
5 | |
1 from stonegentool import \ | 6 from stonegentool import \ |
2 EatToken,SplitListOfTypes,ParseTemplateType,LoadSchema,CheckSchemaSchema,ProcessSchema | 7 EatToken,SplitListOfTypes,ParseTemplateType,ProcessSchema, \ |
8 CheckSchemaSchema,LoadSchema,trim,ComputeRequiredDeclarationOrder, \ | |
9 GetTemplatingDictFromSchemaFilename | |
3 import unittest | 10 import unittest |
4 import os | 11 import os |
5 import re | 12 import re |
13 import pprint | |
14 from jinja2 import Template | |
15 | |
16 ymlSchema = trim("""rootName: VsolMessages | |
17 | |
18 struct B: | |
19 someAs: vector<A> | |
20 someInts: vector<int32> | |
21 | |
22 struct C: | |
23 someBs: vector<B> | |
24 ddd: vector<string> | |
25 | |
26 struct A: | |
27 someStrings: vector<string> | |
28 someInts2: vector<int32> | |
29 movies: vector<MovieType> | |
30 | |
31 enum MovieType: | |
32 - RomCom | |
33 - Horror | |
34 - ScienceFiction | |
35 - Vegetables | |
36 | |
37 enum CrispType: | |
38 - SaltAndPepper | |
39 - CreamAndChives | |
40 - Paprika | |
41 - Barbecue | |
42 ) | |
43 """) | |
6 | 44 |
7 def RemoveDateTimeLine(s : str): | 45 def RemoveDateTimeLine(s : str): |
8 # regex are non-multiline by default, and $ does NOT match the end of the line | 46 # regex are non-multiline by default, and $ does NOT match the end of the line |
9 s2 = re.sub(r"^// autogenerated by stonegentool on .*\n","",s) | 47 s2 = re.sub(r"^// autogenerated by stonegentool on .*\n","",s) |
10 return s2 | 48 return s2 |
76 self.assertEqual(ok4,True) | 114 self.assertEqual(ok4,True) |
77 self.assertEqual(a4,"map") | 115 self.assertEqual(a4,"map") |
78 self.assertEqual(b4,["int","vector<string>"]) | 116 self.assertEqual(b4,["int","vector<string>"]) |
79 | 117 |
80 def test_ParseSchema(self): | 118 def test_ParseSchema(self): |
81 fn = os.path.join(os.path.dirname(__file__), 'test', 'test1.jsonc') | 119 fn = os.path.join(os.path.dirname(__file__), 'test_data', 'test1.yaml') |
82 obj = LoadSchema(fn) | 120 obj = LoadSchema(fn) |
83 # we're happy if it does not crash | 121 # we're happy if it does not crash :) |
84 CheckSchemaSchema(obj) | 122 CheckSchemaSchema(obj) |
85 | 123 |
86 def test_ParseSchema_bogus_json(self): | 124 # def test_ParseSchema_bogus_json(self): |
87 fn = os.path.join(os.path.dirname(__file__), 'test', 'test1_bogus_json.jsonc') | 125 # fn = os.path.join(os.path.dirname(__file__), 'test', 'test1_bogus_json.jsonc') |
88 self.assertRaises(Exception,LoadSchema,fn) | 126 # self.assertRaises(Exception,LoadSchema,fn) |
89 | 127 |
90 def test_ParseSchema_bogus_schema(self): | 128 # def test_ParseSchema_bogus_schema(self): |
91 fn = os.path.join(os.path.dirname(__file__), 'test', 'test1_bogus_schema.jsonc') | 129 # fn = os.path.join(os.path.dirname(__file__), 'test', 'test1_bogus_schema.jsonc') |
130 # obj = LoadSchema(fn) | |
131 # self.assertRaises(Exception,CheckSchemaSchema,obj) | |
132 | |
133 def test_ComputeRequiredDeclarationOrder(self): | |
134 fn = os.path.join(os.path.dirname(__file__), 'test_data', 'test1.yaml') | |
92 obj = LoadSchema(fn) | 135 obj = LoadSchema(fn) |
93 self.assertRaises(Exception,CheckSchemaSchema,obj) | 136 genOrder: str = ComputeRequiredDeclarationOrder(obj) |
94 | 137 self.assertEqual(3,len(genOrder)) |
95 def test_GenOrderQueue(self): | 138 self.assertEqual("A",genOrder[0]) |
96 fn = os.path.join(os.path.dirname(__file__), 'test', 'test1.jsonc') | 139 self.assertEqual("B",genOrder[1]) |
140 self.assertEqual("C",genOrder[2]) | |
141 | |
142 # def test_GeneratePreambleEnumerationAndStructs(self): | |
143 # fn = os.path.join(os.path.dirname(__file__), 'test', 'test1.jsonc') | |
144 # obj = LoadSchema(fn) | |
145 # (_,genc,_) = ProcessSchema(obj) | |
146 | |
147 def test_genEnums(self): | |
148 fn = os.path.join(os.path.dirname(__file__), 'test_data', 'test1.yaml') | |
97 obj = LoadSchema(fn) | 149 obj = LoadSchema(fn) |
98 genOrderQueue:str | 150 genOrder: str = ComputeRequiredDeclarationOrder(obj) |
99 _, _, genOrderQueue = ProcessSchema(obj) | 151 processedSchema = ProcessSchema(obj, genOrder) |
100 self.assertEqual(3,len(genOrderQueue)) | 152 processedSchemaStr = pprint.pformat(processedSchema,indent=2) |
101 self.assertEqual("A",genOrderQueue[0]) | 153 processedSchemaStrRef = """{ 'enums': [ { 'fields': ['RomCom', 'Horror', 'ScienceFiction', 'Vegetables'], |
102 self.assertEqual("B",genOrderQueue[1]) | 154 'name': 'MovieType'}, |
103 self.assertEqual("C",genOrderQueue[2]) | 155 { 'fields': [ 'SaltAndPepper', |
104 | 156 'CreamAndChives', |
105 def test_GeneratePreambleEnumerationAndStructs(self): | 157 'Paprika', |
106 fn = os.path.join(os.path.dirname(__file__), 'test', 'test1.jsonc') | 158 'Barbecue'], |
107 obj = LoadSchema(fn) | 159 'name': 'CrispType'}], |
108 (_,outputStreams,_) = ProcessSchema(obj) | 160 'rootName': 'VsolMessages', |
109 | 161 'structs': [ { 'fields': { 'movies': 'vector<MovieType>', |
110 tsPreambleRef: str = "// autogenerated by stonegentool on Fri Feb 15 07:36:51 2019\n" | 162 'someInts2': 'vector<int32>', |
111 tsEnumsRef: str = """enum MovieType | 163 'someStrings': 'vector<string>'}, |
112 { | 164 'name': 'A'}, |
113 Romcom, | 165 { 'fields': {'someAs': 'vector<A>', 'someInts': 'vector<int32>'}, |
166 'name': 'B'}, | |
167 { 'fields': {'ddd': 'vector<string>', 'someBs': 'vector<B>'}, | |
168 'name': 'C'}]}""" | |
169 | |
170 self.assertEqual(processedSchemaStrRef,processedSchemaStr) | |
171 | |
172 def test_GenerateTypeScriptEnums(self): | |
173 fn = os.path.join(os.path.dirname(__file__), 'test_data', 'test1.yaml') | |
174 tdico = GetTemplatingDictFromSchemaFilename(fn) | |
175 template = Template(""" // end of generic methods | |
176 {% for enum in enums%} export enum {{enum['name']}} { | |
177 {% for key in enum['fields']%} {{key}}, | |
178 {%endfor%} }; | |
179 | |
180 {%endfor%}""") | |
181 renderedCode = template.render(**tdico) | |
182 renderedCodeRef = """ // end of generic methods | |
183 export enum MovieType { | |
184 RomCom, | |
114 Horror, | 185 Horror, |
115 ScienceFiction, | 186 ScienceFiction, |
116 Vegetables | 187 Vegetables, |
117 }; | 188 }; |
118 | 189 |
119 enum CrispType | 190 export enum CrispType { |
120 { | |
121 SaltAndPepper, | 191 SaltAndPepper, |
122 CreamAndChives, | 192 CreamAndChives, |
123 Paprika, | 193 Paprika, |
124 Barbecue | 194 Barbecue, |
125 }; | 195 }; |
126 | 196 |
127 """ | 197 """ |
128 | 198 self.assertEqual(renderedCodeRef,renderedCode) |
129 tsStructsRef: str = """class A | 199 |
130 { | |
131 public Array<string> someStrings; | |
132 public Array<number> someInts2; | |
133 }; | |
134 | |
135 class B | |
136 { | |
137 public Array<A> someAs; | |
138 public Array<number> someInts; | |
139 }; | |
140 | |
141 class C | |
142 { | |
143 public Array<B> someBs; | |
144 public Array<D> ddd; | |
145 }; | |
146 | |
147 """ | |
148 | |
149 tsPreambleRefCastrated: str = RemoveDateTimeLine(tsPreambleRef) | |
150 tsPreambleCastrated: str = RemoveDateTimeLine(outputStreams.tsPreamble.getvalue()) | |
151 self.assertEqual(tsPreambleRefCastrated,tsPreambleCastrated) | |
152 self.assertEqual(tsEnumsRef,outputStreams.tsEnums.getvalue()) | |
153 self.assertEqual(tsStructsRef,outputStreams.tsStructs.getvalue()) | |
154 | |
155 cppPreambleRef: str = """// autogenerated by stonegentool on Fri Feb 15 07:36:51 2019 | |
156 #include <cstdint> | |
157 #include <string> | |
158 #include <vector> | |
159 #include <map> | |
160 | |
161 """ | |
162 | |
163 cppEnumsRef: str = """enum MovieType | |
164 { | |
165 Romcom, | |
166 Horror, | |
167 ScienceFiction, | |
168 Vegetables | |
169 }; | |
170 | |
171 enum CrispType | |
172 { | |
173 SaltAndPepper, | |
174 CreamAndChives, | |
175 Paprika, | |
176 Barbecue | |
177 }; | |
178 | |
179 """ | |
180 cppStructsRef: str = """struct A | |
181 { | |
182 std::vector<string> someStrings; | |
183 std::vector<int32_t> someInts2; | |
184 }; | |
185 | |
186 struct B | |
187 { | |
188 std::vector<A> someAs; | |
189 std::vector<int32_t> someInts; | |
190 }; | |
191 | |
192 struct C | |
193 { | |
194 std::vector<B> someBs; | |
195 std::vector<D> ddd; | |
196 }; | |
197 | |
198 """ | |
199 cppPreambleRefCastrated: str = RemoveDateTimeLine(cppPreambleRef) | |
200 cppPreambleCastrated: str = RemoveDateTimeLine(outputStreams.cppPreamble.getvalue()) | |
201 self.assertEqual(cppPreambleRefCastrated,cppPreambleCastrated) | |
202 self.assertEqual(cppEnumsRef,outputStreams.cppEnums.getvalue()) | |
203 self.assertEqual(cppStructsRef,outputStreams.cppStructs.getvalue()) | |
204 | 200 |
205 def test_GenerateTypeScriptHandlerInterface(self): | 201 def test_GenerateTypeScriptHandlerInterface(self): |
206 pass | 202 pass |
207 | 203 |
208 def test_GenerateCppHandlerInterface(self): | 204 def test_GenerateCppHandlerInterface(self): |