| 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 |