reflection_test.py revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#! /usr/bin/python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# -*- coding: utf-8 -*-
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Protocol Buffers - Google's data interchange format
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2008 Google Inc.  All rights reserved.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# http://code.google.com/p/protobuf/
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Redistribution and use in source and binary forms, with or without
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# modification, are permitted provided that the following conditions are
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# met:
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Redistributions of source code must retain the above copyright
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# notice, this list of conditions and the following disclaimer.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Redistributions in binary form must reproduce the above
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# in the documentation and/or other materials provided with the
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# distribution.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Neither the name of Google Inc. nor the names of its
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# contributors may be used to endorse or promote products derived from
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# this software without specific prior written permission.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Unittest for reflection.py, which also indirectly tests the output of the
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pure-Python protocol compiler.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__author__ = 'robinson@google.com (Will Robinson)'
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import operator
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import struct
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import unittest_import_pb2
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import unittest_mset_pb2
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import unittest_pb2
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import descriptor_pb2
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import descriptor
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import message
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import reflection
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import api_implementation
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import more_extensions_pb2
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import more_messages_pb2
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import wire_format
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import test_util
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import decoder
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class _MiniDecoder(object):
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Decodes a stream of values from a string.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Once upon a time we actually had a class called decoder.Decoder.  Then we
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  got rid of it during a redesign that made decoding much, much faster overall.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  But a couple tests in this file used it to check that the serialized form of
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  a message was correct.  So, this class implements just the methods that were
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  used by said tests, so that we don't have to rewrite the tests.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, bytes):
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._bytes = bytes
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._pos = 0
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ReadVarint(self):
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result, self._pos = decoder._DecodeVarint(self._bytes, self._pos)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadInt32 = ReadVarint
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadInt64 = ReadVarint
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadUInt32 = ReadVarint
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadUInt64 = ReadVarint
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ReadSInt64(self):
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return wire_format.ZigZagDecode(self.ReadVarint())
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadSInt32 = ReadSInt64
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ReadFieldNumberAndWireType(self):
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return wire_format.UnpackTag(self.ReadVarint())
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ReadFloat(self):
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = struct.unpack("<f", self._bytes[self._pos:self._pos+4])[0]
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._pos += 4
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ReadDouble(self):
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = struct.unpack("<d", self._bytes[self._pos:self._pos+8])[0]
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._pos += 8
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def EndOfStream(self):
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self._pos == len(self._bytes)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ReflectionTest(unittest.TestCase):
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def assertListsEqual(self, values, others):
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(len(values), len(others))
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i in range(len(values)):
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(values[i], others[i])
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testScalarConstructor(self):
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Constructor with only scalar types should succeed.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_int32=24,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_double=54.321,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_string='optional_string')
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(24, proto.optional_int32)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(54.321, proto.optional_double)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('optional_string', proto.optional_string)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalarConstructor(self):
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Constructor with only repeated scalar types should succeed.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_int32=[1, 2, 3, 4],
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_double=[1.23, 54.321],
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_bool=[True, False, False],
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_string=["optional_string"])
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([1, 2, 3, 4], list(proto.repeated_int32))
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([1.23, 54.321], list(proto.repeated_double))
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([True, False, False], list(proto.repeated_bool))
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(["optional_string"], list(proto.repeated_string))
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedCompositeConstructor(self):
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Constructor with only repeated composite types should succeed.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_nested_message=[
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.NestedMessage(
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                bb=unittest_pb2.TestAllTypes.FOO),
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.NestedMessage(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                bb=unittest_pb2.TestAllTypes.BAR)],
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_foreign_message=[
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=-43),
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=45324),
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=12)],
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeatedgroup=[
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.RepeatedGroup(),
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.RepeatedGroup(a=1),
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.RepeatedGroup(a=2)])
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [unittest_pb2.TestAllTypes.NestedMessage(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bb=unittest_pb2.TestAllTypes.FOO),
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.TestAllTypes.NestedMessage(
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             bb=unittest_pb2.TestAllTypes.BAR)],
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        list(proto.repeated_nested_message))
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [unittest_pb2.ForeignMessage(c=-43),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.ForeignMessage(c=45324),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.ForeignMessage(c=12)],
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        list(proto.repeated_foreign_message))
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [unittest_pb2.TestAllTypes.RepeatedGroup(),
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.TestAllTypes.RepeatedGroup(a=1),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.TestAllTypes.RepeatedGroup(a=2)],
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        list(proto.repeatedgroup))
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMixedConstructor(self):
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Constructor with only mixed types should succeed.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_int32=24,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_string='optional_string',
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_double=[1.23, 54.321],
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_bool=[True, False, False],
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_nested_message=[
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.NestedMessage(
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                bb=unittest_pb2.TestAllTypes.FOO),
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.NestedMessage(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                bb=unittest_pb2.TestAllTypes.BAR)],
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_foreign_message=[
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=-43),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=45324),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=12)])
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(24, proto.optional_int32)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('optional_string', proto.optional_string)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([1.23, 54.321], list(proto.repeated_double))
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([True, False, False], list(proto.repeated_bool))
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [unittest_pb2.TestAllTypes.NestedMessage(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bb=unittest_pb2.TestAllTypes.FOO),
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.TestAllTypes.NestedMessage(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             bb=unittest_pb2.TestAllTypes.BAR)],
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        list(proto.repeated_nested_message))
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [unittest_pb2.ForeignMessage(c=-43),
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.ForeignMessage(c=45324),
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.ForeignMessage(c=12)],
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        list(proto.repeated_foreign_message))
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testConstructorTypeError(self):
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, optional_int32="foo")
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, optional_string=1234)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, optional_nested_message=1234)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_int32=1234)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_int32=["foo"])
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_string=1234)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_string=[1234])
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=1234)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=[1234])
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testConstructorInvalidatesCachedByteSize(self):
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes(optional_int32 = 12)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(2, message.ByteSize())
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_nested_message = unittest_pb2.TestAllTypes.NestedMessage())
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(3, message.ByteSize())
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes(repeated_int32 = [12])
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(3, message.ByteSize())
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes(
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_nested_message = [unittest_pb2.TestAllTypes.NestedMessage()])
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(3, message.ByteSize())
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSimpleHasBits(self):
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test a scalar.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_int32'))
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_int32)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # HasField() shouldn't be true if all we've done is
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # read the default value.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_int32'))
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 1
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Setting a value however *should* set the "has" bit.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_int32'))
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('optional_int32')
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # And clearing that value should unset the "has" bit.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_int32'))
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHasBitsWithSinglyNestedScalar(self):
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Helper used to test foreign messages and groups.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # composite_field_name should be the name of a non-repeated
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # composite (i.e., foreign or group) field in TestAllTypes,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # and scalar_field_name should be the name of an integer-valued
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # scalar field within that composite.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # I never thought I'd miss C++ macros and templates so much. :(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This helper is semantically just:
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert proto.composite_field.scalar_field == 0
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.composite_field.HasField('scalar_field')
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.HasField('composite_field')
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   proto.composite_field.scalar_field = 10
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   old_composite_field = proto.composite_field
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert proto.composite_field.scalar_field == 10
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert proto.composite_field.HasField('scalar_field')
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert proto.HasField('composite_field')
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   proto.ClearField('composite_field')
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.composite_field.HasField('scalar_field')
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.HasField('composite_field')
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert proto.composite_field.scalar_field == 0
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   # Now ensure that ClearField('composite_field') disconnected
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   # the old field object from the object tree...
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert old_composite_field is not proto.composite_field
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   old_composite_field.scalar_field = 20
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.composite_field.HasField('scalar_field')
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.HasField('composite_field')
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def TestCompositeHasBits(composite_field_name, scalar_field_name):
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto = unittest_pb2.TestAllTypes()
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # First, check that we can get the scalar value, and see that it's the
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # default (0), but that proto.HasField('omposite') and
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # proto.composite.HasField('scalar') will still return False.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      composite_field = getattr(proto, composite_field_name)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      original_scalar_value = getattr(composite_field, scalar_field_name)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(0, original_scalar_value)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Assert that the composite object does not "have" the scalar.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not composite_field.HasField(scalar_field_name))
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Assert that proto does not "have" the composite field.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not proto.HasField(composite_field_name))
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Now set the scalar within the composite field.  Ensure that the setting
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # is reflected, and that proto.HasField('composite') and
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # proto.composite.HasField('scalar') now both return True.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_val = 20
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setattr(composite_field, scalar_field_name, new_val)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(new_val, getattr(composite_field, scalar_field_name))
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Hold on to a reference to the current composite_field object.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_composite_field = composite_field
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Assert that the has methods now return true.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(composite_field.HasField(scalar_field_name))
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(proto.HasField(composite_field_name))
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Now call the clear method...
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ClearField(composite_field_name)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # ...and ensure that the "has" bits are all back to False...
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      composite_field = getattr(proto, composite_field_name)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not composite_field.HasField(scalar_field_name))
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not proto.HasField(composite_field_name))
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # ...and ensure that the scalar field has returned to its default.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(0, getattr(composite_field, scalar_field_name))
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Finally, ensure that modifications to the old composite field object
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # don't have any effect on the parent. Possible only with the pure-python
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # implementation of the API.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # (NOTE that when we clear the composite field in the parent, we actually
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # don't recursively clear down the tree.  Instead, we just disconnect the
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # cleared composite from the tree.)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if api_implementation.Type() != 'python':
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(old_composite_field is not composite_field)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setattr(old_composite_field, scalar_field_name, new_val)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not composite_field.HasField(scalar_field_name))
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not proto.HasField(composite_field_name))
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(0, getattr(composite_field, scalar_field_name))
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test simple, single-level nesting when we set a scalar.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompositeHasBits('optionalgroup', 'a')
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompositeHasBits('optional_nested_message', 'bb')
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompositeHasBits('optional_foreign_message', 'c')
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompositeHasBits('optional_import_message', 'd')
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testReferencesToNestedMessage(self):
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested = proto.optional_nested_message
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # A previous version had a bug where this would raise an exception when
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # hitting a now-dead weak reference.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested.bb = 23
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDisconnectingNestedMessageBeforeSettingField(self):
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() != 'python':
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested = proto.optional_nested_message
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('optional_nested_message')  # Should disconnect from parent
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(nested is not proto.optional_nested_message)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested.bb = 23
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_nested_message'))
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_nested_message.bb)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHasBitsWhenModifyingRepeatedFields(self):
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test nesting when we add an element to a repeated field in a submessage.
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestNestedMessageHasBits()
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.nestedmessage_repeated_int32.append(5)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [5], proto.optional_nested_message.nestedmessage_repeated_int32)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Do the same test, but with a repeated composite field within the
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # submessage.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('optional_nested_message')
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_nested_message'))
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.nestedmessage_repeated_foreignmessage.add()
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHasBitsForManyLevelsOfNesting(self):
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test nesting many levels deep.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    recursive_proto = unittest_pb2.TestMutualRecursionA()
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not recursive_proto.HasField('bb'))
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, recursive_proto.bb.a.bb.a.bb.optional_int32)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not recursive_proto.HasField('bb'))
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    recursive_proto.bb.a.bb.a.bb.optional_int32 = 5
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, recursive_proto.bb.a.bb.a.bb.optional_int32)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.HasField('bb'))
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.bb.HasField('a'))
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.bb.a.HasField('bb'))
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.bb.a.bb.HasField('a'))
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.bb.a.bb.a.HasField('bb'))
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not recursive_proto.bb.a.bb.a.bb.HasField('a'))
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.bb.a.bb.a.bb.HasField('optional_int32'))
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingularListFields(self):
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_fixed32 = 1
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 5
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_string = 'foo'
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Access sub-message but don't set it yet.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested_message = proto.optional_nested_message
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 5),
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1),
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo') ],
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.bb = 123
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 5),
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1),
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo'),
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['optional_nested_message' ],
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             nested_message) ],
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedListFields(self):
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_fixed32.append(1)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(5)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(11)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_string.extend(['foo', 'bar'])
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_string.extend([])
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_string.append('baz')
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_string.extend(str(x) for x in xrange(2))
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 21
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_bool  # Access but don't set anything; should not be listed.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 21),
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['repeated_int32'  ], [5, 11]),
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['repeated_fixed32'], [1]),
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['repeated_string' ],
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ['foo', 'bar', 'baz', '0', '1']) ],
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingularListExtensions(self):
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.optional_fixed32_extension] = 1
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.optional_int32_extension  ] = 5
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.optional_string_extension ] = 'foo'
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (unittest_pb2.optional_int32_extension  , 5),
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.optional_fixed32_extension, 1),
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.optional_string_extension , 'foo') ],
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedListExtensions(self):
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_fixed32_extension].append(1)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_int32_extension  ].append(5)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_int32_extension  ].append(11)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_string_extension ].append('foo')
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_string_extension ].append('bar')
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_string_extension ].append('baz')
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.optional_int32_extension  ] = 21
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (unittest_pb2.optional_int32_extension  , 21),
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.repeated_int32_extension  , [5, 11]),
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.repeated_fixed32_extension, [1]),
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.repeated_string_extension , ['foo', 'bar', 'baz']) ],
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testListFieldsAndExtensions(self):
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestFieldOrderings()
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFieldsAndExtensions(proto)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unittest_pb2.my_extension_int
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (proto.DESCRIPTOR.fields_by_name['my_int'   ], 1),
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.my_extension_int               , 23),
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['my_string'], 'foo'),
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.my_extension_string            , 'bar'),
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['my_float' ], 1.0) ],
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDefaultValues(self):
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_int32)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_int64)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_uint32)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_uint64)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_sint32)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_sint64)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_fixed32)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_fixed64)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_sfixed32)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_sfixed64)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0.0, proto.optional_float)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0.0, proto.optional_double)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(False, proto.optional_bool)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('', proto.optional_string)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('', proto.optional_bytes)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(41, proto.default_int32)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(42, proto.default_int64)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(43, proto.default_uint32)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(44, proto.default_uint64)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(-45, proto.default_sint32)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(46, proto.default_sint64)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(47, proto.default_fixed32)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(48, proto.default_fixed64)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(49, proto.default_sfixed32)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(-50, proto.default_sfixed64)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(51.5, proto.default_float)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(52e3, proto.default_double)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(True, proto.default_bool)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('hello', proto.default_string)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('world', proto.default_bytes)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.BAR, proto.default_nested_enum)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.FOREIGN_BAR, proto.default_foreign_enum)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_import_pb2.IMPORT_BAR,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     proto.default_import_enum)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestExtremeDefaultValues()
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(u'\u1234', proto.utf8_string)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHasFieldWithUnknownFieldName(self):
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(ValueError, proto.HasField, 'nonexistent_field')
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testClearFieldWithUnknownFieldName(self):
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(ValueError, proto.ClearField, 'nonexistent_field')
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDisallowedAssignments(self):
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # It's illegal to assign values directly to repeated fields
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # or to nonrepeated composite fields.  Ensure that this fails.
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Repeated fields.
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', 10)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Lists shouldn't work, either.
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', [10])
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Composite fields.
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'optional_nested_message', 23)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Assignment to a repeated nested message field without specifying
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # the index in the array of nested messages.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto.repeated_nested_message,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'bb', 34)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Assignment to an attribute of a repeated field.
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto.repeated_float,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'some_attribute', 34)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # proto.nonexistent_field = 23 should fail as well.
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto, 'nonexistent_field', 23)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingleScalarTypeSafety(self):
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, setattr, proto, 'optional_int32', 1.1)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, setattr, proto, 'optional_int32', 'foo')
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, setattr, proto, 'optional_string', 10)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, setattr, proto, 'optional_bytes', 10)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingleScalarBoundsChecking(self):
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def TestMinAndMaxIntegers(field_name, expected_min, expected_max):
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pb = unittest_pb2.TestAllTypes()
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setattr(pb, field_name, expected_min)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(expected_min, getattr(pb, field_name))
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setattr(pb, field_name, expected_max)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(expected_max, getattr(pb, field_name))
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertRaises(ValueError, setattr, pb, field_name, expected_min - 1)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertRaises(ValueError, setattr, pb, field_name, expected_max + 1)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestMinAndMaxIntegers('optional_int32', -(1 << 31), (1 << 31) - 1)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestMinAndMaxIntegers('optional_uint32', 0, 0xffffffff)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestMinAndMaxIntegers('optional_int64', -(1 << 63), (1 << 63) - 1)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestMinAndMaxIntegers('optional_uint64', 0, 0xffffffffffffffff)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb = unittest_pb2.TestAllTypes()
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb.optional_nested_enum = 1
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, pb.optional_nested_enum)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Invalid enum values.
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb.optional_nested_enum = 0
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, pb.optional_nested_enum)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bytes_size_before = pb.ByteSize()
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb.optional_nested_enum = 4
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, pb.optional_nested_enum)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb.optional_nested_enum = 0
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, pb.optional_nested_enum)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Make sure that setting the same enum field doesn't just add unknown
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # fields (but overwrites them).
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(bytes_size_before, pb.ByteSize())
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Is the invalid value preserved after serialization?
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = pb.SerializeToString()
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb2 = unittest_pb2.TestAllTypes()
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb2.ParseFromString(serialized)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, pb2.optional_nested_enum)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(pb, pb2)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalarTypeSafety(self):
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_int32.append, 1.1)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_int32.append, 'foo')
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_string, 10)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_bytes, 10)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(10)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[0] = 23
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_int32.__setitem__, 500, 23)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_int32.__setitem__, 0, 'abc')
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Repeated enums tests.
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #proto.repeated_nested_enum.append(0)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingleScalarGettersAndSetters(self):
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_int32)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 1
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_int32)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_uint64 = 0xffffffffffff
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0xffffffffffff, proto.optional_uint64)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_uint64 = 0xffffffffffffffff
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0xffffffffffffffff, proto.optional_uint64)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # TODO(robinson): Test all other scalar field types.
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingleScalarClearField(self):
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Should be allowed to clear something that's not there (a no-op).
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('optional_int32')
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 1
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_int32'))
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('optional_int32')
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_int32)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_int32'))
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # TODO(robinson): Test all other scalar field types.
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testEnums(self):
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.FOO)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, unittest_pb2.TestAllTypes.FOO)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto.BAR)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, unittest_pb2.TestAllTypes.BAR)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, proto.BAZ)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalars(self):
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.repeated_int32)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(proto.repeated_int32))
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(5)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(10)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(15)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.repeated_int32)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, len(proto.repeated_int32))
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 10, 15], proto.repeated_int32)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test single retrieval.
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, proto.repeated_int32[0])
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(15, proto.repeated_int32[-1])
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test out-of-bounds indices.
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_int32.__getitem__, 1234)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_int32.__getitem__, -1234)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test incorrect types passed to __getitem__.
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_int32.__getitem__, 'foo')
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_int32.__getitem__, None)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test single assignment.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[1] = 20
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 20, 15], proto.repeated_int32)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test insertion.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.insert(1, 25)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 25, 20, 15], proto.repeated_int32)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice retrieval.
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(30)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([25, 20, 15], proto.repeated_int32[1:4])
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 25, 20, 15, 30], proto.repeated_int32[:])
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice assignment with an iterator
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[1:4] = (i for i in xrange(3))
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 0, 1, 2, 30], proto.repeated_int32)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice assignment.
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[1:4] = [35, 40, 45]
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 35, 40, 45, 30], proto.repeated_int32)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test that we can use the field as an iterator.
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = []
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i in proto.repeated_int32:
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result.append(i)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 35, 40, 45, 30], result)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test single deletion.
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[2]
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 35, 45, 30], proto.repeated_int32)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice deletion.
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[2:]
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 35], proto.repeated_int32)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test extending.
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.extend([3, 13])
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 35, 3, 13], proto.repeated_int32)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test clearing.
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('repeated_int32')
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.repeated_int32)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(proto.repeated_int32))
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(1)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.repeated_int32[-1])
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test assignment to a negative index.
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[-1] = 2
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto.repeated_int32[-1])
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test deletion at negative indices.
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[:] = [0, 1, 2, 3]
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[-1]
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([0, 1, 2], proto.repeated_int32)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[-2]
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([0, 2], proto.repeated_int32)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_int32.__delitem__, -3)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_int32.__delitem__, 300)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[-2:-1]
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([2], proto.repeated_int32)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[100:10000]
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([2], proto.repeated_int32)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalarsRemove(self):
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.repeated_int32)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(proto.repeated_int32))
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(5)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(10)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(5)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(5)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, len(proto.repeated_int32))
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.remove(5)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, len(proto.repeated_int32))
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(10, proto.repeated_int32[0])
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, proto.repeated_int32[1])
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, proto.repeated_int32[2])
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.remove(5)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, len(proto.repeated_int32))
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(10, proto.repeated_int32[0])
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, proto.repeated_int32[1])
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.remove(10)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, len(proto.repeated_int32))
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, proto.repeated_int32[0])
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Remove a non-existent element.
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(ValueError, proto.repeated_int32.remove, 123)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedComposites(self):
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.repeated_nested_message)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(proto.repeated_nested_message))
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m0 = proto.repeated_nested_message.add()
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m1 = proto.repeated_nested_message.add()
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.repeated_nested_message)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, len(proto.repeated_nested_message))
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual([m0, m1], proto.repeated_nested_message)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(isinstance(m0, unittest_pb2.TestAllTypes.NestedMessage))
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test out-of-bounds indices.
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__,
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      1234)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__,
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      -1234)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test incorrect types passed to __getitem__.
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__,
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'foo')
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__,
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      None)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice retrieval.
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m2 = proto.repeated_nested_message.add()
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m3 = proto.repeated_nested_message.add()
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m4 = proto.repeated_nested_message.add()
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual(
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [m1, m2, m3], proto.repeated_nested_message[1:4])
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual(
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [m0, m1, m2, m3, m4], proto.repeated_nested_message[:])
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual(
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [m0, m1], proto.repeated_nested_message[:2])
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual(
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [m2, m3, m4], proto.repeated_nested_message[2:])
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m0, proto.repeated_nested_message[0])
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual(
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [m0], proto.repeated_nested_message[:1])
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test that we can use the field as an iterator.
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = []
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i in proto.repeated_nested_message:
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result.append(i)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual([m0, m1, m2, m3, m4], result)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test single deletion.
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_nested_message[2]
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual([m0, m1, m3, m4], proto.repeated_nested_message)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice deletion.
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_nested_message[2:]
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual([m0, m1], proto.repeated_nested_message)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test extending.
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n1 = unittest_pb2.TestAllTypes.NestedMessage(bb=1)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n2 = unittest_pb2.TestAllTypes.NestedMessage(bb=2)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_nested_message.extend([n1,n2])
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, len(proto.repeated_nested_message))
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(n1, proto.repeated_nested_message[2])
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(n2, proto.repeated_nested_message[3])
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test clearing.
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('repeated_nested_message')
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.repeated_nested_message)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(proto.repeated_nested_message))
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test constructing an element while adding it.
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_nested_message.add(bb=23)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, len(proto.repeated_nested_message))
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, proto.repeated_nested_message[0].bb)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHandWrittenReflection(self):
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Hand written extensions are only supported by the pure-Python
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # implementation of the API.
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() != 'python':
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FieldDescriptor = descriptor.FieldDescriptor
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foo_field_descriptor = FieldDescriptor(
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name='foo_field', full_name='MyProto.foo_field',
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        index=0, number=1, type=FieldDescriptor.TYPE_INT64,
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cpp_type=FieldDescriptor.CPPTYPE_INT64,
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        label=FieldDescriptor.LABEL_OPTIONAL, default_value=0,
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        containing_type=None, message_type=None, enum_type=None,
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_extension=False, extension_scope=None,
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options=descriptor_pb2.FieldOptions())
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mydescriptor = descriptor.Descriptor(
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name='MyProto', full_name='MyProto', filename='ignored',
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        containing_type=None, nested_types=[], enum_types=[],
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fields=[foo_field_descriptor], extensions=[],
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options=descriptor_pb2.MessageOptions())
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class MyProtoClass(message.Message):
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DESCRIPTOR = mydescriptor
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __metaclass__ = reflection.GeneratedProtocolMessageType
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    myproto_instance = MyProtoClass()
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, myproto_instance.foo_field)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not myproto_instance.HasField('foo_field'))
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    myproto_instance.foo_field = 23
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, myproto_instance.foo_field)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(myproto_instance.HasField('foo_field'))
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTopLevelExtensionsForOptionalScalar(self):
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.optional_int32_extension
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, extendee_proto.Extensions[extension])
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # As with normal scalar fields, just doing a read doesn't actually set the
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # "has" bit.
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Actually set the thing.
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.Extensions[extension] = 23
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, extendee_proto.Extensions[extension])
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(extendee_proto.HasExtension(extension))
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that clearing works as well.
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, extendee_proto.Extensions[extension])
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTopLevelExtensionsForRepeatedScalar(self):
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.repeated_string_extension
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.Extensions[extension].append('foo')
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(['foo'], extendee_proto.Extensions[extension])
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string_list = extendee_proto.Extensions[extension]
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(string_list is not extendee_proto.Extensions[extension])
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't be allowed to do Extensions[extension] = 'a'
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      extension, 'a')
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTopLevelExtensionsForOptionalMessage(self):
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.optional_foreign_message_extension
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, extendee_proto.Extensions[extension].c)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # As with normal (non-extension) fields, merely reading from the
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # thing shouldn't set the "has" bit.
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.Extensions[extension].c = 23
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, extendee_proto.Extensions[extension].c)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(extendee_proto.HasExtension(extension))
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Save a reference here.
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message = extendee_proto.Extensions[extension]
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(foreign_message is not extendee_proto.Extensions[extension])
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Setting a field on foreign_message now shouldn't set
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # any "has" bits on extendee_proto.
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message.c = 42
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(42, foreign_message.c)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(foreign_message.HasField('c'))
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't be allowed to do Extensions[extension] = 'a'
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      extension, 'a')
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTopLevelExtensionsForRepeatedMessage(self):
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.repeatedgroup_extension
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group = extendee_proto.Extensions[extension].add()
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group.a = 23
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, extendee_proto.Extensions[extension][0].a)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group.a = 42
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(42, extendee_proto.Extensions[extension][0].a)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_list = extendee_proto.Extensions[extension]
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(group_list is not extendee_proto.Extensions[extension])
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't be allowed to do Extensions[extension] = 'a'
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      extension, 'a')
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNestedExtensions(self):
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.TestRequired.single
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # We just test the non-repeated case.
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    required = extendee_proto.Extensions[extension]
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, required.a)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    required.a = 23
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, extendee_proto.Extensions[extension].a)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(extendee_proto.HasExtension(extension))
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(required is not extendee_proto.Extensions[extension])
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # If message A directly contains message B, and
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # a.HasField('b') is currently False, then mutating any
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # extension in B should change a.HasField('b') to True
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # (and so on up the object tree).
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHasBitsForAncestorsOfExtendedMessage(self):
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Optional scalar extension.
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel = more_extensions_pb2.TopLevelMessage()
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, toplevel.submessage.Extensions[
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_int_extension])
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel.submessage.Extensions[
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_int_extension] = 23
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, toplevel.submessage.Extensions[
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_int_extension])
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(toplevel.HasField('submessage'))
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Repeated scalar extension.
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel = more_extensions_pb2.TopLevelMessage()
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([], toplevel.submessage.Extensions[
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_int_extension])
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel.submessage.Extensions[
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_int_extension].append(23)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([23], toplevel.submessage.Extensions[
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_int_extension])
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(toplevel.HasField('submessage'))
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Optional message extension.
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel = more_extensions_pb2.TopLevelMessage()
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, toplevel.submessage.Extensions[
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_message_extension].foreign_message_int)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel.submessage.Extensions[
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_message_extension].foreign_message_int = 23
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, toplevel.submessage.Extensions[
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_message_extension].foreign_message_int)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(toplevel.HasField('submessage'))
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Repeated message extension.
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel = more_extensions_pb2.TopLevelMessage()
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(toplevel.submessage.Extensions[
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_message_extension]))
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign = toplevel.submessage.Extensions[
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_message_extension].add()
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(foreign, toplevel.submessage.Extensions[
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_message_extension][0])
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(toplevel.HasField('submessage'))
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDisconnectionAfterClearingEmptyMessage(self):
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel = more_extensions_pb2.TopLevelMessage()
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = toplevel.submessage
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = more_extensions_pb2.optional_message_extension
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_proto = extendee_proto.Extensions[extension]
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_proto.foreign_message_int = 23
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(extension_proto is not extendee_proto.Extensions[extension])
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testExtensionFailureModes(self):
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Try non-extension-handle arguments to HasExtension,
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # ClearExtension(), and Extensions[]...
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.HasExtension, 1234)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.ClearExtension, 1234)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__, 1234)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__, 1234, 5)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Try something that *is* an extension handle, just not for
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # this message...
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unknown_handle = more_extensions_pb2.optional_int_extension
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.HasExtension,
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unknown_handle)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.ClearExtension,
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unknown_handle)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__,
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unknown_handle)
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__,
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unknown_handle, 5)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Try call HasExtension() with a valid handle, but for a
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # *repeated* field.  (Just as with non-extension repeated
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # fields, Has*() isn't supported for extension repeated fields).
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.HasExtension,
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unittest_pb2.repeated_string_extension)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testStaticParseFrom(self):
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(proto1)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string1 = proto1.SerializeToString()
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes.FromString(string1)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Messages should be equal.
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto2, proto1)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromSingularField(self):
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test merge with just a singular field.
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optional_int32 = 1
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This shouldn't get overwritten.
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.optional_string = 'value'
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.optional_int32)
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('value', proto2.optional_string)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromRepeatedField(self):
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test merge with just a repeated field.
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.repeated_int32.append(1)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.repeated_int32.append(2)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.repeated_int32.append(0)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto2.repeated_int32[0])
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.repeated_int32[1])
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto2.repeated_int32[2])
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromOptionalGroup(self):
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test merge with an optional group.
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optionalgroup.a = 12
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(12, proto2.optionalgroup.a)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromRepeatedNestedMessage(self):
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test merge with a repeated nested message.
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = proto1.repeated_nested_message.add()
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 123
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = proto1.repeated_nested_message.add()
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 321
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = proto2.repeated_nested_message.add()
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 999
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(999, proto2.repeated_nested_message[0].bb)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(123, proto2.repeated_nested_message[1].bb)
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(321, proto2.repeated_nested_message[2].bb)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto3 = unittest_pb2.TestAllTypes()
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto3.repeated_nested_message.MergeFrom(proto2.repeated_nested_message)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(999, proto3.repeated_nested_message[0].bb)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(123, proto3.repeated_nested_message[1].bb)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(321, proto3.repeated_nested_message[2].bb)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromAllFields(self):
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # With all fields set.
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(proto1)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Messages should be equal.
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto2, proto1)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Serialized string should be equal too.
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string1 = proto1.SerializeToString()
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string2 = proto2.SerializeToString()
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(string1, string2)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromExtensionsSingular(self):
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllExtensions()
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.Extensions[unittest_pb2.optional_int32_extension] = 1
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllExtensions()
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1, proto2.Extensions[unittest_pb2.optional_int32_extension])
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromExtensionsRepeated(self):
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllExtensions()
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.Extensions[unittest_pb2.repeated_int32_extension].append(1)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.Extensions[unittest_pb2.repeated_int32_extension].append(2)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllExtensions()
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.Extensions[unittest_pb2.repeated_int32_extension].append(0)
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        3, len(proto2.Extensions[unittest_pb2.repeated_int32_extension]))
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, proto2.Extensions[unittest_pb2.repeated_int32_extension][0])
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1, proto2.Extensions[unittest_pb2.repeated_int32_extension][1])
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        2, proto2.Extensions[unittest_pb2.repeated_int32_extension][2])
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromExtensionsNestedMessage(self):
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllExtensions()
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext1 = proto1.Extensions[
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.repeated_nested_message_extension]
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = ext1.add()
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 222
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = ext1.add()
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 333
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllExtensions()
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext2 = proto2.Extensions[
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.repeated_nested_message_extension]
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = ext2.add()
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 111
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext2 = proto2.Extensions[
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.repeated_nested_message_extension]
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, len(ext2))
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(111, ext2[0].bb)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(222, ext2[1].bb)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(333, ext2[2].bb)
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromBug(self):
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = unittest_pb2.TestAllTypes()
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2 = unittest_pb2.TestAllTypes()
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Cause optional_nested_message to be instantiated within message1, even
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # though it is not considered to be "present".
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.optional_nested_message
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(message1.HasField('optional_nested_message'))
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Merge into message2.  This should not instantiate the field is message2.
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.MergeFrom(message1)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(message2.HasField('optional_nested_message'))
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCopyFromSingularField(self):
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test copy with just a singular field.
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optional_int32 = 1
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optional_string = 'important-text'
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.optional_string = 'value'
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.CopyFrom(proto1)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.optional_int32)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('important-text', proto2.optional_string)
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCopyFromRepeatedField(self):
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test copy with a repeated field.
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.repeated_int32.append(1)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.repeated_int32.append(2)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.repeated_int32.append(0)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.CopyFrom(proto1)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.repeated_int32[0])
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto2.repeated_int32[1])
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCopyFromAllFields(self):
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # With all fields set.
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(proto1)
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.CopyFrom(proto1)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Messages should be equal.
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto2, proto1)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Serialized string should be equal too.
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string1 = proto1.SerializeToString()
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string2 = proto2.SerializeToString()
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(string1, string2)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCopyFromSelf(self):
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.repeated_int32.append(1)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optional_int32 = 2
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optional_string = 'important-text'
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.CopyFrom(proto1)
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto1.repeated_int32[0])
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto1.optional_int32)
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('important-text', proto1.optional_string)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCopyFromBadType(self):
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The python implementation doesn't raise an exception in this
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # case. In theory it should.
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() == 'python':
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllExtensions()
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto1.CopyFrom, proto2)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testClear(self):
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(proto)
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Clear the message.
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Clear()
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(proto.ByteSize(), 0)
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    empty_proto = unittest_pb2.TestAllTypes()
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(proto, empty_proto)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test if extensions which were set are cleared.
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllExtensions(proto)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Clear the message.
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Clear()
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(proto.ByteSize(), 0)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    empty_proto = unittest_pb2.TestAllExtensions()
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(proto, empty_proto)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def assertInitialized(self, proto):
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.IsInitialized())
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Neither method should raise an exception.
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializeToString()
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializePartialToString()
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def assertNotInitialized(self, proto):
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(proto.IsInitialized())
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(message.EncodeError, proto.SerializeToString)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # "Partial" serialization doesn't care if message is uninitialized.
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializePartialToString()
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsInitialized(self):
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Trivial cases - all optional fields and extensions.
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The case of uninitialized required fields.
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequired()
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.a = proto.b = proto.c = 2
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The case of uninitialized submessage.
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequiredForeign()
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.a = 1
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.b = 0
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.c = 0
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Uninitialized repeated submessage.
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = proto.repeated_message.add()
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.a = message1.b = message1.c = 0
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Uninitialized repeated group in an extension.
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.TestRequired.multi
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = proto.Extensions[extension].add()
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2 = proto.Extensions[extension].add()
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.a = 1
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.b = 1
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.c = 1
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.a = 2
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.b = 2
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.c = 2
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Uninitialized nonrepeated message in an extension.
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.TestRequired.single
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension].a = 1
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension].b = 2
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension].c = 3
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Try passing an errors list.
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    errors = []
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequired()
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(proto.IsInitialized(errors))
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(errors, ['a', 'b', 'c'])
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testStringUTF8Encoding(self):
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Assignment of a unicode object to a field of type 'bytes' is not allowed.
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError,
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      setattr, proto, 'optional_bytes', u'unicode object')
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check that the default value is of python's 'unicode' type.
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(type(proto.optional_string), unicode)
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_string = unicode('Testing')
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.optional_string, str('Testing'))
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Assign a value of type 'str' which can be encoded in UTF-8.
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_string = str('Testing')
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.optional_string, unicode('Testing'))
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() == 'python':
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Values of type 'str' are also accepted as long as they can be
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # encoded in UTF-8.
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(type(proto.optional_string), str)
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Try to assign a 'str' value which contains bytes that aren't 7-bit ASCII.
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(ValueError,
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      setattr, proto, 'optional_string', str('a\x80a'))
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Assign a 'str' object which contains a UTF-8 encoded string.
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(ValueError,
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      setattr, proto, 'optional_string', 'Тест')
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # No exception thrown.
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_string = 'abc'
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testStringUTF8Serialization(self):
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_mset_pb2.TestMessageSet()
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message = unittest_mset_pb2.TestMessageSetExtension2
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = extension_message.message_set_extension
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utf8 = u'Тест'
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utf8_bytes = test_utf8.encode('utf-8')
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 'Test' in another language, using UTF-8 charset.
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension].str = test_utf8
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Serialize using the MessageSet wire format (this is specified in the
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # .proto file).
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check byte size.
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.ByteSize(), len(serialized))
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raw = unittest_mset_pb2.RawMessageSet()
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raw.MergeFromString(serialized)
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2 = unittest_mset_pb2.TestMessageSetExtension2()
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, len(raw.item))
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check that the type_id is the same as the tag ID in the .proto file.
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(raw.item[0].type_id, 1547769)
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check the actual bytes on the wire.
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        raw.item[0].message.endswith(test_utf8_bytes))
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.MergeFromString(raw.item[0].message)
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(type(message2.str), unicode)
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(message2.str, test_utf8)
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The pure Python API throws an exception on MergeFromString(),
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # if any of the string fields of the message can't be UTF-8 decoded.
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The C++ implementation of the API has no way to check that on
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # MergeFromString and thus has no way to throw the exception.
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The pure Python API always returns objects of type 'unicode' (UTF-8
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # encoded), or 'str' (in 7 bit ASCII).
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bytes = raw.item[0].message.replace(
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_utf8_bytes, len(test_utf8_bytes) * '\xff')
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unicode_decode_failed = False
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      message2.MergeFromString(bytes)
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except UnicodeDecodeError, e:
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unicode_decode_failed = True
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string_field = message2.str
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(unicode_decode_failed or type(string_field) == str)
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testEmptyNestedMessage(self):
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.MergeFrom(
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.TestAllTypes.NestedMessage())
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.CopyFrom(
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.TestAllTypes.NestedMessage())
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.MergeFromString('')
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.ParseFromString('')
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFromString(serialized)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto2.HasField('optional_nested_message'))
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSetInParent(self):
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(proto.HasField('optionalgroup'))
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optionalgroup.SetInParent()
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optionalgroup'))
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  Since we had so many tests for protocol buffer equality, we broke these out
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  into separate TestCase classes.
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestAllTypesEqualityTest(unittest.TestCase):
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto = unittest_pb2.TestAllTypes()
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.second_proto = unittest_pb2.TestAllTypes()
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNotHashable(self):
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, hash, self.first_proto)
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSelfEquality(self):
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.first_proto)
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testEmptyProtosEqual(self):
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullProtosEqualityTest(unittest.TestCase):
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Equality tests using completely-full protos as a starting point."""
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto = unittest_pb2.TestAllTypes()
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.second_proto = unittest_pb2.TestAllTypes()
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(self.first_proto)
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(self.second_proto)
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNotHashable(self):
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, hash, self.first_proto)
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNoneNotEqual(self):
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, None)
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(None, self.second_proto)
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNotEqualToOtherMessage(self):
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    third_proto = unittest_pb2.TestRequired()
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, third_proto)
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(third_proto, self.second_proto)
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testAllFieldsFilledEquality(self):
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNonRepeatedScalar(self):
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Nonrepeated scalar field change should cause inequality.
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_int32 += 1
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # ...as should clearing a field.
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.ClearField('optional_int32')
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNonRepeatedComposite(self):
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Change a nonrepeated composite field.
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.bb += 1
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.bb -= 1
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Clear a field in the nested message.
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.ClearField('bb')
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.bb = (
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.second_proto.optional_nested_message.bb)
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Remove the nested message entirely.
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.ClearField('optional_nested_message')
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalar(self):
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Change a repeated scalar field.
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.repeated_int32.append(5)
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.ClearField('repeated_int32')
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedComposite(self):
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Change value within a repeated composite field.
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.repeated_nested_message[0].bb += 1
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.repeated_nested_message[0].bb -= 1
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Add a value to a repeated composite field.
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.repeated_nested_message.add()
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.second_proto.repeated_nested_message.add()
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNonRepeatedScalarHasBits(self):
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we test "has" bits as well as value for
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # nonrepeated scalar field.
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.ClearField('optional_int32')
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.second_proto.optional_int32 = 0
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNonRepeatedCompositeHasBits(self):
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we test "has" bits as well as value for
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # nonrepeated composite field.
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.ClearField('optional_nested_message')
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.second_proto.optional_nested_message.ClearField('bb')
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.bb = 0
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.ClearField('bb')
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionEqualityTest(unittest.TestCase):
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testExtensionEquality(self):
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllExtensions()
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllExtensions()
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllExtensions(first_proto)
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(first_proto, second_proto)
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllExtensions(second_proto)
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we check value equality.
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.Extensions[unittest_pb2.optional_int32_extension] += 1
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(first_proto, second_proto)
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.Extensions[unittest_pb2.optional_int32_extension] -= 1
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we also look at "has" bits.
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.ClearExtension(unittest_pb2.optional_int32_extension)
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.Extensions[unittest_pb2.optional_int32_extension] = 0
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(first_proto, second_proto)
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.Extensions[unittest_pb2.optional_int32_extension] = 0
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that differences in cached values
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # don't matter if "has" bits are both false.
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllExtensions()
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllExtensions()
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, first_proto.Extensions[unittest_pb2.optional_int32_extension])
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MutualRecursionEqualityTest(unittest.TestCase):
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testEqualityWithMutualRecursion(self):
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestMutualRecursionA()
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestMutualRecursionA()
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.bb.a.bb.optional_int32 = 23
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(first_proto, second_proto)
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.bb.a.bb.optional_int32 = 23
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ByteSizeTest(unittest.TestCase):
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto = more_extensions_pb2.ExtendedMessage()
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto = unittest_pb2.TestPackedTypes()
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_extended_proto = unittest_pb2.TestPackedExtensions()
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Size(self):
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.proto.ByteSize()
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testEmptyMessage(self):
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.proto.ByteSize())
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSizedOnKwargs(self):
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Use a separate message to ensure testing right after creation.
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.ByteSize())
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto_kwargs = unittest_pb2.TestAllTypes(optional_int64 = 1)
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for the tag, one to encode varint 1.
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto_kwargs.ByteSize())
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testVarints(self):
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def Test(i, expected_varint_size):
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.proto.Clear()
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.proto.optional_int64 = i
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Add one to the varint size for the tag info
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # for tag 1.
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(expected_varint_size + 1, self.Size())
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Test(0, 1)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Test(1, 1)
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i, num_bytes in zip(range(7, 63, 7), range(1, 10000)):
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Test((1 << i) - 1, num_bytes)
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Test(-1, 10)
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Test(-2, 10)
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Test(-(1 << 63), 10)
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testStrings(self):
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_string = ''
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Need one byte for tag info (tag #14), and one byte for length.
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, self.Size())
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_string = 'abc'
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Need one byte for tag info (tag #14), and one byte for length.
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + len(self.proto.optional_string), self.Size())
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_string = 'x' * 128
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Need one byte for tag info (tag #14), and TWO bytes for length.
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3 + len(self.proto.optional_string), self.Size())
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testOtherNumerics(self):
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_fixed32 = 1234
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for tag and 4 bytes for fixed32.
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, self.Size())
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_fixed64 = 1234
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for tag and 8 bytes for fixed64.
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(9, self.Size())
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_float = 1.234
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for tag and 4 bytes for float.
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, self.Size())
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_double = 1.234
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for tag and 8 bytes for float.
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(9, self.Size())
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_sint32 = 64
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for tag and 2 bytes for zig-zag-encoded 64.
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.Size())
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testComposites(self):
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 3 bytes.
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_nested_message.bb = (1 << 14)
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Plus one byte for bb tag.
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Plus 1 byte for optional_nested_message serialized size.
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Plus two bytes for optional_nested_message tag.
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3 + 1 + 1 + 2, self.Size())
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGroups(self):
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 4 bytes.
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optionalgroup.a = (1 << 21)
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Plus two bytes for |a| tag.
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Plus 2 * two bytes for START_GROUP and END_GROUP tags.
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4 + 2 + 2*2, self.Size())
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalars(self):
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(10)  # 1 byte.
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(128)  # 2 bytes.
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Also need 2 bytes for each entry for tag.
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1 + 2 + 2*2, self.Size())
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalarsExtend(self):
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.extend([10, 128])  # 3 bytes.
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Also need 2 bytes for each entry for tag.
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1 + 2 + 2*2, self.Size())
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalarsRemove(self):
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(10)  # 1 byte.
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(128)  # 2 bytes.
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Also need 2 bytes for each entry for tag.
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1 + 2 + 2*2, self.Size())
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.remove(128)
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1 + 2, self.Size())
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedComposites(self):
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Empty message.  2 bytes tag plus 1 byte length.
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_0 = self.proto.repeated_nested_message.add()
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_1 = self.proto.repeated_nested_message.add()
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_1.bb = 7
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size())
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedCompositesDelete(self):
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Empty message.  2 bytes tag plus 1 byte length.
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_0 = self.proto.repeated_nested_message.add()
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_1 = self.proto.repeated_nested_message.add()
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_1.bb = 9
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size())
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del self.proto.repeated_nested_message[0]
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 1 + 1 + 1, self.Size())
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Now add a new message.
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_2 = self.proto.repeated_nested_message.add()
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_2.bb = 12
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 1 + 1 + 1 + 2 + 1 + 1 + 1, self.Size())
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del self.proto.repeated_nested_message[1]
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 1 + 1 + 1, self.Size())
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del self.proto.repeated_nested_message[0]
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.Size())
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedGroups(self):
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2-byte START_GROUP plus 2-byte END_GROUP.
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_0 = self.proto.repeatedgroup.add()
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2-byte START_GROUP plus 2-byte |a| tag + 1-byte |a|
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # plus 2-byte END_GROUP.
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_1 = self.proto.repeatedgroup.add()
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_1.a =  7
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 2 + 2 + 2 + 1 + 2, self.Size())
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testExtensions(self):
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.ByteSize())
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.optional_int32_extension  # Field #1, 1 byte.
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension] = 23
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 1 byte for tag, 1 byte for value.
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto.ByteSize())
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCacheInvalidationForNonrepeatedScalar(self):
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test non-extension.
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_int32 = 1
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, self.proto.ByteSize())
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_int32 = 128
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.proto.ByteSize())
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.ClearField('optional_int32')
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.proto.ByteSize())
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test within extension.
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = more_extensions_pb2.optional_int_extension
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.Extensions[extension] = 1
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, self.extended_proto.ByteSize())
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.Extensions[extension] = 128
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.extended_proto.ByteSize())
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.ClearExtension(extension)
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.extended_proto.ByteSize())
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCacheInvalidationForRepeatedScalar(self):
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test non-extension.
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(1)
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.proto.ByteSize())
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(1)
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(6, self.proto.ByteSize())
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32[1] = 128
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(7, self.proto.ByteSize())
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.ClearField('repeated_int32')
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.proto.ByteSize())
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test within extension.
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = more_extensions_pb2.repeated_int_extension
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    repeated = self.extended_proto.Extensions[extension]
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    repeated.append(1)
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, self.extended_proto.ByteSize())
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    repeated.append(1)
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, self.extended_proto.ByteSize())
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    repeated[1] = 128
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, self.extended_proto.ByteSize())
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.ClearExtension(extension)
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.extended_proto.ByteSize())
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCacheInvalidationForNonrepeatedMessage(self):
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test non-extension.
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_foreign_message.c = 1
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, self.proto.ByteSize())
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_foreign_message.c = 128
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(6, self.proto.ByteSize())
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_foreign_message.ClearField('c')
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.proto.ByteSize())
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.ClearField('optional_foreign_message')
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.proto.ByteSize())
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() == 'python':
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # This is only possible in pure-Python implementation of the API.
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child = self.proto.optional_foreign_message
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.proto.ClearField('optional_foreign_message')
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child.c = 128
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(0, self.proto.ByteSize())
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test within extension.
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = more_extensions_pb2.optional_message_extension
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = self.extended_proto.Extensions[extension]
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.extended_proto.ByteSize())
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child.foreign_message_int = 1
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, self.extended_proto.ByteSize())
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child.foreign_message_int = 128
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, self.extended_proto.ByteSize())
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.ClearExtension(extension)
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.extended_proto.ByteSize())
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCacheInvalidationForRepeatedMessage(self):
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test non-extension.
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child0 = self.proto.repeated_foreign_message.add()
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.proto.ByteSize())
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_foreign_message.add()
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(6, self.proto.ByteSize())
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child0.c = 1
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(8, self.proto.ByteSize())
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.ClearField('repeated_foreign_message')
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.proto.ByteSize())
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test within extension.
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = more_extensions_pb2.repeated_message_extension
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_list = self.extended_proto.Extensions[extension]
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child0 = child_list.add()
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, self.extended_proto.ByteSize())
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_list.add()
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, self.extended_proto.ByteSize())
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child0.foreign_message_int = 1
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(6, self.extended_proto.ByteSize())
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child0.ClearField('foreign_message_int')
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, self.extended_proto.ByteSize())
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.ClearExtension(extension)
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.extended_proto.ByteSize())
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPackedRepeatedScalars(self):
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.packed_proto.ByteSize())
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto.packed_int32.append(10)   # 1 byte.
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto.packed_int32.append(128)  # 2 bytes.
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The tag is 2 bytes (the field number is 90), and the varint
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # storing the length is 1 byte.
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_size = 1 + 2 + 3
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(int_size, self.packed_proto.ByteSize())
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto.packed_double.append(4.2)   # 8 bytes
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto.packed_double.append(3.25)  # 8 bytes
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 more tag bytes, 1 more length byte.
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double_size = 8 + 8 + 3
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(int_size+double_size, self.packed_proto.ByteSize())
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto.ClearField('packed_int32')
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(double_size, self.packed_proto.ByteSize())
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPackedExtensions(self):
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.packed_extended_proto.ByteSize())
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = self.packed_extended_proto.Extensions[
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.packed_fixed32_extension]
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension.extend([1, 2, 3, 4])   # 16 bytes
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Tag is 3 bytes.
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(19, self.packed_extended_proto.ByteSize())
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Issues to be sure to cover include:
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * Handling of unrecognized tags ("uninterpreted_bytes").
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * Handling of MessageSets.
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * Consistent ordering of tags in the wire format,
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     including ordering between extensions and non-extension
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     fields.
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * Consistent serialization of negative numbers, especially
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     negative int32s.
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * Handling of empty submessages (with and without "has"
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     bits set).
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SerializationTest(unittest.TestCase):
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeEmtpyMessage(self):
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllTypes()
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllTypes()
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto.ByteSize(), len(serialized))
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.MergeFromString(serialized)
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeAllFields(self):
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllTypes()
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllTypes()
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(first_proto)
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto.ByteSize(), len(serialized))
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.MergeFromString(serialized)
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeAllExtensions(self):
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllExtensions()
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllExtensions()
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllExtensions(first_proto)
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.MergeFromString(serialized)
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeNegativeValues(self):
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllTypes()
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_int32 = -1
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_int64 = -(2 << 40)
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_sint32 = -3
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_sint64 = -(4 << 40)
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_sfixed32 = -5
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_sfixed64 = -(6 << 40)
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllTypes.FromString(
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        first_proto.SerializeToString())
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testParseTruncated(self):
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This test is only applicable for the Python implementation of the API.
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() != 'python':
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllTypes()
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(first_proto)
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for truncation_point in xrange(len(serialized) + 1):
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      try:
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        second_proto = unittest_pb2.TestAllTypes()
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unknown_fields = unittest_pb2.TestEmptyMessage()
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pos = second_proto._InternalParse(serialized, 0, truncation_point)
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # If we didn't raise an error then we read exactly the amount expected.
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEqual(truncation_point, pos)
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Parsing to unknown fields should not throw if parsing to known fields
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # did not.
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        try:
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pos2 = unknown_fields._InternalParse(serialized, 0, truncation_point)
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self.assertEqual(truncation_point, pos2)
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        except message.DecodeError:
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self.fail('Parsing unknown fields failed when parsing known fields '
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'did not.')
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      except message.DecodeError:
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Parsing unknown fields should also fail.
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertRaises(message.DecodeError, unknown_fields._InternalParse,
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          serialized, 0, truncation_point)
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCanonicalSerializationOrder(self):
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = more_messages_pb2.OutOfOrderFields()
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # These are also their tag numbers.  Even though we're setting these in
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # reverse-tag order AND they're listed in reverse tag-order in the .proto
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # file, they should nonetheless be serialized in tag order.
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_sint32 = 5
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[more_messages_pb2.optional_uint64] = 4
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_uint32 = 3
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[more_messages_pb2.optional_int64] = 2
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 1
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.ByteSize(), len(serialized))
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d = _MiniDecoder(serialized)
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadTag = d.ReadFieldNumberAndWireType
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((1, wire_format.WIRETYPE_VARINT), ReadTag())
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, d.ReadInt32())
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((2, wire_format.WIRETYPE_VARINT), ReadTag())
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, d.ReadInt64())
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((3, wire_format.WIRETYPE_VARINT), ReadTag())
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, d.ReadUInt32())
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((4, wire_format.WIRETYPE_VARINT), ReadTag())
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, d.ReadUInt64())
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((5, wire_format.WIRETYPE_VARINT), ReadTag())
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, d.ReadSInt32())
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCanonicalSerializationOrderSameAsCpp(self):
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Copy of the same test we use for C++.
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestFieldOrderings()
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFieldsAndExtensions(proto)
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.ExpectAllFieldsAndExtensionsInOrder(serialized)
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromStringWhenFieldsAlreadySet(self):
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllTypes()
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.repeated_string.append('foobar')
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_int32 = 23
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_nested_message.bb = 42
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllTypes()
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.repeated_string.append('baz')
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.optional_int32 = 100
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.optional_nested_message.bb = 999
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.MergeFromString(serialized)
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we append to repeated fields.
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(['baz', 'foobar'], list(second_proto.repeated_string))
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we overwrite nonrepeatd scalars.
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, second_proto.optional_int32)
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we recursively call MergeFromString() on
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # submessages.
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(42, second_proto.optional_nested_message.bb)
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMessageSetWireFormat(self):
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_mset_pb2.TestMessageSet()
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message2 = unittest_mset_pb2.TestMessageSetExtension2
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension1 = extension_message1.message_set_extension
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension2 = extension_message2.message_set_extension
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension1].i = 123
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension2].str = 'foo'
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Serialize using the MessageSet wire format (this is specified in the
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # .proto file).
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raw = unittest_mset_pb2.RawMessageSet()
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(False,
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     raw.DESCRIPTOR.GetOptions().message_set_wire_format)
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raw.MergeFromString(serialized)
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, len(raw.item))
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = unittest_mset_pb2.TestMessageSetExtension1()
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.MergeFromString(raw.item[0].message)
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(123, message1.i)
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2 = unittest_mset_pb2.TestMessageSetExtension2()
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.MergeFromString(raw.item[1].message)
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('foo', message2.str)
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Deserialize using the MessageSet wire format.
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_mset_pb2.TestMessageSet()
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFromString(serialized)
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(123, proto2.Extensions[extension1].i)
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('foo', proto2.Extensions[extension2].str)
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check byte size.
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto2.ByteSize(), len(serialized))
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.ByteSize(), len(serialized))
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMessageSetWireFormatUnknownExtension(self):
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Create a message using the message set wire format with an unknown
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # message.
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raw = unittest_mset_pb2.RawMessageSet()
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Add an item.
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item = raw.item.add()
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type_id = 1545008
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = unittest_mset_pb2.TestMessageSetExtension1()
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.i = 12345
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.message = message1.SerializeToString()
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Add a second, unknown extension.
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item = raw.item.add()
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type_id = 1545009
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = unittest_mset_pb2.TestMessageSetExtension1()
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.i = 12346
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.message = message1.SerializeToString()
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Add another unknown extension.
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item = raw.item.add()
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type_id = 1545010
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = unittest_mset_pb2.TestMessageSetExtension2()
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.str = 'foo'
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.message = message1.SerializeToString()
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = raw.SerializeToString()
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Parse message using the message set wire format.
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_mset_pb2.TestMessageSet()
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.MergeFromString(serialized)
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check that the message parsed well.
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension1 = extension_message1.message_set_extension
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(12345, proto.Extensions[extension1].i)
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testUnknownFields(self):
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(proto)
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The empty message should be parsable with all of the fields
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # unknown.
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestEmptyMessage()
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Parsing this message should succeed.
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFromString(serialized)
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Now test with a int64 field set.
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int64 = 0x0fffffffffffffff
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The empty message should be parsable with all of the fields
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # unknown.
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestEmptyMessage()
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Parsing this message should succeed.
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFromString(serialized)
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _CheckRaises(self, exc_class, callable_obj, exception):
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """This method checks if the excpetion type and message are as expected."""
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callable_obj()
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except exc_class, ex:
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Check if the exception message is the right one.
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(exception, str(ex))
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raise self.failureException('%s not raised' % str(exc_class))
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeUninitialized(self):
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequired()
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message.EncodeError,
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proto.SerializeToString,
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Message is missing required fields: a,b,c')
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't raise exceptions.
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    partial = proto.SerializePartialToString()
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.a = 1
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message.EncodeError,
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proto.SerializeToString,
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Message is missing required fields: b,c')
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't raise exceptions.
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    partial = proto.SerializePartialToString()
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.b = 2
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message.EncodeError,
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proto.SerializeToString,
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Message is missing required fields: c')
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't raise exceptions.
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    partial = proto.SerializePartialToString()
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.c = 3
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't raise exceptions.
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    partial = proto.SerializePartialToString()
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestRequired()
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFromString(serialized)
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.a)
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto2.b)
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, proto2.c)
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.ParseFromString(partial)
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.a)
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto2.b)
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, proto2.c)
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeUninitializedSubMessage(self):
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequiredForeign()
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Sub-message doesn't exist yet, so this succeeds.
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializeToString()
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.a = 1
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message.EncodeError,
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proto.SerializeToString,
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Message is missing required fields: '
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'optional_message.b,optional_message.c')
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.b = 2
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.c = 3
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializeToString()
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message.add().a = 1
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message.add().b = 2
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message.EncodeError,
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proto.SerializeToString,
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Message is missing required fields: '
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'repeated_message[0].b,repeated_message[0].c,'
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'repeated_message[1].a,repeated_message[1].c')
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message[0].b = 2
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message[0].c = 3
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message[1].a = 1
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message[1].c = 3
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializeToString()
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeAllPackedFields(self):
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestPackedTypes()
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestPackedTypes()
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllPackedFields(first_proto)
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto.ByteSize(), len(serialized))
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bytes_read = second_proto.MergeFromString(serialized)
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(second_proto.ByteSize(), bytes_read)
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeAllPackedExtensions(self):
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestPackedExtensions()
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestPackedExtensions()
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllPackedExtensions(first_proto)
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bytes_read = second_proto.MergeFromString(serialized)
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(second_proto.ByteSize(), bytes_read)
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergePackedFromStringWhenSomeFieldsAlreadySet(self):
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestPackedTypes()
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.packed_int32.extend([1, 2])
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.packed_double.append(3.0)
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestPackedTypes()
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.packed_int32.append(3)
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.packed_double.extend([1.0, 2.0])
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.packed_sint32.append(4)
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.MergeFromString(serialized)
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([3, 1, 2], second_proto.packed_int32)
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([1.0, 2.0, 3.0], second_proto.packed_double)
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([4], second_proto.packed_sint32)
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPackedFieldsWireFormat(self):
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestPackedTypes()
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.packed_int32.extend([1, 2, 150, 3])  # 1 + 1 + 2 + 1 bytes
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.packed_double.extend([1.0, 1000.0])  # 8 + 8 bytes
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.packed_float.append(2.0)             # 4 bytes, will be before double
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.ByteSize(), len(serialized))
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d = _MiniDecoder(serialized)
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadTag = d.ReadFieldNumberAndWireType
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((90, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1+1+1+2, d.ReadInt32())
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, d.ReadInt32())
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, d.ReadInt32())
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(150, d.ReadInt32())
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, d.ReadInt32())
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((100, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, d.ReadInt32())
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2.0, d.ReadFloat())
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((101, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(8+8, d.ReadInt32())
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1.0, d.ReadDouble())
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1000.0, d.ReadDouble())
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(d.EndOfStream())
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testParsePackedFromUnpacked(self):
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unpacked = unittest_pb2.TestUnpackedTypes()
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllUnpackedFields(unpacked)
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    packed = unittest_pb2.TestPackedTypes()
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    packed.MergeFromString(unpacked.SerializeToString())
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected = unittest_pb2.TestPackedTypes()
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllPackedFields(expected)
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(expected, packed)
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testParseUnpackedFromPacked(self):
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    packed = unittest_pb2.TestPackedTypes()
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllPackedFields(packed)
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unpacked = unittest_pb2.TestUnpackedTypes()
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unpacked.MergeFromString(packed.SerializeToString())
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected = unittest_pb2.TestUnpackedTypes()
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllUnpackedFields(expected)
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(expected, unpacked)
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testFieldNumbers(self):
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1)
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1)
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16)
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18)
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21)
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31)
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46)
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48)
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51)
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testExtensionFieldNumbers(self):
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestRequired.single.number, 1000)
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestRequired.SINGLE_FIELD_NUMBER, 1000)
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestRequired.multi.number, 1001)
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestRequired.MULTI_FIELD_NUMBER, 1001)
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.optional_int32_extension.number, 1)
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1)
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.optionalgroup_extension.number, 16)
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16)
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.optional_nested_message_extension.number, 18)
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18)
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.optional_nested_enum_extension.number, 21)
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER,
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      21)
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.repeated_int32_extension.number, 31)
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31)
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.repeatedgroup_extension.number, 46)
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46)
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.repeated_nested_message_extension.number, 48)
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48)
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.repeated_nested_enum_extension.number, 51)
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER,
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      51)
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInitKwargs(self):
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_int32=1,
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_string='foo',
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_bool=True,
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_bytes='bar',
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_nested_message=unittest_pb2.TestAllTypes.NestedMessage(bb=1),
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_foreign_message=unittest_pb2.ForeignMessage(c=1),
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_nested_enum=unittest_pb2.TestAllTypes.FOO,
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_foreign_enum=unittest_pb2.FOREIGN_FOO,
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_int32=[1, 2, 3])
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.IsInitialized())
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_int32'))
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_string'))
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_bool'))
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_bytes'))
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_foreign_message'))
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_enum'))
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_foreign_enum'))
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_int32)
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('foo', proto.optional_string)
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(True, proto.optional_bool)
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('bar', proto.optional_bytes)
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_nested_message.bb)
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_foreign_message.c)
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.FOO,
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     proto.optional_nested_enum)
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.FOREIGN_FOO, proto.optional_foreign_enum)
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([1, 2, 3], proto.repeated_int32)
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInitArgsUnknownFieldName(self):
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def InitalizeEmptyMessageWithExtraKeywordArg():
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unused_proto = unittest_pb2.TestEmptyMessage(unknown='unknown')
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(ValueError,
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      InitalizeEmptyMessageWithExtraKeywordArg,
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'Protocol message has no "unknown" field.')
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInitRequiredKwargs(self):
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequired(a=1, b=1, c=1)
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.IsInitialized())
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('a'))
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('b'))
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('c'))
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('dummy2'))
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.a)
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.b)
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.c)
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInitRequiredForeignKwargs(self):
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequiredForeign(
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_message=unittest_pb2.TestRequired(a=1, b=1, c=1))
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.IsInitialized())
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_message'))
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.optional_message.IsInitialized())
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.optional_message.HasField('a'))
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.optional_message.HasField('b'))
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.optional_message.HasField('c'))
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.optional_message.HasField('dummy2'))
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestRequired(a=1, b=1, c=1),
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     proto.optional_message)
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_message.a)
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_message.b)
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_message.c)
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInitRepeatedKwargs(self):
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(repeated_int32=[1, 2, 3])
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.IsInitialized())
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.repeated_int32[0])
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto.repeated_int32[1])
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, proto.repeated_int32[2])
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OptionsTest(unittest.TestCase):
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMessageOptions(self):
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_mset_pb2.TestMessageSet()
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(True,
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     proto.DESCRIPTOR.GetOptions().message_set_wire_format)
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(False,
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     proto.DESCRIPTOR.GetOptions().message_set_wire_format)
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPackedOptions(self):
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 1
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_double = 3.0
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for field_descriptor, _ in proto.ListFields():
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(False, field_descriptor.GetOptions().packed)
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestPackedTypes()
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.packed_int32.append(1)
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.packed_double.append(3.0)
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for field_descriptor, _ in proto.ListFields():
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(True, field_descriptor.GetOptions().packed)
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(reflection._FieldDescriptor.LABEL_REPEATED,
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       field_descriptor.label)
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unittest.main()
2422