Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 1 | #!/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 | |
| 6 | from element_generator import GenerateFieldContent |
| 7 | from element_generator import GenerateElements |
| 8 | import unittest |
| 9 | |
| 10 | class ElementGeneratorTest(unittest.TestCase): |
| 11 | def testGenerateIntFieldContent(self): |
| 12 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 13 | GenerateFieldContent('', {'type': 'int', 'default': 5}, None, lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 14 | self.assertEquals([' 5,'], lines) |
| 15 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 16 | GenerateFieldContent('', {'type': 'int', 'default': 5}, 12, lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 17 | self.assertEquals([' 12,'], lines) |
| 18 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 19 | GenerateFieldContent('', {'type': 'int'}, -3, lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 20 | self.assertEquals([' -3,'], lines) |
| 21 | |
| 22 | def testGenerateStringFieldContent(self): |
| 23 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 24 | GenerateFieldContent('', {'type': 'string', 'default': 'foo_bar'}, None, |
| 25 | lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 26 | self.assertEquals([' "foo_bar",'], lines) |
| 27 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 28 | GenerateFieldContent('', {'type': 'string', 'default': 'foo'}, 'bar\n', |
| 29 | lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 30 | self.assertEquals([' "bar\\n",'], lines) |
| 31 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 32 | GenerateFieldContent('', {'type': 'string'}, None, lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 33 | self.assertEquals([' NULL,'], lines) |
| 34 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 35 | GenerateFieldContent('', {'type': 'string'}, 'foo', lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 36 | self.assertEquals([' "foo",'], lines) |
| 37 | |
| 38 | def testGenerateString16FieldContent(self): |
| 39 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 40 | GenerateFieldContent('', {'type': 'string16', |
| 41 | 'default': u'f\u00d8\u00d81a'}, None, lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 42 | self.assertEquals([' L"f\\x00d8" L"\\x00d8" L"1a",'], lines) |
| 43 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 44 | GenerateFieldContent('', {'type': 'string16', 'default': 'foo'}, |
| 45 | u'b\uc3a5r', lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 46 | self.assertEquals([' L"b\\xc3a5" L"r",'], lines) |
| 47 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 48 | GenerateFieldContent('', {'type': 'string16'}, None, lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 49 | self.assertEquals([' NULL,'], lines) |
| 50 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 51 | GenerateFieldContent('', {'type': 'string16'}, u'foo\\u1234', lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 52 | self.assertEquals([' L"foo\\\\u1234",'], lines) |
| 53 | |
| 54 | def testGenerateEnumFieldContent(self): |
| 55 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 56 | GenerateFieldContent('', {'type': 'enum', 'default': 'RED'}, None, lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 57 | self.assertEquals([' RED,'], lines) |
| 58 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 59 | GenerateFieldContent('', {'type': 'enum', 'default': 'RED'}, 'BLACK', lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 60 | self.assertEquals([' BLACK,'], lines) |
| 61 | lines = []; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 62 | GenerateFieldContent('', {'type': 'enum'}, 'BLUE', lines) |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 63 | self.assertEquals([' BLUE,'], lines) |
| 64 | |
| 65 | def testGenerateArrayFieldContent(self): |
| 66 | lines = ['STRUCT BEGINS']; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 67 | GenerateFieldContent('test', {'type': 'array', 'contents': {'type': 'int'}}, |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 68 | None, lines) |
| 69 | self.assertEquals(['STRUCT BEGINS', ' NULL,', ' 0,'], lines) |
| 70 | lines = ['STRUCT BEGINS']; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 71 | 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) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 74 | ' 3,\n' + |
| 75 | ' 4,\n' + |
| 76 | '};\n' + |
| 77 | 'STRUCT BEGINS\n' + |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 78 | ' array_test_my_array,\n' + |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 79 | ' 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 Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 120 | 'elem2': 'const wchar_t* const array_elem2_f3[] = {\n' + |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 121 | ' 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 Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 128 | ' array_elem2_f3,\n' + |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 129 | ' 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 | |
| 159 | if __name__ == '__main__': |
| 160 | unittest.main() |