element_generator_test.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #!/usr/bin/env python3
  2. # Copyright (c) 2012 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. from element_generator import GenerateFieldContent
  6. from element_generator import GenerateElements
  7. import unittest
  8. class ElementGeneratorTest(unittest.TestCase):
  9. def testGenerateIntFieldContent(self):
  10. lines = [];
  11. GenerateFieldContent('', {'type': 'int', 'default': 5}, None, lines, ' ',
  12. {})
  13. self.assertEquals([' 5,'], lines)
  14. lines = [];
  15. GenerateFieldContent('', {'type': 'int', 'default': 5}, 12, lines, ' ', {})
  16. self.assertEquals([' 12,'], lines)
  17. lines = [];
  18. GenerateFieldContent('', {'type': 'int'}, -3, lines, ' ', {})
  19. self.assertEquals([' -3,'], lines)
  20. def testGenerateStringFieldContent(self):
  21. lines = [];
  22. GenerateFieldContent('', {'type': 'string', 'default': 'foo_bar'}, None,
  23. lines, ' ', {})
  24. self.assertEquals([' "foo_bar",'], lines)
  25. lines = [];
  26. GenerateFieldContent('', {'type': 'string', 'default': 'foo'}, 'bar\n',
  27. lines, ' ', {})
  28. self.assertEquals([' "bar\\n",'], lines)
  29. lines = [];
  30. GenerateFieldContent('', {'type': 'string'}, None, lines, ' ', {})
  31. self.assertEquals([' NULL,'], lines)
  32. lines = [];
  33. GenerateFieldContent('', {'type': 'string'}, 'foo', lines, ' ', {})
  34. self.assertEquals([' "foo",'], lines)
  35. def testGenerateString16FieldContent(self):
  36. lines = [];
  37. GenerateFieldContent('', {'type': 'string16',
  38. 'default': u'f\u00d8\u00d81a'},
  39. None, lines, ' ', {})
  40. self.assertEquals([' L"f\\x00d8" L"\\x00d8" L"1a",'], lines)
  41. lines = [];
  42. GenerateFieldContent('', {'type': 'string16', 'default': 'foo'},
  43. u'b\uc3a5r', lines, ' ', {})
  44. self.assertEquals([' L"b\\xc3a5" L"r",'], lines)
  45. lines = [];
  46. GenerateFieldContent('', {'type': 'string16'}, None, lines, ' ', {})
  47. self.assertEquals([' NULL,'], lines)
  48. lines = [];
  49. GenerateFieldContent('', {'type': 'string16'}, u'foo\\u1234', lines, ' ',
  50. {})
  51. self.assertEquals([' L"foo\\\\u1234",'], lines)
  52. def testGenerateEnumFieldContent(self):
  53. lines = [];
  54. GenerateFieldContent('', {'type': 'enum', 'default': 'RED'}, None, lines,
  55. ' ', {})
  56. self.assertEquals([' RED,'], lines)
  57. lines = [];
  58. GenerateFieldContent('', {'type': 'enum', 'default': 'RED'}, 'BLACK', lines,
  59. ' ', {})
  60. self.assertEquals([' BLACK,'], lines)
  61. lines = [];
  62. GenerateFieldContent('', {'type': 'enum'}, 'BLUE', lines, ' ', {})
  63. self.assertEquals([' BLUE,'], lines)
  64. def testGenerateClassFieldContent(self):
  65. lines = []
  66. GenerateFieldContent('', {
  67. 'type': 'class',
  68. 'default': 'absl::nullopt'
  69. }, None, lines, ' ', {})
  70. self.assertEquals([' absl::nullopt,'], lines)
  71. lines = []
  72. GenerateFieldContent('', {
  73. 'type': 'class',
  74. 'default': 'absl::nullopt'
  75. }, 'true', lines, ' ', {})
  76. self.assertEquals([' true,'], lines)
  77. lines = []
  78. GenerateFieldContent('', {'type': 'class'}, 'false', lines, ' ', {})
  79. self.assertEquals([' false,'], lines)
  80. def testGenerateArrayFieldContent(self):
  81. lines = ['STRUCT BEGINS'];
  82. GenerateFieldContent('test', {'type': 'array', 'contents': {'type': 'int'}},
  83. None, lines, ' ', {})
  84. self.assertEquals(['STRUCT BEGINS', ' NULL,', ' 0,'], lines)
  85. lines = ['STRUCT BEGINS'];
  86. GenerateFieldContent('test', {'field': 'my_array', 'type': 'array',
  87. 'contents': {'type': 'int'}},
  88. [3, 4], lines, ' ', {})
  89. self.assertEquals('const int array_test_my_array[] = {\n' +
  90. ' 3,\n' +
  91. ' 4,\n' +
  92. '};\n' +
  93. 'STRUCT BEGINS\n' +
  94. ' array_test_my_array,\n' +
  95. ' 2,', '\n'.join(lines))
  96. lines = ['STRUCT BEGINS'];
  97. GenerateFieldContent('test', {'field': 'my_array', 'type': 'array',
  98. 'contents': {'type': 'int'}},
  99. [3, 4], lines, ' ', {'array_test_my_array': 1})
  100. self.assertEquals('const int array_test_my_array_1[] = {\n' +
  101. ' 3,\n' +
  102. ' 4,\n' +
  103. '};\n' +
  104. 'STRUCT BEGINS\n' +
  105. ' array_test_my_array_1,\n' +
  106. ' 2,', '\n'.join(lines))
  107. def testGenerateElements(self):
  108. schema = [
  109. {'field': 'f0', 'type': 'int', 'default': 1000, 'optional': True},
  110. {'field': 'f1', 'type': 'string'},
  111. {'field': 'f2', 'type': 'enum', 'ctype': 'QuasiBool', 'default': 'MAYBE',
  112. 'optional': True},
  113. {'field': 'f3', 'type': 'array', 'contents': {'type': 'string16'},
  114. 'optional': True},
  115. {
  116. 'field': 'f4',
  117. 'type': 'struct',
  118. 'type_name': 'InnerType',
  119. 'fields': [
  120. {'field': 'g0', 'type': 'string'}
  121. ],
  122. 'optional': True
  123. },
  124. {
  125. 'field': 'f5',
  126. 'type': 'array',
  127. 'contents': {
  128. 'type': 'struct',
  129. 'type_name': 'InnerType',
  130. 'fields': [
  131. {'field': 'a0', 'type': 'string'},
  132. {'field': 'a1', 'type': 'string'}
  133. ]
  134. },
  135. 'optional': True
  136. }
  137. ]
  138. description = {
  139. 'int_variables': {'a': -5, 'b': 5},
  140. 'elements': {
  141. 'elem0': {'f0': 5, 'f1': 'foo', 'f2': 'SURE'},
  142. 'elem1': {'f2': 'NOWAY', 'f0': -2, 'f1': 'bar'},
  143. 'elem2': {'f1': 'foo_bar', 'f3': [u'bar', u'foo']},
  144. 'elem3': {'f1': 'foo', 'f4': {'g0': 'test'}},
  145. 'elem4': {'f1': 'foo', 'f5': [{'a0': 'test0', 'a1': 'test1'}]},
  146. }
  147. }
  148. # Build the expected result stream based on the unpredicatble order the
  149. # dictionary element are listed in.
  150. int_variable_expected = {
  151. 'a': 'const int a = -5;\n',
  152. 'b': 'const int b = 5;\n',
  153. }
  154. elements_expected = {
  155. 'elem0': 'const MyType elem0 = {\n'
  156. ' 5,\n'
  157. ' "foo",\n'
  158. ' SURE,\n'
  159. ' NULL,\n'
  160. ' 0,\n'
  161. ' {0},\n'
  162. ' NULL,\n'
  163. ' 0,\n'
  164. '};\n',
  165. 'elem1': 'const MyType elem1 = {\n'
  166. ' -2,\n'
  167. ' "bar",\n'
  168. ' NOWAY,\n'
  169. ' NULL,\n'
  170. ' 0,\n'
  171. ' {0},\n'
  172. ' NULL,\n'
  173. ' 0,\n'
  174. '};\n',
  175. 'elem2': 'const wchar_t* const array_elem2_f3[] = {\n'
  176. ' L"bar",\n'
  177. ' L"foo",\n'
  178. '};\n'
  179. 'const MyType elem2 = {\n'
  180. ' 1000,\n'
  181. ' "foo_bar",\n'
  182. ' MAYBE,\n'
  183. ' array_elem2_f3,\n'
  184. ' 2,\n'
  185. ' {0},\n'
  186. ' NULL,\n'
  187. ' 0,\n'
  188. '};\n',
  189. 'elem3': 'const MyType elem3 = {\n'
  190. ' 1000,\n'
  191. ' "foo",\n'
  192. ' MAYBE,\n'
  193. ' NULL,\n'
  194. ' 0,\n'
  195. ' {\n'
  196. ' "test",\n'
  197. ' },\n'
  198. ' NULL,\n'
  199. ' 0,\n'
  200. '};\n',
  201. 'elem4': 'const InnerType array_elem4_f5[] = {\n'
  202. ' {\n'
  203. ' "test0",\n'
  204. ' "test1",\n'
  205. ' },\n'
  206. '};\n'
  207. 'const MyType elem4 = {\n'
  208. ' 1000,\n'
  209. ' "foo",\n'
  210. ' MAYBE,\n'
  211. ' NULL,\n'
  212. ' 0,\n'
  213. ' {0},\n'
  214. ' array_elem4_f5,\n'
  215. ' 1,\n'
  216. '};\n'
  217. }
  218. expected = ''
  219. for key, value in description['int_variables'].items():
  220. expected += int_variable_expected[key]
  221. expected += '\n'
  222. elements = []
  223. for key, value in description['elements'].items():
  224. elements.append(elements_expected[key])
  225. expected += '\n'.join(elements)
  226. result = GenerateElements('MyType', schema, description)
  227. self.assertEquals(expected, result)
  228. def testGenerateElementsMissingMandatoryField(self):
  229. schema = [
  230. {'field': 'f0', 'type': 'int'},
  231. {'field': 'f1', 'type': 'string'},
  232. ]
  233. description = {
  234. 'int_variables': {'a': -5, 'b': 5},
  235. 'elements': {
  236. 'elem0': {'f0': 5},
  237. }
  238. }
  239. self.assertRaises(RuntimeError,
  240. lambda: GenerateElements('MyType', schema, description))
  241. if __name__ == '__main__':
  242. unittest.main()