OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
2 # Copyright 2014 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 """Tests for enum_preprocess.py. | |
7 | |
8 This test suite containss various tests for the C++ -> Java enum generator. | |
9 """ | |
10 | |
11 import collections | |
12 import optparse | |
13 import os | |
14 import sys | |
15 import unittest | |
16 | |
17 import java_cpp_enum | |
18 from java_cpp_enum import EnumDefinition, GenerateOutput, GetScriptName | |
19 from java_cpp_enum import HeaderParser | |
20 | |
21 sys.path.append(os.path.join(os.path.dirname(__file__), "gyp")) | |
22 from util import build_utils | |
23 | |
24 class TestPreprocess(unittest.TestCase): | |
25 def testOutput(self): | |
26 definition = EnumDefinition(original_enum_name='ClassName', | |
27 enum_package='some.package', | |
28 entries=[('E1', 1), ('E2', '2 << 2')]) | |
29 output = GenerateOutput('path/to/file', definition) | |
30 expected = """ | |
31 // Copyright 2014 The Chromium Authors. All rights reserved. | |
32 // Use of this source code is governed by a BSD-style license that can be | |
33 // found in the LICENSE file. | |
34 | |
35 // This file is autogenerated by | |
36 // %s | |
37 // From | |
38 // path/to/file | |
39 | |
40 package some.package; | |
41 | |
42 public class ClassName { | |
43 public static final int E1 = 1; | |
44 public static final int E2 = 2 << 2; | |
45 } | |
46 """ | |
47 self.assertEqual(expected % GetScriptName(), output) | |
48 | |
49 def testParseSimpleEnum(self): | |
50 test_data = """ | |
51 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace | |
52 enum EnumName { | |
53 VALUE_ZERO, | |
54 VALUE_ONE, | |
55 }; | |
56 """.split('\n') | |
57 definitions = HeaderParser(test_data).ParseDefinitions() | |
58 self.assertEqual(1, len(definitions)) | |
59 definition = definitions[0] | |
60 self.assertEqual('EnumName', definition.class_name) | |
61 self.assertEqual('test.namespace', definition.enum_package) | |
62 self.assertEqual(collections.OrderedDict([('VALUE_ZERO', 0), | |
63 ('VALUE_ONE', 1)]), | |
64 definition.entries) | |
65 | |
66 def testParseBitShifts(self): | |
67 test_data = """ | |
68 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace | |
69 enum EnumName { | |
70 VALUE_ZERO = 1 << 0, | |
71 VALUE_ONE = 1 << 1, | |
72 }; | |
73 """.split('\n') | |
74 definitions = HeaderParser(test_data).ParseDefinitions() | |
75 self.assertEqual(1, len(definitions)) | |
76 definition = definitions[0] | |
77 self.assertEqual('EnumName', definition.class_name) | |
78 self.assertEqual('test.namespace', definition.enum_package) | |
79 self.assertEqual(collections.OrderedDict([('VALUE_ZERO', '1 << 0'), | |
80 ('VALUE_ONE', '1 << 1')]), | |
81 definition.entries) | |
82 | |
83 def testParseClassNameOverride(self): | |
84 test_data = """ | |
85 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace | |
86 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: OverrideName | |
87 enum EnumName { | |
88 FOO | |
89 }; | |
90 | |
91 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace | |
92 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: OtherOverride | |
93 enum PrefixTest { | |
94 PREFIX_TEST_A, | |
95 PREFIX_TEST_B, | |
96 }; | |
97 """.split('\n') | |
98 definitions = HeaderParser(test_data).ParseDefinitions() | |
99 self.assertEqual(2, len(definitions)) | |
100 definition = definitions[0] | |
101 self.assertEqual('OverrideName', definition.class_name) | |
102 | |
103 definition = definitions[1] | |
104 self.assertEqual('OtherOverride', definition.class_name) | |
105 self.assertEqual(collections.OrderedDict([('A', 0), | |
106 ('B', 1)]), | |
107 definition.entries) | |
108 | |
109 def testParseTwoEnums(self): | |
110 test_data = """ | |
111 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace | |
112 enum EnumOne { | |
113 ENUM_ONE_A = 1, | |
114 // Comment there | |
115 ENUM_ONE_B = A, | |
116 }; | |
117 | |
118 enum EnumIgnore { | |
119 C, D, E | |
120 }; | |
121 | |
122 // GENERATED_JAVA_ENUM_PACKAGE: other.package | |
123 // GENERATED_JAVA_PREFIX_TO_STRIP: P_ | |
124 enum EnumTwo { | |
125 P_A, | |
126 P_B | |
127 }; | |
128 """.split('\n') | |
129 definitions = HeaderParser(test_data).ParseDefinitions() | |
130 self.assertEqual(2, len(definitions)) | |
131 definition = definitions[0] | |
132 self.assertEqual('EnumOne', definition.class_name) | |
133 self.assertEqual('test.namespace', definition.enum_package) | |
134 self.assertEqual(collections.OrderedDict([('A', '1'), | |
135 ('B', 'A')]), | |
136 definition.entries) | |
137 | |
138 definition = definitions[1] | |
139 self.assertEqual('EnumTwo', definition.class_name) | |
140 self.assertEqual('other.package', definition.enum_package) | |
141 self.assertEqual(collections.OrderedDict([('A', 0), | |
142 ('B', 1)]), | |
143 definition.entries) | |
144 | |
145 def testParseThrowsOnUnknownDirective(self): | |
146 test_data = """ | |
147 // GENERATED_JAVA_UNKNOWN: Value | |
148 enum EnumName { | |
149 VALUE_ONE, | |
150 }; | |
151 """.split('\n') | |
152 with self.assertRaises(Exception): | |
153 HeaderParser(test_data).ParseDefinitions() | |
154 | |
155 def testParseReturnsEmptyListWithoutDirectives(self): | |
156 test_data = """ | |
157 enum EnumName { | |
158 VALUE_ONE, | |
159 }; | |
160 """.split('\n') | |
161 self.assertEqual([], HeaderParser(test_data).ParseDefinitions()) | |
162 | |
163 def testParseEnumClass(self): | |
164 test_data = """ | |
165 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace | |
166 enum class Foo { | |
167 FOO_A, | |
168 }; | |
169 """.split('\n') | |
170 definitions = HeaderParser(test_data).ParseDefinitions() | |
171 self.assertEqual(1, len(definitions)) | |
172 definition = definitions[0] | |
173 self.assertEqual('Foo', definition.class_name) | |
174 self.assertEqual('test.namespace', definition.enum_package) | |
175 self.assertEqual(collections.OrderedDict([('A', 0)]), | |
176 definition.entries) | |
177 | |
178 def testParseEnumStruct(self): | |
179 test_data = """ | |
180 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace | |
181 enum struct Foo { | |
182 FOO_A, | |
183 }; | |
184 """.split('\n') | |
185 definitions = HeaderParser(test_data).ParseDefinitions() | |
186 self.assertEqual(1, len(definitions)) | |
187 definition = definitions[0] | |
188 self.assertEqual('Foo', definition.class_name) | |
189 self.assertEqual('test.namespace', definition.enum_package) | |
190 self.assertEqual(collections.OrderedDict([('A', 0)]), | |
191 definition.entries) | |
192 | |
193 def testParseFixedTypeEnum(self): | |
194 test_data = """ | |
195 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace | |
196 enum Foo : int { | |
197 FOO_A, | |
198 }; | |
199 """.split('\n') | |
200 definitions = HeaderParser(test_data).ParseDefinitions() | |
201 self.assertEqual(1, len(definitions)) | |
202 definition = definitions[0] | |
203 self.assertEqual('Foo', definition.class_name) | |
204 self.assertEqual('test.namespace', definition.enum_package) | |
205 self.assertEqual('int', definition.fixed_type) | |
206 self.assertEqual(collections.OrderedDict([('A', 0)]), | |
207 definition.entries) | |
208 | |
209 def testParseFixedTypeEnumClass(self): | |
210 test_data = """ | |
211 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace | |
212 enum class Foo: unsigned short { | |
213 FOO_A, | |
214 }; | |
215 """.split('\n') | |
216 definitions = HeaderParser(test_data).ParseDefinitions() | |
217 self.assertEqual(1, len(definitions)) | |
218 definition = definitions[0] | |
219 self.assertEqual('Foo', definition.class_name) | |
220 self.assertEqual('test.namespace', definition.enum_package) | |
221 self.assertEqual('unsigned short', definition.fixed_type) | |
222 self.assertEqual(collections.OrderedDict([('A', 0)]), | |
223 definition.entries) | |
224 | |
225 def testParseUnknownFixedTypeRaises(self): | |
226 test_data = """ | |
227 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace | |
228 enum class Foo: foo_type { | |
229 FOO_A, | |
230 }; | |
231 """.split('\n') | |
232 with self.assertRaises(Exception): | |
233 HeaderParser(test_data).ParseDefinitions() | |
234 | |
235 def testParseSimpleMultiLineDirective(self): | |
236 test_data = """ | |
237 // GENERATED_JAVA_ENUM_PACKAGE: ( | |
238 // test.namespace) | |
239 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: Bar | |
240 enum Foo { | |
241 FOO_A, | |
242 }; | |
243 """.split('\n') | |
244 definitions = HeaderParser(test_data).ParseDefinitions() | |
245 self.assertEqual('test.namespace', definitions[0].enum_package) | |
246 self.assertEqual('Bar', definitions[0].class_name) | |
247 | |
248 def testParseMultiLineDirective(self): | |
249 test_data = """ | |
250 // GENERATED_JAVA_ENUM_PACKAGE: (te | |
251 // st.name | |
252 // space) | |
253 enum Foo { | |
254 FOO_A, | |
255 }; | |
256 """.split('\n') | |
257 definitions = HeaderParser(test_data).ParseDefinitions() | |
258 self.assertEqual('test.namespace', definitions[0].enum_package) | |
259 | |
260 def testParseMultiLineDirectiveWithOtherDirective(self): | |
261 test_data = """ | |
262 // GENERATED_JAVA_ENUM_PACKAGE: ( | |
263 // test.namespace) | |
264 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: ( | |
265 // Ba | |
266 // r | |
267 // ) | |
268 enum Foo { | |
269 FOO_A, | |
270 }; | |
271 """.split('\n') | |
272 definitions = HeaderParser(test_data).ParseDefinitions() | |
273 self.assertEqual('test.namespace', definitions[0].enum_package) | |
274 self.assertEqual('Bar', definitions[0].class_name) | |
275 | |
276 def testParseMalformedMultiLineDirectiveWithOtherDirective(self): | |
277 test_data = """ | |
278 // GENERATED_JAVA_ENUM_PACKAGE: ( | |
279 // test.name | |
280 // space | |
281 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: Bar | |
282 enum Foo { | |
283 FOO_A, | |
284 }; | |
285 """.split('\n') | |
286 with self.assertRaises(Exception): | |
287 HeaderParser(test_data).ParseDefinitions() | |
288 | |
289 def testParseMalformedMultiLineDirective(self): | |
290 test_data = """ | |
291 // GENERATED_JAVA_ENUM_PACKAGE: ( | |
292 // test.name | |
293 // space | |
294 enum Foo { | |
295 FOO_A, | |
296 }; | |
297 """.split('\n') | |
298 with self.assertRaises(Exception): | |
299 HeaderParser(test_data).ParseDefinitions() | |
300 | |
301 def testParseMalformedMultiLineDirectiveShort(self): | |
302 test_data = """ | |
303 // GENERATED_JAVA_ENUM_PACKAGE: ( | |
304 enum Foo { | |
305 FOO_A, | |
306 }; | |
307 """.split('\n') | |
308 with self.assertRaises(Exception): | |
309 HeaderParser(test_data).ParseDefinitions() | |
310 | |
311 def testEnumValueAssignmentNoneDefined(self): | |
312 definition = EnumDefinition(original_enum_name='c', enum_package='p') | |
313 definition.AppendEntry('A', None) | |
314 definition.AppendEntry('B', None) | |
315 definition.AppendEntry('C', None) | |
316 definition.Finalize() | |
317 self.assertEqual(collections.OrderedDict([('A', 0), | |
318 ('B', 1), | |
319 ('C', 2)]), | |
320 definition.entries) | |
321 | |
322 def testEnumValueAssignmentAllDefined(self): | |
323 definition = EnumDefinition(original_enum_name='c', enum_package='p') | |
324 definition.AppendEntry('A', '1') | |
325 definition.AppendEntry('B', '2') | |
326 definition.AppendEntry('C', '3') | |
327 definition.Finalize() | |
328 self.assertEqual(collections.OrderedDict([('A', '1'), | |
329 ('B', '2'), | |
330 ('C', '3')]), | |
331 definition.entries) | |
332 | |
333 def testEnumValueAssignmentReferences(self): | |
334 definition = EnumDefinition(original_enum_name='c', enum_package='p') | |
335 definition.AppendEntry('A', None) | |
336 definition.AppendEntry('B', 'A') | |
337 definition.AppendEntry('C', None) | |
338 definition.AppendEntry('D', 'C') | |
339 definition.Finalize() | |
340 self.assertEqual(collections.OrderedDict([('A', 0), | |
341 ('B', 0), | |
342 ('C', 1), | |
343 ('D', 1)]), | |
344 definition.entries) | |
345 | |
346 def testEnumValueAssignmentSet(self): | |
347 definition = EnumDefinition(original_enum_name='c', enum_package='p') | |
348 definition.AppendEntry('A', None) | |
349 definition.AppendEntry('B', '2') | |
350 definition.AppendEntry('C', None) | |
351 definition.Finalize() | |
352 self.assertEqual(collections.OrderedDict([('A', 0), | |
353 ('B', 2), | |
354 ('C', 3)]), | |
355 definition.entries) | |
356 | |
357 def testEnumValueAssignmentSetReferences(self): | |
358 definition = EnumDefinition(original_enum_name='c', enum_package='p') | |
359 definition.AppendEntry('A', None) | |
360 definition.AppendEntry('B', 'A') | |
361 definition.AppendEntry('C', 'B') | |
362 definition.AppendEntry('D', None) | |
363 definition.Finalize() | |
364 self.assertEqual(collections.OrderedDict([('A', 0), | |
365 ('B', 0), | |
366 ('C', 0), | |
367 ('D', 1)]), | |
368 definition.entries) | |
369 | |
370 def testEnumValueAssignmentRaises(self): | |
371 definition = EnumDefinition(original_enum_name='c', enum_package='p') | |
372 definition.AppendEntry('A', None) | |
373 definition.AppendEntry('B', 'foo') | |
374 definition.AppendEntry('C', None) | |
375 with self.assertRaises(Exception): | |
376 definition.Finalize() | |
377 | |
378 def testExplicitPrefixStripping(self): | |
379 definition = EnumDefinition(original_enum_name='c', enum_package='p') | |
380 definition.AppendEntry('P_A', None) | |
381 definition.AppendEntry('B', None) | |
382 definition.AppendEntry('P_C', None) | |
383 definition.AppendEntry('P_LAST', 'P_C') | |
384 definition.prefix_to_strip = 'P_' | |
385 definition.Finalize() | |
386 self.assertEqual(collections.OrderedDict([('A', 0), | |
387 ('B', 1), | |
388 ('C', 2), | |
389 ('LAST', 2)]), | |
390 definition.entries) | |
391 | |
392 def testImplicitPrefixStripping(self): | |
393 definition = EnumDefinition(original_enum_name='ClassName', | |
394 enum_package='p') | |
395 definition.AppendEntry('CLASS_NAME_A', None) | |
396 definition.AppendEntry('CLASS_NAME_B', None) | |
397 definition.AppendEntry('CLASS_NAME_C', None) | |
398 definition.AppendEntry('CLASS_NAME_LAST', 'CLASS_NAME_C') | |
399 definition.Finalize() | |
400 self.assertEqual(collections.OrderedDict([('A', 0), | |
401 ('B', 1), | |
402 ('C', 2), | |
403 ('LAST', 2)]), | |
404 definition.entries) | |
405 | |
406 def testImplicitPrefixStrippingRequiresAllConstantsToBePrefixed(self): | |
407 definition = EnumDefinition(original_enum_name='Name', | |
408 enum_package='p') | |
409 definition.AppendEntry('A', None) | |
410 definition.AppendEntry('B', None) | |
411 definition.AppendEntry('NAME_LAST', None) | |
412 definition.Finalize() | |
413 self.assertEqual(['A', 'B', 'NAME_LAST'], definition.entries.keys()) | |
414 | |
415 def testGenerateThrowsOnEmptyInput(self): | |
416 with self.assertRaises(Exception): | |
417 original_do_parse = java_cpp_enum.DoParseHeaderFile | |
418 try: | |
419 java_cpp_enum.DoParseHeaderFile = lambda _: [] | |
420 java_cpp_enum.DoGenerate('dir', ['file']) | |
421 finally: | |
422 java_cpp_enum.DoParseHeaderFile = original_do_parse | |
423 | |
424 def main(argv): | |
425 parser = optparse.OptionParser() | |
426 parser.add_option("--stamp", help="File to touch on success.") | |
427 options, _ = parser.parse_args(argv) | |
428 | |
429 suite = unittest.TestLoader().loadTestsFromTestCase(TestPreprocess) | |
430 unittest.TextTestRunner(verbosity=0).run(suite) | |
431 | |
432 if options.stamp: | |
433 build_utils.Touch(options.stamp) | |
434 | |
435 if __name__ == '__main__': | |
436 main(sys.argv[1:]) | |
OLD | NEW |