OLD | NEW |
1 # Protocol Buffers - Google's data interchange format | 1 # Protocol Buffers - Google's data interchange format |
2 # Copyright 2008 Google Inc. All rights reserved. | 2 # Copyright 2008 Google Inc. All rights reserved. |
3 # https://developers.google.com/protocol-buffers/ | 3 # https://developers.google.com/protocol-buffers/ |
4 # | 4 # |
5 # Redistribution and use in source and binary forms, with or without | 5 # Redistribution and use in source and binary forms, with or without |
6 # modification, are permitted provided that the following conditions are | 6 # modification, are permitted provided that the following conditions are |
7 # met: | 7 # met: |
8 # | 8 # |
9 # * Redistributions of source code must retain the above copyright | 9 # * Redistributions of source code must retain the above copyright |
10 # notice, this list of conditions and the following disclaimer. | 10 # notice, this list of conditions and the following disclaimer. |
(...skipping 18 matching lines...) Expand all Loading... |
29 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
30 | 30 |
31 """Utilities for Python proto2 tests. | 31 """Utilities for Python proto2 tests. |
32 | 32 |
33 This is intentionally modeled on C++ code in | 33 This is intentionally modeled on C++ code in |
34 //google/protobuf/test_util.*. | 34 //google/protobuf/test_util.*. |
35 """ | 35 """ |
36 | 36 |
37 __author__ = 'robinson@google.com (Will Robinson)' | 37 __author__ = 'robinson@google.com (Will Robinson)' |
38 | 38 |
| 39 import numbers |
| 40 import operator |
39 import os.path | 41 import os.path |
40 | |
41 import sys | 42 import sys |
42 | 43 |
43 from google.protobuf import unittest_import_pb2 | 44 from google.protobuf import unittest_import_pb2 |
44 from google.protobuf import unittest_pb2 | 45 from google.protobuf import unittest_pb2 |
45 from google.protobuf import descriptor_pb2 | 46 from google.protobuf import descriptor_pb2 |
46 | 47 |
47 # Tests whether the given TestAllTypes message is proto2 or not. | 48 # Tests whether the given TestAllTypes message is proto2 or not. |
48 # This is used to gate several fields/features that only exist | 49 # This is used to gate several fields/features that only exist |
49 # for the proto2 version of the message. | 50 # for the proto2 version of the message. |
50 def IsProto2(message): | 51 def IsProto2(message): |
(...skipping 636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 message.unpacked_sint64.extend([606, 706]) | 688 message.unpacked_sint64.extend([606, 706]) |
688 message.unpacked_fixed32.extend([607, 707]) | 689 message.unpacked_fixed32.extend([607, 707]) |
689 message.unpacked_fixed64.extend([608, 708]) | 690 message.unpacked_fixed64.extend([608, 708]) |
690 message.unpacked_sfixed32.extend([609, 709]) | 691 message.unpacked_sfixed32.extend([609, 709]) |
691 message.unpacked_sfixed64.extend([610, 710]) | 692 message.unpacked_sfixed64.extend([610, 710]) |
692 message.unpacked_float.extend([611.0, 711.0]) | 693 message.unpacked_float.extend([611.0, 711.0]) |
693 message.unpacked_double.extend([612.0, 712.0]) | 694 message.unpacked_double.extend([612.0, 712.0]) |
694 message.unpacked_bool.extend([True, False]) | 695 message.unpacked_bool.extend([True, False]) |
695 message.unpacked_enum.extend([unittest_pb2.FOREIGN_BAR, | 696 message.unpacked_enum.extend([unittest_pb2.FOREIGN_BAR, |
696 unittest_pb2.FOREIGN_BAZ]) | 697 unittest_pb2.FOREIGN_BAZ]) |
| 698 |
| 699 |
| 700 class NonStandardInteger(numbers.Integral): |
| 701 """An integer object that does not subclass int. |
| 702 |
| 703 This is used to verify that both C++ and regular proto systems can handle |
| 704 integer others than int and long and that they handle them in predictable |
| 705 ways. |
| 706 |
| 707 NonStandardInteger is the minimal legal specification for a custom Integral. |
| 708 As such, it does not support 0 < x < 5 and it is not hashable. |
| 709 |
| 710 Note: This is added here instead of relying on numpy or a similar library with |
| 711 custom integers to limit dependencies. |
| 712 """ |
| 713 |
| 714 def __init__(self, val, error_string_on_conversion=None): |
| 715 assert isinstance(val, numbers.Integral) |
| 716 if isinstance(val, NonStandardInteger): |
| 717 val = val.val |
| 718 self.val = val |
| 719 self.error_string_on_conversion = error_string_on_conversion |
| 720 |
| 721 def __long__(self): |
| 722 if self.error_string_on_conversion: |
| 723 raise RuntimeError(self.error_string_on_conversion) |
| 724 return long(self.val) |
| 725 |
| 726 def __abs__(self): |
| 727 return NonStandardInteger(operator.abs(self.val)) |
| 728 |
| 729 def __add__(self, y): |
| 730 return NonStandardInteger(operator.add(self.val, y)) |
| 731 |
| 732 def __div__(self, y): |
| 733 return NonStandardInteger(operator.div(self.val, y)) |
| 734 |
| 735 def __eq__(self, y): |
| 736 return operator.eq(self.val, y) |
| 737 |
| 738 def __floordiv__(self, y): |
| 739 return NonStandardInteger(operator.floordiv(self.val, y)) |
| 740 |
| 741 def __truediv__(self, y): |
| 742 return NonStandardInteger(operator.truediv(self.val, y)) |
| 743 |
| 744 def __invert__(self): |
| 745 return NonStandardInteger(operator.invert(self.val)) |
| 746 |
| 747 def __mod__(self, y): |
| 748 return NonStandardInteger(operator.mod(self.val, y)) |
| 749 |
| 750 def __mul__(self, y): |
| 751 return NonStandardInteger(operator.mul(self.val, y)) |
| 752 |
| 753 def __neg__(self): |
| 754 return NonStandardInteger(operator.neg(self.val)) |
| 755 |
| 756 def __pos__(self): |
| 757 return NonStandardInteger(operator.pos(self.val)) |
| 758 |
| 759 def __pow__(self, y): |
| 760 return NonStandardInteger(operator.pow(self.val, y)) |
| 761 |
| 762 def __trunc__(self): |
| 763 return int(self.val) |
| 764 |
| 765 def __radd__(self, y): |
| 766 return NonStandardInteger(operator.add(y, self.val)) |
| 767 |
| 768 def __rdiv__(self, y): |
| 769 return NonStandardInteger(operator.div(y, self.val)) |
| 770 |
| 771 def __rmod__(self, y): |
| 772 return NonStandardInteger(operator.mod(y, self.val)) |
| 773 |
| 774 def __rmul__(self, y): |
| 775 return NonStandardInteger(operator.mul(y, self.val)) |
| 776 |
| 777 def __rpow__(self, y): |
| 778 return NonStandardInteger(operator.pow(y, self.val)) |
| 779 |
| 780 def __rfloordiv__(self, y): |
| 781 return NonStandardInteger(operator.floordiv(y, self.val)) |
| 782 |
| 783 def __rtruediv__(self, y): |
| 784 return NonStandardInteger(operator.truediv(y, self.val)) |
| 785 |
| 786 def __lshift__(self, y): |
| 787 return NonStandardInteger(operator.lshift(self.val, y)) |
| 788 |
| 789 def __rshift__(self, y): |
| 790 return NonStandardInteger(operator.rshift(self.val, y)) |
| 791 |
| 792 def __rlshift__(self, y): |
| 793 return NonStandardInteger(operator.lshift(y, self.val)) |
| 794 |
| 795 def __rrshift__(self, y): |
| 796 return NonStandardInteger(operator.rshift(y, self.val)) |
| 797 |
| 798 def __le__(self, y): |
| 799 if isinstance(y, NonStandardInteger): |
| 800 y = y.val |
| 801 return operator.le(self.val, y) |
| 802 |
| 803 def __lt__(self, y): |
| 804 if isinstance(y, NonStandardInteger): |
| 805 y = y.val |
| 806 return operator.lt(self.val, y) |
| 807 |
| 808 def __and__(self, y): |
| 809 return NonStandardInteger(operator.and_(self.val, y)) |
| 810 |
| 811 def __or__(self, y): |
| 812 return NonStandardInteger(operator.or_(self.val, y)) |
| 813 |
| 814 def __xor__(self, y): |
| 815 return NonStandardInteger(operator.xor(self.val, y)) |
| 816 |
| 817 def __rand__(self, y): |
| 818 return NonStandardInteger(operator.and_(y, self.val)) |
| 819 |
| 820 def __ror__(self, y): |
| 821 return NonStandardInteger(operator.or_(y, self.val)) |
| 822 |
| 823 def __rxor__(self, y): |
| 824 return NonStandardInteger(operator.xor(y, self.val)) |
| 825 |
| 826 def __bool__(self): |
| 827 return self.val |
| 828 |
| 829 def __nonzero__(self): |
| 830 return self.val |
| 831 |
| 832 def __ceil__(self): |
| 833 return self |
| 834 |
| 835 def __floor__(self): |
| 836 return self |
| 837 |
| 838 def __int__(self): |
| 839 if self.error_string_on_conversion: |
| 840 raise RuntimeError(self.error_string_on_conversion) |
| 841 return int(self.val) |
| 842 |
| 843 def __round__(self): |
| 844 return self |
| 845 |
| 846 def __repr__(self): |
| 847 return 'NonStandardInteger(%s)' % self.val |
| 848 |
OLD | NEW |