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 |