| #!/usr/bin/env python | 
 | # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 | from element_generator import GenerateFieldContent | 
 | from element_generator import GenerateElements | 
 | import unittest | 
 |  | 
 | class ElementGeneratorTest(unittest.TestCase): | 
 |   def testGenerateIntFieldContent(self): | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'int', 'default': 5}, None, lines, '  ', | 
 |                          {}) | 
 |     self.assertEquals(['  5,'], lines) | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'int', 'default': 5}, 12, lines, '  ', {}) | 
 |     self.assertEquals(['  12,'], lines) | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'int'}, -3, lines, '  ', {}) | 
 |     self.assertEquals(['  -3,'], lines) | 
 |  | 
 |   def testGenerateStringFieldContent(self): | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'string', 'default': 'foo_bar'}, None, | 
 |                          lines, '  ', {}) | 
 |     self.assertEquals(['  "foo_bar",'], lines) | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'string', 'default': 'foo'}, 'bar\n', | 
 |                          lines, '  ', {}) | 
 |     self.assertEquals(['  "bar\\n",'], lines) | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'string'}, None, lines, '  ', {}) | 
 |     self.assertEquals(['  NULL,'], lines) | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'string'}, 'foo', lines, '  ', {}) | 
 |     self.assertEquals(['  "foo",'], lines) | 
 |  | 
 |   def testGenerateString16FieldContent(self): | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'string16', | 
 |                               'default': u'f\u00d8\u00d81a'}, | 
 |                          None, lines, '  ', {}) | 
 |     self.assertEquals(['  L"f\\x00d8" L"\\x00d8" L"1a",'], lines) | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'string16', 'default': 'foo'}, | 
 |                          u'b\uc3a5r', lines, '  ', {}) | 
 |     self.assertEquals(['  L"b\\xc3a5" L"r",'], lines) | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'string16'}, None, lines, '  ', {}) | 
 |     self.assertEquals(['  NULL,'], lines) | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'string16'}, u'foo\\u1234', lines, '  ', | 
 |                          {}) | 
 |     self.assertEquals(['  L"foo\\\\u1234",'], lines) | 
 |  | 
 |   def testGenerateEnumFieldContent(self): | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'enum', 'default': 'RED'}, None, lines, | 
 |                          '  ', {}) | 
 |     self.assertEquals(['  RED,'], lines) | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'enum', 'default': 'RED'}, 'BLACK', lines, | 
 |                          '  ', {}) | 
 |     self.assertEquals(['  BLACK,'], lines) | 
 |     lines = []; | 
 |     GenerateFieldContent('', {'type': 'enum'}, 'BLUE', lines, '  ', {}) | 
 |     self.assertEquals(['  BLUE,'], lines) | 
 |  | 
 |   def testGenerateArrayFieldContent(self): | 
 |     lines = ['STRUCT BEGINS']; | 
 |     GenerateFieldContent('test', {'type': 'array', 'contents': {'type': 'int'}}, | 
 |                          None, lines, '  ', {}) | 
 |     self.assertEquals(['STRUCT BEGINS', '  NULL,', '  0,'], lines) | 
 |     lines = ['STRUCT BEGINS']; | 
 |     GenerateFieldContent('test', {'field': 'my_array', 'type': 'array', | 
 |                                   'contents': {'type': 'int'}}, | 
 |                          [3, 4], lines, '  ', {}) | 
 |     self.assertEquals('const int array_test_my_array[] = {\n' + | 
 |       '  3,\n' + | 
 |       '  4,\n' + | 
 |       '};\n' + | 
 |       'STRUCT BEGINS\n' + | 
 |       '  array_test_my_array,\n' + | 
 |       '  2,', '\n'.join(lines)) | 
 |     lines = ['STRUCT BEGINS']; | 
 |     GenerateFieldContent('test', {'field': 'my_array', 'type': 'array', | 
 |                                   'contents': {'type': 'int'}}, | 
 |                          [3, 4], lines, '  ', {'array_test_my_array': 1}) | 
 |     self.assertEquals('const int array_test_my_array_1[] = {\n' + | 
 |       '  3,\n' + | 
 |       '  4,\n' + | 
 |       '};\n' + | 
 |       'STRUCT BEGINS\n' + | 
 |       '  array_test_my_array_1,\n' + | 
 |       '  2,', '\n'.join(lines)) | 
 |  | 
 |   def testGenerateElements(self): | 
 |     schema = [ | 
 |       {'field': 'f0', 'type': 'int', 'default': 1000, 'optional': True}, | 
 |       {'field': 'f1', 'type': 'string'}, | 
 |       {'field': 'f2', 'type': 'enum', 'ctype': 'QuasiBool', 'default': 'MAYBE', | 
 |        'optional': True}, | 
 |       {'field': 'f3', 'type': 'array', 'contents': {'type': 'string16'}, | 
 |        'optional': True}, | 
 |       { | 
 |         'field': 'f4', | 
 |         'type': 'struct', | 
 |         'type_name': 'InnerType', | 
 |         'fields': [ | 
 |           {'field': 'g0', 'type': 'string'} | 
 |         ], | 
 |         'optional': True | 
 |       }, | 
 |       { | 
 |         'field': 'f5', | 
 |         'type': 'array', | 
 |         'contents': { | 
 |           'type': 'struct', | 
 |           'type_name': 'InnerType', | 
 |           'fields': [ | 
 |             {'field': 'a0', 'type': 'string'}, | 
 |             {'field': 'a1', 'type': 'string'} | 
 |           ] | 
 |         }, | 
 |         'optional': True | 
 |       } | 
 |     ] | 
 |     description = { | 
 |       'int_variables': {'a': -5, 'b': 5}, | 
 |       'elements': { | 
 |         'elem0': {'f0': 5, 'f1': 'foo', 'f2': 'SURE'}, | 
 |         'elem1': {'f2': 'NOWAY', 'f0': -2, 'f1': 'bar'}, | 
 |         'elem2': {'f1': 'foo_bar', 'f3': [u'bar', u'foo']}, | 
 |         'elem3': {'f1': 'foo', 'f4': {'g0': 'test'}}, | 
 |         'elem4': {'f1': 'foo', 'f5': [{'a0': 'test0', 'a1': 'test1'}]}, | 
 |       } | 
 |     } | 
 |  | 
 |     # Build the expected result stream based on the unpredicatble order the | 
 |     # dictionary element are listed in. | 
 |     int_variable_expected = { | 
 |       'a': 'const int a = -5;\n', | 
 |       'b': 'const int b = 5;\n', | 
 |     } | 
 |     elements_expected = { | 
 |       'elem0': 'const MyType elem0 = {\n' | 
 |                '  5,\n' | 
 |                '  "foo",\n' | 
 |                '  SURE,\n' | 
 |                '  NULL,\n' | 
 |                '  0,\n' | 
 |                '  {0},\n' | 
 |                '  NULL,\n' | 
 |                '  0,\n' | 
 |                '};\n', | 
 |       'elem1': 'const MyType elem1 = {\n' | 
 |                '  -2,\n' | 
 |                '  "bar",\n' | 
 |                '  NOWAY,\n' | 
 |                '  NULL,\n' | 
 |                '  0,\n' | 
 |                '  {0},\n' | 
 |                '  NULL,\n' | 
 |                '  0,\n' | 
 |                '};\n', | 
 |       'elem2': 'const wchar_t* const array_elem2_f3[] = {\n' | 
 |                '  L"bar",\n' | 
 |                '  L"foo",\n' | 
 |                '};\n' | 
 |                'const MyType elem2 = {\n' | 
 |                '  1000,\n' | 
 |                '  "foo_bar",\n' | 
 |                '  MAYBE,\n' | 
 |                '  array_elem2_f3,\n' | 
 |                '  2,\n' | 
 |                '  {0},\n' | 
 |                '  NULL,\n' | 
 |                '  0,\n' | 
 |                '};\n', | 
 |       'elem3': 'const MyType elem3 = {\n' | 
 |                '  1000,\n' | 
 |                '  "foo",\n' | 
 |                '  MAYBE,\n' | 
 |                '  NULL,\n' | 
 |                '  0,\n' | 
 |                '  {\n' | 
 |                '    "test",\n' | 
 |                '  },\n' | 
 |                '  NULL,\n' | 
 |                '  0,\n' | 
 |                '};\n', | 
 |       'elem4': 'const InnerType array_elem4_f5[] = {\n' | 
 |                '  {\n' | 
 |                '    "test0",\n' | 
 |                '    "test1",\n' | 
 |                '  },\n' | 
 |                '};\n' | 
 |                'const MyType elem4 = {\n' | 
 |                '  1000,\n' | 
 |                '  "foo",\n' | 
 |                '  MAYBE,\n' | 
 |                '  NULL,\n' | 
 |                '  0,\n' | 
 |                '  {0},\n' | 
 |                '  array_elem4_f5,\n' | 
 |                '  1,\n' | 
 |                '};\n' | 
 |     } | 
 |     expected = '' | 
 |     for key, value in description['int_variables'].items(): | 
 |       expected += int_variable_expected[key] | 
 |     expected += '\n' | 
 |     elements = [] | 
 |     for key, value in description['elements'].items(): | 
 |       elements.append(elements_expected[key]) | 
 |     expected += '\n'.join(elements) | 
 |  | 
 |     result = GenerateElements('MyType', schema, description) | 
 |     self.assertEquals(expected, result) | 
 |  | 
 |   def testGenerateElementsMissingMandatoryField(self): | 
 |     schema = [ | 
 |       {'field': 'f0', 'type': 'int'}, | 
 |       {'field': 'f1', 'type': 'string'}, | 
 |     ] | 
 |     description = { | 
 |       'int_variables': {'a': -5, 'b': 5}, | 
 |       'elements': { | 
 |         'elem0': {'f0': 5}, | 
 |       } | 
 |     } | 
 |  | 
 |     self.assertRaises(RuntimeError, | 
 |       lambda: GenerateElements('MyType', schema, description)) | 
 |  | 
 | if __name__ == '__main__': | 
 |   unittest.main() |