Index: third_party/protobuf/python/google/protobuf/internal/message_test.py |
diff --git a/third_party/protobuf/python/google/protobuf/internal/message_test.py b/third_party/protobuf/python/google/protobuf/internal/message_test.py |
index 73a9a3a37d46a6924e2e6490738cdd7abf6a1364..65174373d5f7215edbfc7d0c457f3c688acc8b41 100755 |
--- a/third_party/protobuf/python/google/protobuf/internal/message_test.py |
+++ b/third_party/protobuf/python/google/protobuf/internal/message_test.py |
@@ -43,11 +43,25 @@ abstract interface. |
__author__ = 'gps@google.com (Gregory P. Smith)' |
+import copy |
+import math |
import unittest |
from google.protobuf import unittest_import_pb2 |
from google.protobuf import unittest_pb2 |
from google.protobuf.internal import test_util |
+# Python pre-2.6 does not have isinf() or isnan() functions, so we have |
+# to provide our own. |
+def isnan(val): |
+ # NaN is never equal to itself. |
+ return val != val |
+def isinf(val): |
+ # Infinity times zero equals NaN. |
+ return not isnan(val) and isnan(val * 0) |
+def IsPosInf(val): |
+ return isinf(val) and (val > 0) |
+def IsNegInf(val): |
+ return isinf(val) and (val < 0) |
class MessageTest(unittest.TestCase): |
@@ -57,6 +71,8 @@ class MessageTest(unittest.TestCase): |
golden_message.ParseFromString(golden_data) |
test_util.ExpectAllFieldsSet(self, golden_message) |
self.assertTrue(golden_message.SerializeToString() == golden_data) |
+ golden_copy = copy.deepcopy(golden_message) |
+ self.assertTrue(golden_copy.SerializeToString() == golden_data) |
def testGoldenExtensions(self): |
golden_data = test_util.GoldenFile('golden_message').read() |
@@ -66,6 +82,8 @@ class MessageTest(unittest.TestCase): |
test_util.SetAllExtensions(all_set) |
self.assertEquals(all_set, golden_message) |
self.assertTrue(golden_message.SerializeToString() == golden_data) |
+ golden_copy = copy.deepcopy(golden_message) |
+ self.assertTrue(golden_copy.SerializeToString() == golden_data) |
def testGoldenPackedMessage(self): |
golden_data = test_util.GoldenFile('golden_packed_fields_message').read() |
@@ -75,6 +93,8 @@ class MessageTest(unittest.TestCase): |
test_util.SetAllPackedFields(all_set) |
self.assertEquals(all_set, golden_message) |
self.assertTrue(all_set.SerializeToString() == golden_data) |
+ golden_copy = copy.deepcopy(golden_message) |
+ self.assertTrue(golden_copy.SerializeToString() == golden_data) |
def testGoldenPackedExtensions(self): |
golden_data = test_util.GoldenFile('golden_packed_fields_message').read() |
@@ -84,6 +104,240 @@ class MessageTest(unittest.TestCase): |
test_util.SetAllPackedExtensions(all_set) |
self.assertEquals(all_set, golden_message) |
self.assertTrue(all_set.SerializeToString() == golden_data) |
+ golden_copy = copy.deepcopy(golden_message) |
+ self.assertTrue(golden_copy.SerializeToString() == golden_data) |
+ |
+ def testPositiveInfinity(self): |
+ golden_data = ('\x5D\x00\x00\x80\x7F' |
+ '\x61\x00\x00\x00\x00\x00\x00\xF0\x7F' |
+ '\xCD\x02\x00\x00\x80\x7F' |
+ '\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\x7F') |
+ golden_message = unittest_pb2.TestAllTypes() |
+ golden_message.ParseFromString(golden_data) |
+ self.assertTrue(IsPosInf(golden_message.optional_float)) |
+ self.assertTrue(IsPosInf(golden_message.optional_double)) |
+ self.assertTrue(IsPosInf(golden_message.repeated_float[0])) |
+ self.assertTrue(IsPosInf(golden_message.repeated_double[0])) |
+ self.assertTrue(golden_message.SerializeToString() == golden_data) |
+ |
+ def testNegativeInfinity(self): |
+ golden_data = ('\x5D\x00\x00\x80\xFF' |
+ '\x61\x00\x00\x00\x00\x00\x00\xF0\xFF' |
+ '\xCD\x02\x00\x00\x80\xFF' |
+ '\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\xFF') |
+ golden_message = unittest_pb2.TestAllTypes() |
+ golden_message.ParseFromString(golden_data) |
+ self.assertTrue(IsNegInf(golden_message.optional_float)) |
+ self.assertTrue(IsNegInf(golden_message.optional_double)) |
+ self.assertTrue(IsNegInf(golden_message.repeated_float[0])) |
+ self.assertTrue(IsNegInf(golden_message.repeated_double[0])) |
+ self.assertTrue(golden_message.SerializeToString() == golden_data) |
+ |
+ def testNotANumber(self): |
+ golden_data = ('\x5D\x00\x00\xC0\x7F' |
+ '\x61\x00\x00\x00\x00\x00\x00\xF8\x7F' |
+ '\xCD\x02\x00\x00\xC0\x7F' |
+ '\xD1\x02\x00\x00\x00\x00\x00\x00\xF8\x7F') |
+ golden_message = unittest_pb2.TestAllTypes() |
+ golden_message.ParseFromString(golden_data) |
+ self.assertTrue(isnan(golden_message.optional_float)) |
+ self.assertTrue(isnan(golden_message.optional_double)) |
+ self.assertTrue(isnan(golden_message.repeated_float[0])) |
+ self.assertTrue(isnan(golden_message.repeated_double[0])) |
+ self.assertTrue(golden_message.SerializeToString() == golden_data) |
+ |
+ def testPositiveInfinityPacked(self): |
+ golden_data = ('\xA2\x06\x04\x00\x00\x80\x7F' |
+ '\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\x7F') |
+ golden_message = unittest_pb2.TestPackedTypes() |
+ golden_message.ParseFromString(golden_data) |
+ self.assertTrue(IsPosInf(golden_message.packed_float[0])) |
+ self.assertTrue(IsPosInf(golden_message.packed_double[0])) |
+ self.assertTrue(golden_message.SerializeToString() == golden_data) |
+ |
+ def testNegativeInfinityPacked(self): |
+ golden_data = ('\xA2\x06\x04\x00\x00\x80\xFF' |
+ '\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\xFF') |
+ golden_message = unittest_pb2.TestPackedTypes() |
+ golden_message.ParseFromString(golden_data) |
+ self.assertTrue(IsNegInf(golden_message.packed_float[0])) |
+ self.assertTrue(IsNegInf(golden_message.packed_double[0])) |
+ self.assertTrue(golden_message.SerializeToString() == golden_data) |
+ |
+ def testNotANumberPacked(self): |
+ golden_data = ('\xA2\x06\x04\x00\x00\xC0\x7F' |
+ '\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF8\x7F') |
+ golden_message = unittest_pb2.TestPackedTypes() |
+ golden_message.ParseFromString(golden_data) |
+ self.assertTrue(isnan(golden_message.packed_float[0])) |
+ self.assertTrue(isnan(golden_message.packed_double[0])) |
+ self.assertTrue(golden_message.SerializeToString() == golden_data) |
+ |
+ def testExtremeFloatValues(self): |
+ message = unittest_pb2.TestAllTypes() |
+ |
+ # Most positive exponent, no significand bits set. |
+ kMostPosExponentNoSigBits = math.pow(2, 127) |
+ message.optional_float = kMostPosExponentNoSigBits |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_float == kMostPosExponentNoSigBits) |
+ |
+ # Most positive exponent, one significand bit set. |
+ kMostPosExponentOneSigBit = 1.5 * math.pow(2, 127) |
+ message.optional_float = kMostPosExponentOneSigBit |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_float == kMostPosExponentOneSigBit) |
+ |
+ # Repeat last two cases with values of same magnitude, but negative. |
+ message.optional_float = -kMostPosExponentNoSigBits |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_float == -kMostPosExponentNoSigBits) |
+ |
+ message.optional_float = -kMostPosExponentOneSigBit |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_float == -kMostPosExponentOneSigBit) |
+ |
+ # Most negative exponent, no significand bits set. |
+ kMostNegExponentNoSigBits = math.pow(2, -127) |
+ message.optional_float = kMostNegExponentNoSigBits |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_float == kMostNegExponentNoSigBits) |
+ |
+ # Most negative exponent, one significand bit set. |
+ kMostNegExponentOneSigBit = 1.5 * math.pow(2, -127) |
+ message.optional_float = kMostNegExponentOneSigBit |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_float == kMostNegExponentOneSigBit) |
+ |
+ # Repeat last two cases with values of the same magnitude, but negative. |
+ message.optional_float = -kMostNegExponentNoSigBits |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_float == -kMostNegExponentNoSigBits) |
+ |
+ message.optional_float = -kMostNegExponentOneSigBit |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_float == -kMostNegExponentOneSigBit) |
+ |
+ def testExtremeFloatValues(self): |
+ message = unittest_pb2.TestAllTypes() |
+ |
+ # Most positive exponent, no significand bits set. |
+ kMostPosExponentNoSigBits = math.pow(2, 1023) |
+ message.optional_double = kMostPosExponentNoSigBits |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_double == kMostPosExponentNoSigBits) |
+ |
+ # Most positive exponent, one significand bit set. |
+ kMostPosExponentOneSigBit = 1.5 * math.pow(2, 1023) |
+ message.optional_double = kMostPosExponentOneSigBit |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_double == kMostPosExponentOneSigBit) |
+ |
+ # Repeat last two cases with values of same magnitude, but negative. |
+ message.optional_double = -kMostPosExponentNoSigBits |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_double == -kMostPosExponentNoSigBits) |
+ |
+ message.optional_double = -kMostPosExponentOneSigBit |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_double == -kMostPosExponentOneSigBit) |
+ |
+ # Most negative exponent, no significand bits set. |
+ kMostNegExponentNoSigBits = math.pow(2, -1023) |
+ message.optional_double = kMostNegExponentNoSigBits |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_double == kMostNegExponentNoSigBits) |
+ |
+ # Most negative exponent, one significand bit set. |
+ kMostNegExponentOneSigBit = 1.5 * math.pow(2, -1023) |
+ message.optional_double = kMostNegExponentOneSigBit |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_double == kMostNegExponentOneSigBit) |
+ |
+ # Repeat last two cases with values of the same magnitude, but negative. |
+ message.optional_double = -kMostNegExponentNoSigBits |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_double == -kMostNegExponentNoSigBits) |
+ |
+ message.optional_double = -kMostNegExponentOneSigBit |
+ message.ParseFromString(message.SerializeToString()) |
+ self.assertTrue(message.optional_double == -kMostNegExponentOneSigBit) |
+ |
+ def testSortingRepeatedScalarFieldsDefaultComparator(self): |
+ """Check some different types with the default comparator.""" |
+ message = unittest_pb2.TestAllTypes() |
+ |
+ # TODO(mattp): would testing more scalar types strengthen test? |
+ message.repeated_int32.append(1) |
+ message.repeated_int32.append(3) |
+ message.repeated_int32.append(2) |
+ message.repeated_int32.sort() |
+ self.assertEqual(message.repeated_int32[0], 1) |
+ self.assertEqual(message.repeated_int32[1], 2) |
+ self.assertEqual(message.repeated_int32[2], 3) |
+ |
+ message.repeated_float.append(1.1) |
+ message.repeated_float.append(1.3) |
+ message.repeated_float.append(1.2) |
+ message.repeated_float.sort() |
+ self.assertAlmostEqual(message.repeated_float[0], 1.1) |
+ self.assertAlmostEqual(message.repeated_float[1], 1.2) |
+ self.assertAlmostEqual(message.repeated_float[2], 1.3) |
+ |
+ message.repeated_string.append('a') |
+ message.repeated_string.append('c') |
+ message.repeated_string.append('b') |
+ message.repeated_string.sort() |
+ self.assertEqual(message.repeated_string[0], 'a') |
+ self.assertEqual(message.repeated_string[1], 'b') |
+ self.assertEqual(message.repeated_string[2], 'c') |
+ |
+ message.repeated_bytes.append('a') |
+ message.repeated_bytes.append('c') |
+ message.repeated_bytes.append('b') |
+ message.repeated_bytes.sort() |
+ self.assertEqual(message.repeated_bytes[0], 'a') |
+ self.assertEqual(message.repeated_bytes[1], 'b') |
+ self.assertEqual(message.repeated_bytes[2], 'c') |
+ |
+ def testSortingRepeatedScalarFieldsCustomComparator(self): |
+ """Check some different types with custom comparator.""" |
+ message = unittest_pb2.TestAllTypes() |
+ |
+ message.repeated_int32.append(-3) |
+ message.repeated_int32.append(-2) |
+ message.repeated_int32.append(-1) |
+ message.repeated_int32.sort(lambda x,y: cmp(abs(x), abs(y))) |
+ self.assertEqual(message.repeated_int32[0], -1) |
+ self.assertEqual(message.repeated_int32[1], -2) |
+ self.assertEqual(message.repeated_int32[2], -3) |
+ |
+ message.repeated_string.append('aaa') |
+ message.repeated_string.append('bb') |
+ message.repeated_string.append('c') |
+ message.repeated_string.sort(lambda x,y: cmp(len(x), len(y))) |
+ self.assertEqual(message.repeated_string[0], 'c') |
+ self.assertEqual(message.repeated_string[1], 'bb') |
+ self.assertEqual(message.repeated_string[2], 'aaa') |
+ |
+ def testSortingRepeatedCompositeFieldsCustomComparator(self): |
+ """Check passing a custom comparator to sort a repeated composite field.""" |
+ message = unittest_pb2.TestAllTypes() |
+ |
+ message.repeated_nested_message.add().bb = 1 |
+ message.repeated_nested_message.add().bb = 3 |
+ message.repeated_nested_message.add().bb = 2 |
+ message.repeated_nested_message.add().bb = 6 |
+ message.repeated_nested_message.add().bb = 5 |
+ message.repeated_nested_message.add().bb = 4 |
+ message.repeated_nested_message.sort(lambda x,y: cmp(x.bb, y.bb)) |
+ self.assertEqual(message.repeated_nested_message[0].bb, 1) |
+ self.assertEqual(message.repeated_nested_message[1].bb, 2) |
+ self.assertEqual(message.repeated_nested_message[2].bb, 3) |
+ self.assertEqual(message.repeated_nested_message[3].bb, 4) |
+ self.assertEqual(message.repeated_nested_message[4].bb, 5) |
+ self.assertEqual(message.repeated_nested_message[5].bb, 6) |
+ |
if __name__ == '__main__': |
unittest.main() |