blob: 67459a1d8713f142ebbc8850d2978ed279e09bae [file] [log] [blame]
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00001#!/usr/bin/env python
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
6from element_generator import GenerateFieldContent
7from element_generator import GenerateElements
8import unittest
9
10class ElementGeneratorTest(unittest.TestCase):
11 def testGenerateIntFieldContent(self):
12 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010013 GenerateFieldContent('', {'type': 'int', 'default': 5}, None, lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000014 self.assertEquals([' 5,'], lines)
15 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010016 GenerateFieldContent('', {'type': 'int', 'default': 5}, 12, lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000017 self.assertEquals([' 12,'], lines)
18 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010019 GenerateFieldContent('', {'type': 'int'}, -3, lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000020 self.assertEquals([' -3,'], lines)
21
22 def testGenerateStringFieldContent(self):
23 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010024 GenerateFieldContent('', {'type': 'string', 'default': 'foo_bar'}, None,
25 lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000026 self.assertEquals([' "foo_bar",'], lines)
27 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010028 GenerateFieldContent('', {'type': 'string', 'default': 'foo'}, 'bar\n',
29 lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000030 self.assertEquals([' "bar\\n",'], lines)
31 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010032 GenerateFieldContent('', {'type': 'string'}, None, lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000033 self.assertEquals([' NULL,'], lines)
34 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010035 GenerateFieldContent('', {'type': 'string'}, 'foo', lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000036 self.assertEquals([' "foo",'], lines)
37
38 def testGenerateString16FieldContent(self):
39 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010040 GenerateFieldContent('', {'type': 'string16',
41 'default': u'f\u00d8\u00d81a'}, None, lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000042 self.assertEquals([' L"f\\x00d8" L"\\x00d8" L"1a",'], lines)
43 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010044 GenerateFieldContent('', {'type': 'string16', 'default': 'foo'},
45 u'b\uc3a5r', lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000046 self.assertEquals([' L"b\\xc3a5" L"r",'], lines)
47 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010048 GenerateFieldContent('', {'type': 'string16'}, None, lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000049 self.assertEquals([' NULL,'], lines)
50 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010051 GenerateFieldContent('', {'type': 'string16'}, u'foo\\u1234', lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000052 self.assertEquals([' L"foo\\\\u1234",'], lines)
53
54 def testGenerateEnumFieldContent(self):
55 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010056 GenerateFieldContent('', {'type': 'enum', 'default': 'RED'}, None, lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000057 self.assertEquals([' RED,'], lines)
58 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010059 GenerateFieldContent('', {'type': 'enum', 'default': 'RED'}, 'BLACK', lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000060 self.assertEquals([' BLACK,'], lines)
61 lines = [];
Ben Murdochbb1529c2013-08-08 10:24:53 +010062 GenerateFieldContent('', {'type': 'enum'}, 'BLUE', lines)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000063 self.assertEquals([' BLUE,'], lines)
64
65 def testGenerateArrayFieldContent(self):
66 lines = ['STRUCT BEGINS'];
Ben Murdochbb1529c2013-08-08 10:24:53 +010067 GenerateFieldContent('test', {'type': 'array', 'contents': {'type': 'int'}},
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000068 None, lines)
69 self.assertEquals(['STRUCT BEGINS', ' NULL,', ' 0,'], lines)
70 lines = ['STRUCT BEGINS'];
Ben Murdochbb1529c2013-08-08 10:24:53 +010071 GenerateFieldContent('test', {'field': 'my_array', 'type': 'array',
72 'contents': {'type': 'int'}}, [3, 4], lines)
73 self.assertEquals('const int array_test_my_array[] = {\n' +
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000074 ' 3,\n' +
75 ' 4,\n' +
76 '};\n' +
77 'STRUCT BEGINS\n' +
Ben Murdochbb1529c2013-08-08 10:24:53 +010078 ' array_test_my_array,\n' +
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000079 ' 2,', '\n'.join(lines))
80
81 def testGenerateElements(self):
82 schema = [
83 {'field': 'f0', 'type': 'int', 'default': 1000, 'optional': True},
84 {'field': 'f1', 'type': 'string'},
85 {'field': 'f2', 'type': 'enum', 'ctype': 'QuasiBool', 'default': 'MAYBE',
86 'optional': True},
87 {'field': 'f3', 'type': 'array', 'contents': {'type': 'string16'},
88 'optional': True}
89 ]
90 description = {
91 'int_variables': {'a': -5, 'b': 5},
92 'elements': {
93 'elem0': {'f0': 5, 'f1': 'foo', 'f2': 'SURE'},
94 'elem1': {'f2': 'NOWAY', 'f0': -2, 'f1': 'bar'},
95 'elem2': {'f1': 'foo_bar', 'f3': [u'bar', u'foo']}
96 }
97 }
98
99 # Build the expected result stream based on the unpredicatble order the
100 # dictionary element are listed in.
101 int_variable_expected = {
102 'a': 'const int a = -5;\n',
103 'b': 'const int b = 5;\n',
104 }
105 elements_expected = {
106 'elem0': 'const MyType elem0 = {\n' +
107 ' 5,\n' +
108 ' "foo",\n' +
109 ' SURE,\n' +
110 ' NULL,\n' +
111 ' 0,\n'
112 '};\n',
113 'elem1': 'const MyType elem1 = {\n' +
114 ' -2,\n' +
115 ' "bar",\n' +
116 ' NOWAY,\n' +
117 ' NULL,\n' +
118 ' 0,\n'
119 '};\n',
Ben Murdochbb1529c2013-08-08 10:24:53 +0100120 'elem2': 'const wchar_t* const array_elem2_f3[] = {\n' +
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000121 ' L"bar",\n' +
122 ' L"foo",\n' +
123 '};\n' +
124 'const MyType elem2 = {\n' +
125 ' 1000,\n' +
126 ' "foo_bar",\n' +
127 ' MAYBE,\n' +
Ben Murdochbb1529c2013-08-08 10:24:53 +0100128 ' array_elem2_f3,\n' +
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000129 ' 2,\n'
130 '};\n'
131 }
132 expected = ''
133 for key, value in description['int_variables'].items():
134 expected += int_variable_expected[key]
135 expected += '\n'
136 elements = []
137 for key, value in description['elements'].items():
138 elements.append(elements_expected[key])
139 expected += '\n'.join(elements)
140
141 result = GenerateElements('MyType', schema, description)
142 self.assertEquals(expected, result)
143
144 def testGenerateElementsMissingMandatoryField(self):
145 schema = [
146 {'field': 'f0', 'type': 'int'},
147 {'field': 'f1', 'type': 'string'},
148 ]
149 description = {
150 'int_variables': {'a': -5, 'b': 5},
151 'elements': {
152 'elem0': {'f0': 5},
153 }
154 }
155
156 self.assertRaises(RuntimeError,
157 lambda: GenerateElements('MyType', schema, description))
158
159if __name__ == '__main__':
160 unittest.main()