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.
6 """Tests for enum_preprocess.py.
8 This test suite containss various tests for the C++ -> Java enum generator.
17 from java_cpp_enum
import EnumDefinition
, GenerateOutput
, GetScriptName
18 from java_cpp_enum
import HeaderParser
20 sys
.path
.append(os
.path
.join(os
.path
.dirname(__file__
), "gyp"))
21 from util
import build_utils
23 class TestPreprocess(unittest
.TestCase
):
25 definition
= EnumDefinition(original_enum_name
='ClassName',
26 enum_package
='some.package',
27 entries
=[('E1', 1), ('E2', '2 << 2')])
28 output
= GenerateOutput('path/to/file', definition
)
30 // Copyright 2014 The Chromium Authors. All rights reserved.
31 // Use of this source code is governed by a BSD-style license that can be
32 // found in the LICENSE file.
34 // This file is autogenerated by
41 public class ClassName {
42 public static final int E1 = 1;
43 public static final int E2 = 2 << 2;
46 self
.assertEqual(expected
% GetScriptName(), output
)
48 def testParseSimpleEnum(self
):
50 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace
56 definitions
= HeaderParser(test_data
).ParseDefinitions()
57 self
.assertEqual(1, len(definitions
))
58 definition
= definitions
[0]
59 self
.assertEqual('EnumName', definition
.class_name
)
60 self
.assertEqual('test.namespace', definition
.enum_package
)
61 self
.assertEqual(collections
.OrderedDict([('VALUE_ZERO', 0),
65 def testParseBitShifts(self
):
67 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace
73 definitions
= HeaderParser(test_data
).ParseDefinitions()
74 self
.assertEqual(1, len(definitions
))
75 definition
= definitions
[0]
76 self
.assertEqual('EnumName', definition
.class_name
)
77 self
.assertEqual('test.namespace', definition
.enum_package
)
78 self
.assertEqual(collections
.OrderedDict([('VALUE_ZERO', '1 << 0'),
79 ('VALUE_ONE', '1 << 1')]),
82 def testParseClassNameOverride(self
):
84 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace
85 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: OverrideName
90 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace
91 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: OtherOverride
97 definitions
= HeaderParser(test_data
).ParseDefinitions()
98 self
.assertEqual(2, len(definitions
))
99 definition
= definitions
[0]
100 self
.assertEqual('OverrideName', definition
.class_name
)
102 definition
= definitions
[1]
103 self
.assertEqual('OtherOverride', definition
.class_name
)
104 self
.assertEqual(collections
.OrderedDict([('A', 0),
108 def testParseTwoEnums(self
):
110 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace
121 // GENERATED_JAVA_ENUM_PACKAGE: other.package
122 // GENERATED_JAVA_PREFIX_TO_STRIP: P_
128 definitions
= HeaderParser(test_data
).ParseDefinitions()
129 self
.assertEqual(2, len(definitions
))
130 definition
= definitions
[0]
131 self
.assertEqual('EnumOne', definition
.class_name
)
132 self
.assertEqual('test.namespace', definition
.enum_package
)
133 self
.assertEqual(collections
.OrderedDict([('A', '1'),
137 definition
= definitions
[1]
138 self
.assertEqual('EnumTwo', definition
.class_name
)
139 self
.assertEqual('other.package', definition
.enum_package
)
140 self
.assertEqual(collections
.OrderedDict([('A', 0),
144 def testParseThrowsOnUnknownDirective(self
):
146 // GENERATED_JAVA_UNKNOWN: Value
151 with self
.assertRaises(Exception):
152 HeaderParser(test_data
).ParseDefinitions()
154 def testParseEnumClass(self
):
156 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace
161 definitions
= HeaderParser(test_data
).ParseDefinitions()
162 self
.assertEqual(1, len(definitions
))
163 definition
= definitions
[0]
164 self
.assertEqual('Foo', definition
.class_name
)
165 self
.assertEqual('test.namespace', definition
.enum_package
)
166 self
.assertEqual(collections
.OrderedDict([('A', 0)]),
169 def testParseEnumStruct(self
):
171 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace
176 definitions
= HeaderParser(test_data
).ParseDefinitions()
177 self
.assertEqual(1, len(definitions
))
178 definition
= definitions
[0]
179 self
.assertEqual('Foo', definition
.class_name
)
180 self
.assertEqual('test.namespace', definition
.enum_package
)
181 self
.assertEqual(collections
.OrderedDict([('A', 0)]),
184 def testParseFixedTypeEnum(self
):
186 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace
191 definitions
= HeaderParser(test_data
).ParseDefinitions()
192 self
.assertEqual(1, len(definitions
))
193 definition
= definitions
[0]
194 self
.assertEqual('Foo', definition
.class_name
)
195 self
.assertEqual('test.namespace', definition
.enum_package
)
196 self
.assertEqual('int', definition
.fixed_type
)
197 self
.assertEqual(collections
.OrderedDict([('A', 0)]),
200 def testParseFixedTypeEnumClass(self
):
202 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace
203 enum class Foo: unsigned short {
207 definitions
= HeaderParser(test_data
).ParseDefinitions()
208 self
.assertEqual(1, len(definitions
))
209 definition
= definitions
[0]
210 self
.assertEqual('Foo', definition
.class_name
)
211 self
.assertEqual('test.namespace', definition
.enum_package
)
212 self
.assertEqual('unsigned short', definition
.fixed_type
)
213 self
.assertEqual(collections
.OrderedDict([('A', 0)]),
216 def testParseUnknownFixedTypeRaises(self
):
218 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace
219 enum class Foo: foo_type {
223 with self
.assertRaises(Exception):
224 HeaderParser(test_data
).ParseDefinitions()
226 def testParseSimpleMultiLineDirective(self
):
228 // GENERATED_JAVA_ENUM_PACKAGE: (
230 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: Bar
235 definitions
= HeaderParser(test_data
).ParseDefinitions()
236 self
.assertEqual('test.namespace', definitions
[0].enum_package
)
237 self
.assertEqual('Bar', definitions
[0].class_name
)
239 def testParseMultiLineDirective(self
):
241 // GENERATED_JAVA_ENUM_PACKAGE: (te
248 definitions
= HeaderParser(test_data
).ParseDefinitions()
249 self
.assertEqual('test.namespace', definitions
[0].enum_package
)
251 def testParseMultiLineDirectiveWithOtherDirective(self
):
253 // GENERATED_JAVA_ENUM_PACKAGE: (
255 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: (
263 definitions
= HeaderParser(test_data
).ParseDefinitions()
264 self
.assertEqual('test.namespace', definitions
[0].enum_package
)
265 self
.assertEqual('Bar', definitions
[0].class_name
)
267 def testParseMalformedMultiLineDirectiveWithOtherDirective(self
):
269 // GENERATED_JAVA_ENUM_PACKAGE: (
272 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: Bar
277 with self
.assertRaises(Exception):
278 HeaderParser(test_data
).ParseDefinitions()
280 def testParseMalformedMultiLineDirective(self
):
282 // GENERATED_JAVA_ENUM_PACKAGE: (
289 with self
.assertRaises(Exception):
290 HeaderParser(test_data
).ParseDefinitions()
292 def testParseMalformedMultiLineDirectiveShort(self
):
294 // GENERATED_JAVA_ENUM_PACKAGE: (
299 with self
.assertRaises(Exception):
300 HeaderParser(test_data
).ParseDefinitions()
302 def testEnumValueAssignmentNoneDefined(self
):
303 definition
= EnumDefinition(original_enum_name
='c', enum_package
='p')
304 definition
.AppendEntry('A', None)
305 definition
.AppendEntry('B', None)
306 definition
.AppendEntry('C', None)
307 definition
.Finalize()
308 self
.assertEqual(collections
.OrderedDict([('A', 0),
313 def testEnumValueAssignmentAllDefined(self
):
314 definition
= EnumDefinition(original_enum_name
='c', enum_package
='p')
315 definition
.AppendEntry('A', '1')
316 definition
.AppendEntry('B', '2')
317 definition
.AppendEntry('C', '3')
318 definition
.Finalize()
319 self
.assertEqual(collections
.OrderedDict([('A', '1'),
324 def testEnumValueAssignmentReferences(self
):
325 definition
= EnumDefinition(original_enum_name
='c', enum_package
='p')
326 definition
.AppendEntry('A', None)
327 definition
.AppendEntry('B', 'A')
328 definition
.AppendEntry('C', None)
329 definition
.AppendEntry('D', 'C')
330 definition
.Finalize()
331 self
.assertEqual(collections
.OrderedDict([('A', 0),
337 def testEnumValueAssignmentSet(self
):
338 definition
= EnumDefinition(original_enum_name
='c', enum_package
='p')
339 definition
.AppendEntry('A', None)
340 definition
.AppendEntry('B', '2')
341 definition
.AppendEntry('C', None)
342 definition
.Finalize()
343 self
.assertEqual(collections
.OrderedDict([('A', 0),
348 def testEnumValueAssignmentSetReferences(self
):
349 definition
= EnumDefinition(original_enum_name
='c', enum_package
='p')
350 definition
.AppendEntry('A', None)
351 definition
.AppendEntry('B', 'A')
352 definition
.AppendEntry('C', 'B')
353 definition
.AppendEntry('D', None)
354 definition
.Finalize()
355 self
.assertEqual(collections
.OrderedDict([('A', 0),
361 def testEnumValueAssignmentRaises(self
):
362 definition
= EnumDefinition(original_enum_name
='c', enum_package
='p')
363 definition
.AppendEntry('A', None)
364 definition
.AppendEntry('B', 'foo')
365 definition
.AppendEntry('C', None)
366 with self
.assertRaises(Exception):
367 definition
.Finalize()
369 def testExplicitPrefixStripping(self
):
370 definition
= EnumDefinition(original_enum_name
='c', enum_package
='p')
371 definition
.AppendEntry('P_A', None)
372 definition
.AppendEntry('B', None)
373 definition
.AppendEntry('P_C', None)
374 definition
.AppendEntry('P_LAST', 'P_C')
375 definition
.prefix_to_strip
= 'P_'
376 definition
.Finalize()
377 self
.assertEqual(collections
.OrderedDict([('A', 0),
383 def testImplicitPrefixStripping(self
):
384 definition
= EnumDefinition(original_enum_name
='ClassName',
386 definition
.AppendEntry('CLASS_NAME_A', None)
387 definition
.AppendEntry('CLASS_NAME_B', None)
388 definition
.AppendEntry('CLASS_NAME_C', None)
389 definition
.AppendEntry('CLASS_NAME_LAST', 'CLASS_NAME_C')
390 definition
.Finalize()
391 self
.assertEqual(collections
.OrderedDict([('A', 0),
397 def testImplicitPrefixStrippingRequiresAllConstantsToBePrefixed(self
):
398 definition
= EnumDefinition(original_enum_name
='Name',
400 definition
.AppendEntry('A', None)
401 definition
.AppendEntry('B', None)
402 definition
.AppendEntry('NAME_LAST', None)
403 definition
.Finalize()
404 self
.assertEqual(['A', 'B', 'NAME_LAST'], definition
.entries
.keys())
407 parser
= optparse
.OptionParser()
408 parser
.add_option("--stamp", help="File to touch on success.")
409 options
, _
= parser
.parse_args(argv
)
411 suite
= unittest
.TestLoader().loadTestsFromTestCase(TestPreprocess
)
412 unittest
.TextTestRunner(verbosity
=0).run(suite
)
415 build_utils
.Touch(options
.stamp
)
417 if __name__
== '__main__':