OLD | NEW |
1 #! /usr/bin/env python | 1 #! /usr/bin/env python |
2 # | 2 # |
3 # Protocol Buffers - Google's data interchange format | 3 # Protocol Buffers - Google's data interchange format |
4 # Copyright 2008 Google Inc. All rights reserved. | 4 # Copyright 2008 Google Inc. All rights reserved. |
5 # https://developers.google.com/protocol-buffers/ | 5 # https://developers.google.com/protocol-buffers/ |
6 # | 6 # |
7 # Redistribution and use in source and binary forms, with or without | 7 # Redistribution and use in source and binary forms, with or without |
8 # modification, are permitted provided that the following conditions are | 8 # modification, are permitted provided that the following conditions are |
9 # met: | 9 # met: |
10 # | 10 # |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 def testInvalidDuration(self): | 296 def testInvalidDuration(self): |
297 message = duration_pb2.Duration() | 297 message = duration_pb2.Duration() |
298 self.assertRaisesRegexp( | 298 self.assertRaisesRegexp( |
299 well_known_types.ParseError, | 299 well_known_types.ParseError, |
300 'Duration must end with letter "s": 1.', | 300 'Duration must end with letter "s": 1.', |
301 message.FromJsonString, '1') | 301 message.FromJsonString, '1') |
302 self.assertRaisesRegexp( | 302 self.assertRaisesRegexp( |
303 well_known_types.ParseError, | 303 well_known_types.ParseError, |
304 'Couldn\'t parse duration: 1...2s.', | 304 'Couldn\'t parse duration: 1...2s.', |
305 message.FromJsonString, '1...2s') | 305 message.FromJsonString, '1...2s') |
| 306 text = '-315576000001.000000000s' |
| 307 self.assertRaisesRegexp( |
| 308 well_known_types.Error, |
| 309 r'Duration is not valid\: Seconds -315576000001 must be in range' |
| 310 r' \[-315576000000\, 315576000000\].', |
| 311 message.FromJsonString, text) |
| 312 text = '315576000001.000000000s' |
| 313 self.assertRaisesRegexp( |
| 314 well_known_types.Error, |
| 315 r'Duration is not valid\: Seconds 315576000001 must be in range' |
| 316 r' \[-315576000000\, 315576000000\].', |
| 317 message.FromJsonString, text) |
| 318 message.seconds = -315576000001 |
| 319 message.nanos = 0 |
| 320 self.assertRaisesRegexp( |
| 321 well_known_types.Error, |
| 322 r'Duration is not valid\: Seconds -315576000001 must be in range' |
| 323 r' \[-315576000000\, 315576000000\].', |
| 324 message.ToJsonString) |
306 | 325 |
307 | 326 |
308 class FieldMaskTest(unittest.TestCase): | 327 class FieldMaskTest(unittest.TestCase): |
309 | 328 |
310 def testStringFormat(self): | 329 def testStringFormat(self): |
311 mask = field_mask_pb2.FieldMask() | 330 mask = field_mask_pb2.FieldMask() |
312 self.assertEqual('', mask.ToJsonString()) | 331 self.assertEqual('', mask.ToJsonString()) |
313 mask.paths.append('foo') | 332 mask.paths.append('foo') |
314 self.assertEqual('foo', mask.ToJsonString()) | 333 self.assertEqual('foo', mask.ToJsonString()) |
315 mask.paths.append('bar') | 334 mask.paths.append('bar') |
316 self.assertEqual('foo,bar', mask.ToJsonString()) | 335 self.assertEqual('foo,bar', mask.ToJsonString()) |
317 | 336 |
318 mask.FromJsonString('') | 337 mask.FromJsonString('') |
319 self.assertEqual('', mask.ToJsonString()) | 338 self.assertEqual('', mask.ToJsonString()) |
320 mask.FromJsonString('foo') | 339 mask.FromJsonString('foo') |
321 self.assertEqual(['foo'], mask.paths) | 340 self.assertEqual(['foo'], mask.paths) |
322 mask.FromJsonString('foo,bar') | 341 mask.FromJsonString('foo,bar') |
323 self.assertEqual(['foo', 'bar'], mask.paths) | 342 self.assertEqual(['foo', 'bar'], mask.paths) |
324 | 343 |
| 344 # Test camel case |
| 345 mask.Clear() |
| 346 mask.paths.append('foo_bar') |
| 347 self.assertEqual('fooBar', mask.ToJsonString()) |
| 348 mask.paths.append('bar_quz') |
| 349 self.assertEqual('fooBar,barQuz', mask.ToJsonString()) |
| 350 |
| 351 mask.FromJsonString('') |
| 352 self.assertEqual('', mask.ToJsonString()) |
| 353 mask.FromJsonString('fooBar') |
| 354 self.assertEqual(['foo_bar'], mask.paths) |
| 355 mask.FromJsonString('fooBar,barQuz') |
| 356 self.assertEqual(['foo_bar', 'bar_quz'], mask.paths) |
| 357 |
325 def testDescriptorToFieldMask(self): | 358 def testDescriptorToFieldMask(self): |
326 mask = field_mask_pb2.FieldMask() | 359 mask = field_mask_pb2.FieldMask() |
327 msg_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR | 360 msg_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR |
328 mask.AllFieldsFromDescriptor(msg_descriptor) | 361 mask.AllFieldsFromDescriptor(msg_descriptor) |
329 self.assertEqual(75, len(mask.paths)) | 362 self.assertEqual(75, len(mask.paths)) |
330 self.assertTrue(mask.IsValidForDescriptor(msg_descriptor)) | 363 self.assertTrue(mask.IsValidForDescriptor(msg_descriptor)) |
331 for field in msg_descriptor.fields: | 364 for field in msg_descriptor.fields: |
332 self.assertTrue(field.name in mask.paths) | 365 self.assertTrue(field.name in mask.paths) |
333 mask.paths.append('optional_nested_message.bb') | 366 mask.paths.append('optional_nested_message.bb') |
334 self.assertTrue(mask.IsValidForDescriptor(msg_descriptor)) | 367 self.assertTrue(mask.IsValidForDescriptor(msg_descriptor)) |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 # But they are cleared when replacing message fields. | 528 # But they are cleared when replacing message fields. |
496 nested_dst.Clear() | 529 nested_dst.Clear() |
497 nested_dst.payload.optional_int32 = 1234 | 530 nested_dst.payload.optional_int32 = 1234 |
498 mask.FromJsonString('payload') | 531 mask.FromJsonString('payload') |
499 mask.MergeMessage(nested_src, nested_dst, True, False) | 532 mask.MergeMessage(nested_src, nested_dst, True, False) |
500 self.assertFalse(nested_dst.HasField('payload')) | 533 self.assertFalse(nested_dst.HasField('payload')) |
501 | 534 |
502 nested_src.payload.repeated_int32.append(1234) | 535 nested_src.payload.repeated_int32.append(1234) |
503 nested_dst.payload.repeated_int32.append(5678) | 536 nested_dst.payload.repeated_int32.append(5678) |
504 # Repeated fields will be appended by default. | 537 # Repeated fields will be appended by default. |
505 mask.FromJsonString('payload.repeated_int32') | 538 mask.FromJsonString('payload.repeatedInt32') |
506 mask.MergeMessage(nested_src, nested_dst) | 539 mask.MergeMessage(nested_src, nested_dst) |
507 self.assertEqual(2, len(nested_dst.payload.repeated_int32)) | 540 self.assertEqual(2, len(nested_dst.payload.repeated_int32)) |
508 self.assertEqual(5678, nested_dst.payload.repeated_int32[0]) | 541 self.assertEqual(5678, nested_dst.payload.repeated_int32[0]) |
509 self.assertEqual(1234, nested_dst.payload.repeated_int32[1]) | 542 self.assertEqual(1234, nested_dst.payload.repeated_int32[1]) |
510 # Change the behavior to replace repeated fields. | 543 # Change the behavior to replace repeated fields. |
511 mask.FromJsonString('payload.repeated_int32') | 544 mask.FromJsonString('payload.repeatedInt32') |
512 mask.MergeMessage(nested_src, nested_dst, False, True) | 545 mask.MergeMessage(nested_src, nested_dst, False, True) |
513 self.assertEqual(1, len(nested_dst.payload.repeated_int32)) | 546 self.assertEqual(1, len(nested_dst.payload.repeated_int32)) |
514 self.assertEqual(1234, nested_dst.payload.repeated_int32[0]) | 547 self.assertEqual(1234, nested_dst.payload.repeated_int32[0]) |
515 | 548 |
| 549 def testSnakeCaseToCamelCase(self): |
| 550 self.assertEqual('fooBar', |
| 551 well_known_types._SnakeCaseToCamelCase('foo_bar')) |
| 552 self.assertEqual('FooBar', |
| 553 well_known_types._SnakeCaseToCamelCase('_foo_bar')) |
| 554 self.assertEqual('foo3Bar', |
| 555 well_known_types._SnakeCaseToCamelCase('foo3_bar')) |
| 556 |
| 557 # No uppercase letter is allowed. |
| 558 self.assertRaisesRegexp( |
| 559 well_known_types.Error, |
| 560 'Fail to print FieldMask to Json string: Path name Foo must ' |
| 561 'not contain uppercase letters.', |
| 562 well_known_types._SnakeCaseToCamelCase, |
| 563 'Foo') |
| 564 # Any character after a "_" must be a lowercase letter. |
| 565 # 1. "_" cannot be followed by another "_". |
| 566 # 2. "_" cannot be followed by a digit. |
| 567 # 3. "_" cannot appear as the last character. |
| 568 self.assertRaisesRegexp( |
| 569 well_known_types.Error, |
| 570 'Fail to print FieldMask to Json string: The character after a ' |
| 571 '"_" must be a lowercase letter in path name foo__bar.', |
| 572 well_known_types._SnakeCaseToCamelCase, |
| 573 'foo__bar') |
| 574 self.assertRaisesRegexp( |
| 575 well_known_types.Error, |
| 576 'Fail to print FieldMask to Json string: The character after a ' |
| 577 '"_" must be a lowercase letter in path name foo_3bar.', |
| 578 well_known_types._SnakeCaseToCamelCase, |
| 579 'foo_3bar') |
| 580 self.assertRaisesRegexp( |
| 581 well_known_types.Error, |
| 582 'Fail to print FieldMask to Json string: Trailing "_" in path ' |
| 583 'name foo_bar_.', |
| 584 well_known_types._SnakeCaseToCamelCase, |
| 585 'foo_bar_') |
| 586 |
| 587 def testCamelCaseToSnakeCase(self): |
| 588 self.assertEqual('foo_bar', |
| 589 well_known_types._CamelCaseToSnakeCase('fooBar')) |
| 590 self.assertEqual('_foo_bar', |
| 591 well_known_types._CamelCaseToSnakeCase('FooBar')) |
| 592 self.assertEqual('foo3_bar', |
| 593 well_known_types._CamelCaseToSnakeCase('foo3Bar')) |
| 594 self.assertRaisesRegexp( |
| 595 well_known_types.ParseError, |
| 596 'Fail to parse FieldMask: Path name foo_bar must not contain "_"s.', |
| 597 well_known_types._CamelCaseToSnakeCase, |
| 598 'foo_bar') |
| 599 |
516 | 600 |
517 class StructTest(unittest.TestCase): | 601 class StructTest(unittest.TestCase): |
518 | 602 |
519 def testStruct(self): | 603 def testStruct(self): |
520 struct = struct_pb2.Struct() | 604 struct = struct_pb2.Struct() |
521 struct_class = struct.__class__ | 605 struct_class = struct.__class__ |
522 | 606 |
523 struct['key1'] = 5 | 607 struct['key1'] = 5 |
524 struct['key2'] = 'abc' | 608 struct['key2'] = 'abc' |
525 struct['key3'] = True | 609 struct['key3'] = True |
526 struct.get_or_create_struct('key4')['subkey'] = 11.0 | 610 struct.get_or_create_struct('key4')['subkey'] = 11.0 |
527 struct_list = struct.get_or_create_list('key5') | 611 struct_list = struct.get_or_create_list('key5') |
528 struct_list.extend([6, 'seven', True, False, None]) | 612 struct_list.extend([6, 'seven', True, False, None]) |
529 struct_list.add_struct()['subkey2'] = 9 | 613 struct_list.add_struct()['subkey2'] = 9 |
530 | 614 |
531 self.assertTrue(isinstance(struct, well_known_types.Struct)) | 615 self.assertTrue(isinstance(struct, well_known_types.Struct)) |
532 self.assertEquals(5, struct['key1']) | 616 self.assertEqual(5, struct['key1']) |
533 self.assertEquals('abc', struct['key2']) | 617 self.assertEqual('abc', struct['key2']) |
534 self.assertIs(True, struct['key3']) | 618 self.assertIs(True, struct['key3']) |
535 self.assertEquals(11, struct['key4']['subkey']) | 619 self.assertEqual(11, struct['key4']['subkey']) |
536 inner_struct = struct_class() | 620 inner_struct = struct_class() |
537 inner_struct['subkey2'] = 9 | 621 inner_struct['subkey2'] = 9 |
538 self.assertEquals([6, 'seven', True, False, None, inner_struct], | 622 self.assertEqual([6, 'seven', True, False, None, inner_struct], |
539 list(struct['key5'].items())) | 623 list(struct['key5'].items())) |
540 | 624 |
541 serialized = struct.SerializeToString() | 625 serialized = struct.SerializeToString() |
542 | 626 |
543 struct2 = struct_pb2.Struct() | 627 struct2 = struct_pb2.Struct() |
544 struct2.ParseFromString(serialized) | 628 struct2.ParseFromString(serialized) |
545 | 629 |
546 self.assertEquals(struct, struct2) | 630 self.assertEqual(struct, struct2) |
547 | 631 |
548 self.assertTrue(isinstance(struct2, well_known_types.Struct)) | 632 self.assertTrue(isinstance(struct2, well_known_types.Struct)) |
549 self.assertEquals(5, struct2['key1']) | 633 self.assertEqual(5, struct2['key1']) |
550 self.assertEquals('abc', struct2['key2']) | 634 self.assertEqual('abc', struct2['key2']) |
551 self.assertIs(True, struct2['key3']) | 635 self.assertIs(True, struct2['key3']) |
552 self.assertEquals(11, struct2['key4']['subkey']) | 636 self.assertEqual(11, struct2['key4']['subkey']) |
553 self.assertEquals([6, 'seven', True, False, None, inner_struct], | 637 self.assertEqual([6, 'seven', True, False, None, inner_struct], |
554 list(struct2['key5'].items())) | 638 list(struct2['key5'].items())) |
555 | 639 |
556 struct_list = struct2['key5'] | 640 struct_list = struct2['key5'] |
557 self.assertEquals(6, struct_list[0]) | 641 self.assertEqual(6, struct_list[0]) |
558 self.assertEquals('seven', struct_list[1]) | 642 self.assertEqual('seven', struct_list[1]) |
559 self.assertEquals(True, struct_list[2]) | 643 self.assertEqual(True, struct_list[2]) |
560 self.assertEquals(False, struct_list[3]) | 644 self.assertEqual(False, struct_list[3]) |
561 self.assertEquals(None, struct_list[4]) | 645 self.assertEqual(None, struct_list[4]) |
562 self.assertEquals(inner_struct, struct_list[5]) | 646 self.assertEqual(inner_struct, struct_list[5]) |
563 | 647 |
564 struct_list[1] = 7 | 648 struct_list[1] = 7 |
565 self.assertEquals(7, struct_list[1]) | 649 self.assertEqual(7, struct_list[1]) |
566 | 650 |
567 struct_list.add_list().extend([1, 'two', True, False, None]) | 651 struct_list.add_list().extend([1, 'two', True, False, None]) |
568 self.assertEquals([1, 'two', True, False, None], | 652 self.assertEqual([1, 'two', True, False, None], |
569 list(struct_list[6].items())) | 653 list(struct_list[6].items())) |
570 | 654 |
571 text_serialized = str(struct) | 655 text_serialized = str(struct) |
572 struct3 = struct_pb2.Struct() | 656 struct3 = struct_pb2.Struct() |
573 text_format.Merge(text_serialized, struct3) | 657 text_format.Merge(text_serialized, struct3) |
574 self.assertEquals(struct, struct3) | 658 self.assertEqual(struct, struct3) |
575 | 659 |
576 struct.get_or_create_struct('key3')['replace'] = 12 | 660 struct.get_or_create_struct('key3')['replace'] = 12 |
577 self.assertEquals(12, struct['key3']['replace']) | 661 self.assertEqual(12, struct['key3']['replace']) |
578 | 662 |
579 | 663 |
580 class AnyTest(unittest.TestCase): | 664 class AnyTest(unittest.TestCase): |
581 | 665 |
582 def testAnyMessage(self): | 666 def testAnyMessage(self): |
583 # Creates and sets message. | 667 # Creates and sets message. |
584 msg = any_test_pb2.TestAny() | 668 msg = any_test_pb2.TestAny() |
585 msg_descriptor = msg.DESCRIPTOR | 669 msg_descriptor = msg.DESCRIPTOR |
586 all_types = unittest_pb2.TestAllTypes() | 670 all_types = unittest_pb2.TestAllTypes() |
587 all_descriptor = all_types.DESCRIPTOR | 671 all_descriptor = all_types.DESCRIPTOR |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 self.assertEqual(msg.type_url, | 719 self.assertEqual(msg.type_url, |
636 '/%s' % submessage.DESCRIPTOR.full_name) | 720 '/%s' % submessage.DESCRIPTOR.full_name) |
637 # Test unpacking the type. | 721 # Test unpacking the type. |
638 unpacked_message = any_test_pb2.TestAny() | 722 unpacked_message = any_test_pb2.TestAny() |
639 self.assertTrue(msg.Unpack(unpacked_message)) | 723 self.assertTrue(msg.Unpack(unpacked_message)) |
640 self.assertEqual(submessage, unpacked_message) | 724 self.assertEqual(submessage, unpacked_message) |
641 | 725 |
642 | 726 |
643 if __name__ == '__main__': | 727 if __name__ == '__main__': |
644 unittest.main() | 728 unittest.main() |
OLD | NEW |