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) | |
325 | 306 |
326 | 307 |
327 class FieldMaskTest(unittest.TestCase): | 308 class FieldMaskTest(unittest.TestCase): |
328 | 309 |
329 def testStringFormat(self): | 310 def testStringFormat(self): |
330 mask = field_mask_pb2.FieldMask() | 311 mask = field_mask_pb2.FieldMask() |
331 self.assertEqual('', mask.ToJsonString()) | 312 self.assertEqual('', mask.ToJsonString()) |
332 mask.paths.append('foo') | 313 mask.paths.append('foo') |
333 self.assertEqual('foo', mask.ToJsonString()) | 314 self.assertEqual('foo', mask.ToJsonString()) |
334 mask.paths.append('bar') | 315 mask.paths.append('bar') |
335 self.assertEqual('foo,bar', mask.ToJsonString()) | 316 self.assertEqual('foo,bar', mask.ToJsonString()) |
336 | 317 |
337 mask.FromJsonString('') | 318 mask.FromJsonString('') |
338 self.assertEqual('', mask.ToJsonString()) | 319 self.assertEqual('', mask.ToJsonString()) |
339 mask.FromJsonString('foo') | 320 mask.FromJsonString('foo') |
340 self.assertEqual(['foo'], mask.paths) | 321 self.assertEqual(['foo'], mask.paths) |
341 mask.FromJsonString('foo,bar') | 322 mask.FromJsonString('foo,bar') |
342 self.assertEqual(['foo', 'bar'], mask.paths) | 323 self.assertEqual(['foo', 'bar'], mask.paths) |
343 | 324 |
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 | |
358 def testDescriptorToFieldMask(self): | 325 def testDescriptorToFieldMask(self): |
359 mask = field_mask_pb2.FieldMask() | 326 mask = field_mask_pb2.FieldMask() |
360 msg_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR | 327 msg_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR |
361 mask.AllFieldsFromDescriptor(msg_descriptor) | 328 mask.AllFieldsFromDescriptor(msg_descriptor) |
362 self.assertEqual(75, len(mask.paths)) | 329 self.assertEqual(75, len(mask.paths)) |
363 self.assertTrue(mask.IsValidForDescriptor(msg_descriptor)) | 330 self.assertTrue(mask.IsValidForDescriptor(msg_descriptor)) |
364 for field in msg_descriptor.fields: | 331 for field in msg_descriptor.fields: |
365 self.assertTrue(field.name in mask.paths) | 332 self.assertTrue(field.name in mask.paths) |
366 mask.paths.append('optional_nested_message.bb') | 333 mask.paths.append('optional_nested_message.bb') |
367 self.assertTrue(mask.IsValidForDescriptor(msg_descriptor)) | 334 self.assertTrue(mask.IsValidForDescriptor(msg_descriptor)) |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 # But they are cleared when replacing message fields. | 495 # But they are cleared when replacing message fields. |
529 nested_dst.Clear() | 496 nested_dst.Clear() |
530 nested_dst.payload.optional_int32 = 1234 | 497 nested_dst.payload.optional_int32 = 1234 |
531 mask.FromJsonString('payload') | 498 mask.FromJsonString('payload') |
532 mask.MergeMessage(nested_src, nested_dst, True, False) | 499 mask.MergeMessage(nested_src, nested_dst, True, False) |
533 self.assertFalse(nested_dst.HasField('payload')) | 500 self.assertFalse(nested_dst.HasField('payload')) |
534 | 501 |
535 nested_src.payload.repeated_int32.append(1234) | 502 nested_src.payload.repeated_int32.append(1234) |
536 nested_dst.payload.repeated_int32.append(5678) | 503 nested_dst.payload.repeated_int32.append(5678) |
537 # Repeated fields will be appended by default. | 504 # Repeated fields will be appended by default. |
538 mask.FromJsonString('payload.repeatedInt32') | 505 mask.FromJsonString('payload.repeated_int32') |
539 mask.MergeMessage(nested_src, nested_dst) | 506 mask.MergeMessage(nested_src, nested_dst) |
540 self.assertEqual(2, len(nested_dst.payload.repeated_int32)) | 507 self.assertEqual(2, len(nested_dst.payload.repeated_int32)) |
541 self.assertEqual(5678, nested_dst.payload.repeated_int32[0]) | 508 self.assertEqual(5678, nested_dst.payload.repeated_int32[0]) |
542 self.assertEqual(1234, nested_dst.payload.repeated_int32[1]) | 509 self.assertEqual(1234, nested_dst.payload.repeated_int32[1]) |
543 # Change the behavior to replace repeated fields. | 510 # Change the behavior to replace repeated fields. |
544 mask.FromJsonString('payload.repeatedInt32') | 511 mask.FromJsonString('payload.repeated_int32') |
545 mask.MergeMessage(nested_src, nested_dst, False, True) | 512 mask.MergeMessage(nested_src, nested_dst, False, True) |
546 self.assertEqual(1, len(nested_dst.payload.repeated_int32)) | 513 self.assertEqual(1, len(nested_dst.payload.repeated_int32)) |
547 self.assertEqual(1234, nested_dst.payload.repeated_int32[0]) | 514 self.assertEqual(1234, nested_dst.payload.repeated_int32[0]) |
548 | 515 |
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 | |
600 | 516 |
601 class StructTest(unittest.TestCase): | 517 class StructTest(unittest.TestCase): |
602 | 518 |
603 def testStruct(self): | 519 def testStruct(self): |
604 struct = struct_pb2.Struct() | 520 struct = struct_pb2.Struct() |
605 struct_class = struct.__class__ | 521 struct_class = struct.__class__ |
606 | 522 |
607 struct['key1'] = 5 | 523 struct['key1'] = 5 |
608 struct['key2'] = 'abc' | 524 struct['key2'] = 'abc' |
609 struct['key3'] = True | 525 struct['key3'] = True |
610 struct.get_or_create_struct('key4')['subkey'] = 11.0 | 526 struct.get_or_create_struct('key4')['subkey'] = 11.0 |
611 struct_list = struct.get_or_create_list('key5') | 527 struct_list = struct.get_or_create_list('key5') |
612 struct_list.extend([6, 'seven', True, False, None]) | 528 struct_list.extend([6, 'seven', True, False, None]) |
613 struct_list.add_struct()['subkey2'] = 9 | 529 struct_list.add_struct()['subkey2'] = 9 |
614 | 530 |
615 self.assertTrue(isinstance(struct, well_known_types.Struct)) | 531 self.assertTrue(isinstance(struct, well_known_types.Struct)) |
616 self.assertEqual(5, struct['key1']) | 532 self.assertEquals(5, struct['key1']) |
617 self.assertEqual('abc', struct['key2']) | 533 self.assertEquals('abc', struct['key2']) |
618 self.assertIs(True, struct['key3']) | 534 self.assertIs(True, struct['key3']) |
619 self.assertEqual(11, struct['key4']['subkey']) | 535 self.assertEquals(11, struct['key4']['subkey']) |
620 inner_struct = struct_class() | 536 inner_struct = struct_class() |
621 inner_struct['subkey2'] = 9 | 537 inner_struct['subkey2'] = 9 |
622 self.assertEqual([6, 'seven', True, False, None, inner_struct], | 538 self.assertEquals([6, 'seven', True, False, None, inner_struct], |
623 list(struct['key5'].items())) | 539 list(struct['key5'].items())) |
624 | 540 |
625 serialized = struct.SerializeToString() | 541 serialized = struct.SerializeToString() |
626 | 542 |
627 struct2 = struct_pb2.Struct() | 543 struct2 = struct_pb2.Struct() |
628 struct2.ParseFromString(serialized) | 544 struct2.ParseFromString(serialized) |
629 | 545 |
630 self.assertEqual(struct, struct2) | 546 self.assertEquals(struct, struct2) |
631 | 547 |
632 self.assertTrue(isinstance(struct2, well_known_types.Struct)) | 548 self.assertTrue(isinstance(struct2, well_known_types.Struct)) |
633 self.assertEqual(5, struct2['key1']) | 549 self.assertEquals(5, struct2['key1']) |
634 self.assertEqual('abc', struct2['key2']) | 550 self.assertEquals('abc', struct2['key2']) |
635 self.assertIs(True, struct2['key3']) | 551 self.assertIs(True, struct2['key3']) |
636 self.assertEqual(11, struct2['key4']['subkey']) | 552 self.assertEquals(11, struct2['key4']['subkey']) |
637 self.assertEqual([6, 'seven', True, False, None, inner_struct], | 553 self.assertEquals([6, 'seven', True, False, None, inner_struct], |
638 list(struct2['key5'].items())) | 554 list(struct2['key5'].items())) |
639 | 555 |
640 struct_list = struct2['key5'] | 556 struct_list = struct2['key5'] |
641 self.assertEqual(6, struct_list[0]) | 557 self.assertEquals(6, struct_list[0]) |
642 self.assertEqual('seven', struct_list[1]) | 558 self.assertEquals('seven', struct_list[1]) |
643 self.assertEqual(True, struct_list[2]) | 559 self.assertEquals(True, struct_list[2]) |
644 self.assertEqual(False, struct_list[3]) | 560 self.assertEquals(False, struct_list[3]) |
645 self.assertEqual(None, struct_list[4]) | 561 self.assertEquals(None, struct_list[4]) |
646 self.assertEqual(inner_struct, struct_list[5]) | 562 self.assertEquals(inner_struct, struct_list[5]) |
647 | 563 |
648 struct_list[1] = 7 | 564 struct_list[1] = 7 |
649 self.assertEqual(7, struct_list[1]) | 565 self.assertEquals(7, struct_list[1]) |
650 | 566 |
651 struct_list.add_list().extend([1, 'two', True, False, None]) | 567 struct_list.add_list().extend([1, 'two', True, False, None]) |
652 self.assertEqual([1, 'two', True, False, None], | 568 self.assertEquals([1, 'two', True, False, None], |
653 list(struct_list[6].items())) | 569 list(struct_list[6].items())) |
654 | 570 |
655 text_serialized = str(struct) | 571 text_serialized = str(struct) |
656 struct3 = struct_pb2.Struct() | 572 struct3 = struct_pb2.Struct() |
657 text_format.Merge(text_serialized, struct3) | 573 text_format.Merge(text_serialized, struct3) |
658 self.assertEqual(struct, struct3) | 574 self.assertEquals(struct, struct3) |
659 | 575 |
660 struct.get_or_create_struct('key3')['replace'] = 12 | 576 struct.get_or_create_struct('key3')['replace'] = 12 |
661 self.assertEqual(12, struct['key3']['replace']) | 577 self.assertEquals(12, struct['key3']['replace']) |
662 | 578 |
663 | 579 |
664 class AnyTest(unittest.TestCase): | 580 class AnyTest(unittest.TestCase): |
665 | 581 |
666 def testAnyMessage(self): | 582 def testAnyMessage(self): |
667 # Creates and sets message. | 583 # Creates and sets message. |
668 msg = any_test_pb2.TestAny() | 584 msg = any_test_pb2.TestAny() |
669 msg_descriptor = msg.DESCRIPTOR | 585 msg_descriptor = msg.DESCRIPTOR |
670 all_types = unittest_pb2.TestAllTypes() | 586 all_types = unittest_pb2.TestAllTypes() |
671 all_descriptor = all_types.DESCRIPTOR | 587 all_descriptor = all_types.DESCRIPTOR |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 self.assertEqual(msg.type_url, | 635 self.assertEqual(msg.type_url, |
720 '/%s' % submessage.DESCRIPTOR.full_name) | 636 '/%s' % submessage.DESCRIPTOR.full_name) |
721 # Test unpacking the type. | 637 # Test unpacking the type. |
722 unpacked_message = any_test_pb2.TestAny() | 638 unpacked_message = any_test_pb2.TestAny() |
723 self.assertTrue(msg.Unpack(unpacked_message)) | 639 self.assertTrue(msg.Unpack(unpacked_message)) |
724 self.assertEqual(submessage, unpacked_message) | 640 self.assertEqual(submessage, unpacked_message) |
725 | 641 |
726 | 642 |
727 if __name__ == '__main__': | 643 if __name__ == '__main__': |
728 unittest.main() | 644 unittest.main() |
OLD | NEW |