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)
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochimport gc
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import operator
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import struct
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import unittest_import_pb2
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import unittest_mset_pb2
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import unittest_pb2
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import descriptor_pb2
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import descriptor
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import message
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import reflection
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import api_implementation
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import more_extensions_pb2
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import more_messages_pb2
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import wire_format
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import test_util
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import decoder
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class _MiniDecoder(object):
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Decodes a stream of values from a string.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Once upon a time we actually had a class called decoder.Decoder.  Then we
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  got rid of it during a redesign that made decoding much, much faster overall.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  But a couple tests in this file used it to check that the serialized form of
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  a message was correct.  So, this class implements just the methods that were
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  used by said tests, so that we don't have to rewrite the tests.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, bytes):
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._bytes = bytes
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._pos = 0
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ReadVarint(self):
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result, self._pos = decoder._DecodeVarint(self._bytes, self._pos)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadInt32 = ReadVarint
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadInt64 = ReadVarint
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadUInt32 = ReadVarint
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadUInt64 = ReadVarint
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ReadSInt64(self):
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return wire_format.ZigZagDecode(self.ReadVarint())
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadSInt32 = ReadSInt64
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ReadFieldNumberAndWireType(self):
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return wire_format.UnpackTag(self.ReadVarint())
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ReadFloat(self):
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = struct.unpack("<f", self._bytes[self._pos:self._pos+4])[0]
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._pos += 4
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ReadDouble(self):
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = struct.unpack("<d", self._bytes[self._pos:self._pos+8])[0]
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._pos += 8
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def EndOfStream(self):
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self._pos == len(self._bytes)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ReflectionTest(unittest.TestCase):
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def assertListsEqual(self, values, others):
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(len(values), len(others))
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i in range(len(values)):
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(values[i], others[i])
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testScalarConstructor(self):
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Constructor with only scalar types should succeed.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_int32=24,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_double=54.321,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_string='optional_string')
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(24, proto.optional_int32)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(54.321, proto.optional_double)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('optional_string', proto.optional_string)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalarConstructor(self):
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Constructor with only repeated scalar types should succeed.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_int32=[1, 2, 3, 4],
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_double=[1.23, 54.321],
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_bool=[True, False, False],
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_string=["optional_string"])
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([1, 2, 3, 4], list(proto.repeated_int32))
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([1.23, 54.321], list(proto.repeated_double))
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([True, False, False], list(proto.repeated_bool))
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(["optional_string"], list(proto.repeated_string))
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedCompositeConstructor(self):
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Constructor with only repeated composite types should succeed.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_nested_message=[
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.NestedMessage(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                bb=unittest_pb2.TestAllTypes.FOO),
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.NestedMessage(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                bb=unittest_pb2.TestAllTypes.BAR)],
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_foreign_message=[
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=-43),
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=45324),
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=12)],
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeatedgroup=[
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.RepeatedGroup(),
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.RepeatedGroup(a=1),
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.RepeatedGroup(a=2)])
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [unittest_pb2.TestAllTypes.NestedMessage(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bb=unittest_pb2.TestAllTypes.FOO),
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.TestAllTypes.NestedMessage(
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             bb=unittest_pb2.TestAllTypes.BAR)],
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        list(proto.repeated_nested_message))
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [unittest_pb2.ForeignMessage(c=-43),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.ForeignMessage(c=45324),
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.ForeignMessage(c=12)],
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        list(proto.repeated_foreign_message))
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [unittest_pb2.TestAllTypes.RepeatedGroup(),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.TestAllTypes.RepeatedGroup(a=1),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.TestAllTypes.RepeatedGroup(a=2)],
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        list(proto.repeatedgroup))
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMixedConstructor(self):
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Constructor with only mixed types should succeed.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_int32=24,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_string='optional_string',
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_double=[1.23, 54.321],
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_bool=[True, False, False],
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_nested_message=[
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.NestedMessage(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                bb=unittest_pb2.TestAllTypes.FOO),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.TestAllTypes.NestedMessage(
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                bb=unittest_pb2.TestAllTypes.BAR)],
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_foreign_message=[
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=-43),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=45324),
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unittest_pb2.ForeignMessage(c=12)])
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(24, proto.optional_int32)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('optional_string', proto.optional_string)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([1.23, 54.321], list(proto.repeated_double))
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([True, False, False], list(proto.repeated_bool))
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [unittest_pb2.TestAllTypes.NestedMessage(
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bb=unittest_pb2.TestAllTypes.FOO),
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.TestAllTypes.NestedMessage(
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             bb=unittest_pb2.TestAllTypes.BAR)],
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        list(proto.repeated_nested_message))
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [unittest_pb2.ForeignMessage(c=-43),
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.ForeignMessage(c=45324),
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unittest_pb2.ForeignMessage(c=12)],
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        list(proto.repeated_foreign_message))
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testConstructorTypeError(self):
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, optional_int32="foo")
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, optional_string=1234)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, optional_nested_message=1234)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_int32=1234)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_int32=["foo"])
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_string=1234)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_string=[1234])
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=1234)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=[1234])
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testConstructorInvalidatesCachedByteSize(self):
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes(optional_int32 = 12)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(2, message.ByteSize())
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_nested_message = unittest_pb2.TestAllTypes.NestedMessage())
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(3, message.ByteSize())
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes(repeated_int32 = [12])
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(3, message.ByteSize())
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes(
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_nested_message = [unittest_pb2.TestAllTypes.NestedMessage()])
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(3, message.ByteSize())
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSimpleHasBits(self):
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test a scalar.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_int32'))
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_int32)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # HasField() shouldn't be true if all we've done is
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # read the default value.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_int32'))
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 1
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Setting a value however *should* set the "has" bit.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_int32'))
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('optional_int32')
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # And clearing that value should unset the "has" bit.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_int32'))
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHasBitsWithSinglyNestedScalar(self):
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Helper used to test foreign messages and groups.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # composite_field_name should be the name of a non-repeated
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # composite (i.e., foreign or group) field in TestAllTypes,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # and scalar_field_name should be the name of an integer-valued
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # scalar field within that composite.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # I never thought I'd miss C++ macros and templates so much. :(
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This helper is semantically just:
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert proto.composite_field.scalar_field == 0
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.composite_field.HasField('scalar_field')
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.HasField('composite_field')
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   proto.composite_field.scalar_field = 10
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   old_composite_field = proto.composite_field
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert proto.composite_field.scalar_field == 10
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert proto.composite_field.HasField('scalar_field')
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert proto.HasField('composite_field')
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   proto.ClearField('composite_field')
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.composite_field.HasField('scalar_field')
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.HasField('composite_field')
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert proto.composite_field.scalar_field == 0
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   # Now ensure that ClearField('composite_field') disconnected
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   # the old field object from the object tree...
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert old_composite_field is not proto.composite_field
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   old_composite_field.scalar_field = 20
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.composite_field.HasField('scalar_field')
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   assert not proto.HasField('composite_field')
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def TestCompositeHasBits(composite_field_name, scalar_field_name):
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto = unittest_pb2.TestAllTypes()
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # First, check that we can get the scalar value, and see that it's the
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # default (0), but that proto.HasField('omposite') and
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # proto.composite.HasField('scalar') will still return False.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      composite_field = getattr(proto, composite_field_name)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      original_scalar_value = getattr(composite_field, scalar_field_name)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(0, original_scalar_value)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Assert that the composite object does not "have" the scalar.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not composite_field.HasField(scalar_field_name))
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Assert that proto does not "have" the composite field.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not proto.HasField(composite_field_name))
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Now set the scalar within the composite field.  Ensure that the setting
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # is reflected, and that proto.HasField('composite') and
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # proto.composite.HasField('scalar') now both return True.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_val = 20
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setattr(composite_field, scalar_field_name, new_val)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(new_val, getattr(composite_field, scalar_field_name))
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Hold on to a reference to the current composite_field object.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_composite_field = composite_field
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Assert that the has methods now return true.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(composite_field.HasField(scalar_field_name))
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(proto.HasField(composite_field_name))
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Now call the clear method...
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ClearField(composite_field_name)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # ...and ensure that the "has" bits are all back to False...
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      composite_field = getattr(proto, composite_field_name)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not composite_field.HasField(scalar_field_name))
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not proto.HasField(composite_field_name))
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # ...and ensure that the scalar field has returned to its default.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(0, getattr(composite_field, scalar_field_name))
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(old_composite_field is not composite_field)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setattr(old_composite_field, scalar_field_name, new_val)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not composite_field.HasField(scalar_field_name))
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(not proto.HasField(composite_field_name))
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(0, getattr(composite_field, scalar_field_name))
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test simple, single-level nesting when we set a scalar.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompositeHasBits('optionalgroup', 'a')
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompositeHasBits('optional_nested_message', 'bb')
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompositeHasBits('optional_foreign_message', 'c')
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompositeHasBits('optional_import_message', 'd')
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testReferencesToNestedMessage(self):
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested = proto.optional_nested_message
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # A previous version had a bug where this would raise an exception when
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # hitting a now-dead weak reference.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested.bb = 23
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDisconnectingNestedMessageBeforeSettingField(self):
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested = proto.optional_nested_message
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('optional_nested_message')  # Should disconnect from parent
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(nested is not proto.optional_nested_message)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested.bb = 23
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_nested_message'))
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_nested_message.bb)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testGetDefaultMessageAfterDisconnectingDefaultMessage(self):
352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto = unittest_pb2.TestAllTypes()
353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    nested = proto.optional_nested_message
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto.ClearField('optional_nested_message')
355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    del proto
356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    del nested
357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # Force a garbage collect so that the underlying CMessages are freed along
358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # with the Messages they point to. This is to make sure we're not deleting
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # default message instances.
360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gc.collect()
361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto = unittest_pb2.TestAllTypes()
362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    nested = proto.optional_nested_message
363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testDisconnectingNestedMessageAfterSettingField(self):
365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto = unittest_pb2.TestAllTypes()
366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    nested = proto.optional_nested_message
367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    nested.bb = 5
368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(proto.HasField('optional_nested_message'))
369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto.ClearField('optional_nested_message')  # Should disconnect from parent
370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(5, nested.bb)
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(0, proto.optional_nested_message.bb)
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(nested is not proto.optional_nested_message)
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    nested.bb = 23
374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(not proto.HasField('optional_nested_message'))
375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(0, proto.optional_nested_message.bb)
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testDisconnectingNestedMessageBeforeGettingField(self):
378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto = unittest_pb2.TestAllTypes()
379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(not proto.HasField('optional_nested_message'))
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto.ClearField('optional_nested_message')
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(not proto.HasField('optional_nested_message'))
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testDisconnectingNestedMessageAfterMerge(self):
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # This test exercises the code path that does not use ReleaseMessage().
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # The underlying fear is that if we use ReleaseMessage() incorrectly,
386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # we will have memory leaks.  It's hard to check that that doesn't happen,
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # but at least we can exercise that code path to make sure it works.
388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto1 = unittest_pb2.TestAllTypes()
389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto2 = unittest_pb2.TestAllTypes()
390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto2.optional_nested_message.bb = 5
391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto1.MergeFrom(proto2)
392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(proto1.HasField('optional_nested_message'))
393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto1.ClearField('optional_nested_message')
394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(not proto1.HasField('optional_nested_message'))
395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testDisconnectingLazyNestedMessage(self):
397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # This test exercises releasing a nested message that is lazy. This test
398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # only exercises real code in the C++ implementation as Python does not
399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # support lazy parsing, but the current C++ implementation results in
400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # memory corruption and a crash.
401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if api_implementation.Type() != 'python':
402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return
403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto = unittest_pb2.TestAllTypes()
404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto.optional_lazy_message.bb = 5
405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto.ClearField('optional_lazy_message')
406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    del proto
407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gc.collect()
408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHasBitsWhenModifyingRepeatedFields(self):
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test nesting when we add an element to a repeated field in a submessage.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestNestedMessageHasBits()
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.nestedmessage_repeated_int32.append(5)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [5], proto.optional_nested_message.nestedmessage_repeated_int32)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Do the same test, but with a repeated composite field within the
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # submessage.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('optional_nested_message')
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_nested_message'))
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.nestedmessage_repeated_foreignmessage.add()
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHasBitsForManyLevelsOfNesting(self):
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test nesting many levels deep.
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    recursive_proto = unittest_pb2.TestMutualRecursionA()
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not recursive_proto.HasField('bb'))
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, recursive_proto.bb.a.bb.a.bb.optional_int32)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not recursive_proto.HasField('bb'))
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    recursive_proto.bb.a.bb.a.bb.optional_int32 = 5
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, recursive_proto.bb.a.bb.a.bb.optional_int32)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.HasField('bb'))
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.bb.HasField('a'))
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.bb.a.HasField('bb'))
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.bb.a.bb.HasField('a'))
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.bb.a.bb.a.HasField('bb'))
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not recursive_proto.bb.a.bb.a.bb.HasField('a'))
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(recursive_proto.bb.a.bb.a.bb.HasField('optional_int32'))
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingularListFields(self):
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_fixed32 = 1
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 5
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_string = 'foo'
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Access sub-message but don't set it yet.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested_message = proto.optional_nested_message
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 5),
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1),
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo') ],
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.bb = 123
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 5),
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1),
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo'),
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['optional_nested_message' ],
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             nested_message) ],
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedListFields(self):
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_fixed32.append(1)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(5)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(11)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_string.extend(['foo', 'bar'])
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_string.extend([])
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_string.append('baz')
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_string.extend(str(x) for x in xrange(2))
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 21
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_bool  # Access but don't set anything; should not be listed.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 21),
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['repeated_int32'  ], [5, 11]),
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['repeated_fixed32'], [1]),
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['repeated_string' ],
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ['foo', 'bar', 'baz', '0', '1']) ],
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingularListExtensions(self):
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.optional_fixed32_extension] = 1
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.optional_int32_extension  ] = 5
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.optional_string_extension ] = 'foo'
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (unittest_pb2.optional_int32_extension  , 5),
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.optional_fixed32_extension, 1),
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.optional_string_extension , 'foo') ],
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedListExtensions(self):
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_fixed32_extension].append(1)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_int32_extension  ].append(5)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_int32_extension  ].append(11)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_string_extension ].append('foo')
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_string_extension ].append('bar')
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.repeated_string_extension ].append('baz')
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[unittest_pb2.optional_int32_extension  ] = 21
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (unittest_pb2.optional_int32_extension  , 21),
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.repeated_int32_extension  , [5, 11]),
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.repeated_fixed32_extension, [1]),
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.repeated_string_extension , ['foo', 'bar', 'baz']) ],
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testListFieldsAndExtensions(self):
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestFieldOrderings()
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFieldsAndExtensions(proto)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unittest_pb2.my_extension_int
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ (proto.DESCRIPTOR.fields_by_name['my_int'   ], 1),
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.my_extension_int               , 23),
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['my_string'], 'foo'),
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unittest_pb2.my_extension_string            , 'bar'),
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (proto.DESCRIPTOR.fields_by_name['my_float' ], 1.0) ],
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ListFields())
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDefaultValues(self):
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_int32)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_int64)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_uint32)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_uint64)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_sint32)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_sint64)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_fixed32)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_fixed64)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_sfixed32)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_sfixed64)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0.0, proto.optional_float)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0.0, proto.optional_double)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(False, proto.optional_bool)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('', proto.optional_string)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('', proto.optional_bytes)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(41, proto.default_int32)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(42, proto.default_int64)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(43, proto.default_uint32)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(44, proto.default_uint64)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(-45, proto.default_sint32)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(46, proto.default_sint64)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(47, proto.default_fixed32)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(48, proto.default_fixed64)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(49, proto.default_sfixed32)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(-50, proto.default_sfixed64)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(51.5, proto.default_float)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(52e3, proto.default_double)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(True, proto.default_bool)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('hello', proto.default_string)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('world', proto.default_bytes)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.BAR, proto.default_nested_enum)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.FOREIGN_BAR, proto.default_foreign_enum)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_import_pb2.IMPORT_BAR,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     proto.default_import_enum)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestExtremeDefaultValues()
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(u'\u1234', proto.utf8_string)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHasFieldWithUnknownFieldName(self):
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(ValueError, proto.HasField, 'nonexistent_field')
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testClearFieldWithUnknownFieldName(self):
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(ValueError, proto.ClearField, 'nonexistent_field')
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDisallowedAssignments(self):
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # It's illegal to assign values directly to repeated fields
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # or to nonrepeated composite fields.  Ensure that this fails.
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Repeated fields.
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', 10)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Lists shouldn't work, either.
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', [10])
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Composite fields.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'optional_nested_message', 23)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Assignment to a repeated nested message field without specifying
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # the index in the array of nested messages.
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto.repeated_nested_message,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'bb', 34)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Assignment to an attribute of a repeated field.
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto.repeated_float,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'some_attribute', 34)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # proto.nonexistent_field = 23 should fail as well.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(AttributeError, setattr, proto, 'nonexistent_field', 23)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingleScalarTypeSafety(self):
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, setattr, proto, 'optional_int32', 1.1)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, setattr, proto, 'optional_int32', 'foo')
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, setattr, proto, 'optional_string', 10)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, setattr, proto, 'optional_bytes', 10)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingleScalarBoundsChecking(self):
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def TestMinAndMaxIntegers(field_name, expected_min, expected_max):
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pb = unittest_pb2.TestAllTypes()
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setattr(pb, field_name, expected_min)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(expected_min, getattr(pb, field_name))
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setattr(pb, field_name, expected_max)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(expected_max, getattr(pb, field_name))
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertRaises(ValueError, setattr, pb, field_name, expected_min - 1)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertRaises(ValueError, setattr, pb, field_name, expected_max + 1)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestMinAndMaxIntegers('optional_int32', -(1 << 31), (1 << 31) - 1)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestMinAndMaxIntegers('optional_uint32', 0, 0xffffffff)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestMinAndMaxIntegers('optional_int64', -(1 << 63), (1 << 63) - 1)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestMinAndMaxIntegers('optional_uint64', 0, 0xffffffffffffffff)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb = unittest_pb2.TestAllTypes()
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb.optional_nested_enum = 1
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, pb.optional_nested_enum)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Invalid enum values.
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb.optional_nested_enum = 0
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, pb.optional_nested_enum)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bytes_size_before = pb.ByteSize()
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb.optional_nested_enum = 4
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, pb.optional_nested_enum)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb.optional_nested_enum = 0
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, pb.optional_nested_enum)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Make sure that setting the same enum field doesn't just add unknown
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # fields (but overwrites them).
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(bytes_size_before, pb.ByteSize())
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Is the invalid value preserved after serialization?
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = pb.SerializeToString()
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb2 = unittest_pb2.TestAllTypes()
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pb2.ParseFromString(serialized)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, pb2.optional_nested_enum)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(pb, pb2)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalarTypeSafety(self):
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_int32.append, 1.1)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_int32.append, 'foo')
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_string, 10)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_bytes, 10)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(10)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[0] = 23
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_int32.__setitem__, 500, 23)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_int32.__setitem__, 0, 'abc')
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Repeated enums tests.
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #proto.repeated_nested_enum.append(0)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingleScalarGettersAndSetters(self):
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_int32)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 1
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_int32)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_uint64 = 0xffffffffffff
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0xffffffffffff, proto.optional_uint64)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_uint64 = 0xffffffffffffffff
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0xffffffffffffffff, proto.optional_uint64)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # TODO(robinson): Test all other scalar field types.
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSingleScalarClearField(self):
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Should be allowed to clear something that's not there (a no-op).
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('optional_int32')
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 1
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_int32'))
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('optional_int32')
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.optional_int32)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('optional_int32'))
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # TODO(robinson): Test all other scalar field types.
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testEnums(self):
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.FOO)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, unittest_pb2.TestAllTypes.FOO)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto.BAR)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, unittest_pb2.TestAllTypes.BAR)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, proto.BAZ)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
686ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testEnum_Name(self):
687ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual('FOREIGN_FOO',
688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_FOO))
689ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual('FOREIGN_BAR',
690ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_BAR))
691ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual('FOREIGN_BAZ',
692ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_BAZ))
693ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertRaises(ValueError,
694ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      unittest_pb2.ForeignEnum.Name, 11312)
695ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
696ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto = unittest_pb2.TestAllTypes()
697ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual('FOO',
698ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     proto.NestedEnum.Name(proto.FOO))
699ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual('FOO',
700ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.TestAllTypes.NestedEnum.Name(proto.FOO))
701ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual('BAR',
702ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     proto.NestedEnum.Name(proto.BAR))
703ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual('BAR',
704ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.TestAllTypes.NestedEnum.Name(proto.BAR))
705ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual('BAZ',
706ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     proto.NestedEnum.Name(proto.BAZ))
707ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual('BAZ',
708ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.TestAllTypes.NestedEnum.Name(proto.BAZ))
709ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertRaises(ValueError,
710ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      proto.NestedEnum.Name, 11312)
711ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertRaises(ValueError,
712ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      unittest_pb2.TestAllTypes.NestedEnum.Name, 11312)
713ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
714ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testEnum_Value(self):
715ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(unittest_pb2.FOREIGN_FOO,
716ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.ForeignEnum.Value('FOREIGN_FOO'))
717ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(unittest_pb2.FOREIGN_BAR,
718ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.ForeignEnum.Value('FOREIGN_BAR'))
719ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(unittest_pb2.FOREIGN_BAZ,
720ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.ForeignEnum.Value('FOREIGN_BAZ'))
721ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertRaises(ValueError,
722ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      unittest_pb2.ForeignEnum.Value, 'FO')
723ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
724ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto = unittest_pb2.TestAllTypes()
725ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(proto.FOO,
726ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     proto.NestedEnum.Value('FOO'))
727ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(proto.FOO,
728ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.TestAllTypes.NestedEnum.Value('FOO'))
729ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(proto.BAR,
730ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     proto.NestedEnum.Value('BAR'))
731ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(proto.BAR,
732ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.TestAllTypes.NestedEnum.Value('BAR'))
733ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(proto.BAZ,
734ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     proto.NestedEnum.Value('BAZ'))
735ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(proto.BAZ,
736ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.TestAllTypes.NestedEnum.Value('BAZ'))
737ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertRaises(ValueError,
738ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      proto.NestedEnum.Value, 'Foo')
739ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertRaises(ValueError,
740ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      unittest_pb2.TestAllTypes.NestedEnum.Value, 'Foo')
741ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
742ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testEnum_KeysAndValues(self):
743ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(['FOREIGN_FOO', 'FOREIGN_BAR', 'FOREIGN_BAZ'],
744ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.ForeignEnum.keys())
745ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual([4, 5, 6],
746ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.ForeignEnum.values())
747ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual([('FOREIGN_FOO', 4), ('FOREIGN_BAR', 5),
748ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      ('FOREIGN_BAZ', 6)],
749ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     unittest_pb2.ForeignEnum.items())
750ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
751ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto = unittest_pb2.TestAllTypes()
752ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(['FOO', 'BAR', 'BAZ'], proto.NestedEnum.keys())
753ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual([1, 2, 3], proto.NestedEnum.values())
754ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual([('FOO', 1), ('BAR', 2), ('BAZ', 3)],
755ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     proto.NestedEnum.items())
756ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalars(self):
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.repeated_int32)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(proto.repeated_int32))
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(5)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(10)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(15)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.repeated_int32)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, len(proto.repeated_int32))
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 10, 15], proto.repeated_int32)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test single retrieval.
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, proto.repeated_int32[0])
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(15, proto.repeated_int32[-1])
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test out-of-bounds indices.
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_int32.__getitem__, 1234)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_int32.__getitem__, -1234)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test incorrect types passed to __getitem__.
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_int32.__getitem__, 'foo')
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_int32.__getitem__, None)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test single assignment.
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[1] = 20
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 20, 15], proto.repeated_int32)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test insertion.
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.insert(1, 25)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 25, 20, 15], proto.repeated_int32)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice retrieval.
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(30)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([25, 20, 15], proto.repeated_int32[1:4])
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 25, 20, 15, 30], proto.repeated_int32[:])
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice assignment with an iterator
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[1:4] = (i for i in xrange(3))
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 0, 1, 2, 30], proto.repeated_int32)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice assignment.
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[1:4] = [35, 40, 45]
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 35, 40, 45, 30], proto.repeated_int32)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test that we can use the field as an iterator.
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = []
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i in proto.repeated_int32:
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result.append(i)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 35, 40, 45, 30], result)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test single deletion.
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[2]
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 35, 45, 30], proto.repeated_int32)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice deletion.
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[2:]
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 35], proto.repeated_int32)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test extending.
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.extend([3, 13])
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([5, 35, 3, 13], proto.repeated_int32)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test clearing.
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('repeated_int32')
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.repeated_int32)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(proto.repeated_int32))
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(1)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.repeated_int32[-1])
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test assignment to a negative index.
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[-1] = 2
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto.repeated_int32[-1])
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test deletion at negative indices.
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32[:] = [0, 1, 2, 3]
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[-1]
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([0, 1, 2], proto.repeated_int32)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[-2]
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([0, 2], proto.repeated_int32)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_int32.__delitem__, -3)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_int32.__delitem__, 300)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[-2:-1]
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([2], proto.repeated_int32)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_int32[100:10000]
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([2], proto.repeated_int32)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalarsRemove(self):
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.repeated_int32)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(proto.repeated_int32))
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(5)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(10)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(5)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.append(5)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, len(proto.repeated_int32))
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.remove(5)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, len(proto.repeated_int32))
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(10, proto.repeated_int32[0])
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, proto.repeated_int32[1])
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, proto.repeated_int32[2])
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.remove(5)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, len(proto.repeated_int32))
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(10, proto.repeated_int32[0])
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, proto.repeated_int32[1])
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_int32.remove(10)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, len(proto.repeated_int32))
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, proto.repeated_int32[0])
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Remove a non-existent element.
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(ValueError, proto.repeated_int32.remove, 123)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedComposites(self):
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.repeated_nested_message)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(proto.repeated_nested_message))
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m0 = proto.repeated_nested_message.add()
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m1 = proto.repeated_nested_message.add()
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.repeated_nested_message)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, len(proto.repeated_nested_message))
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual([m0, m1], proto.repeated_nested_message)
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(isinstance(m0, unittest_pb2.TestAllTypes.NestedMessage))
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test out-of-bounds indices.
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__,
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      1234)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__,
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      -1234)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test incorrect types passed to __getitem__.
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__,
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'foo')
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__,
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      None)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice retrieval.
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m2 = proto.repeated_nested_message.add()
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m3 = proto.repeated_nested_message.add()
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m4 = proto.repeated_nested_message.add()
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual(
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [m1, m2, m3], proto.repeated_nested_message[1:4])
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual(
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [m0, m1, m2, m3, m4], proto.repeated_nested_message[:])
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual(
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [m0, m1], proto.repeated_nested_message[:2])
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual(
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [m2, m3, m4], proto.repeated_nested_message[2:])
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m0, proto.repeated_nested_message[0])
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual(
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [m0], proto.repeated_nested_message[:1])
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test that we can use the field as an iterator.
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = []
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i in proto.repeated_nested_message:
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result.append(i)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual([m0, m1, m2, m3, m4], result)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test single deletion.
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_nested_message[2]
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual([m0, m1, m3, m4], proto.repeated_nested_message)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test slice deletion.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del proto.repeated_nested_message[2:]
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListsEqual([m0, m1], proto.repeated_nested_message)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test extending.
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n1 = unittest_pb2.TestAllTypes.NestedMessage(bb=1)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n2 = unittest_pb2.TestAllTypes.NestedMessage(bb=2)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_nested_message.extend([n1,n2])
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, len(proto.repeated_nested_message))
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(n1, proto.repeated_nested_message[2])
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(n2, proto.repeated_nested_message[3])
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test clearing.
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ClearField('repeated_nested_message')
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.repeated_nested_message)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(proto.repeated_nested_message))
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test constructing an element while adding it.
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_nested_message.add(bb=23)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, len(proto.repeated_nested_message))
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, proto.repeated_nested_message[0].bb)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
948ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testRepeatedCompositeRemove(self):
949ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto = unittest_pb2.TestAllTypes()
950ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
951ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(0, len(proto.repeated_nested_message))
952ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    m0 = proto.repeated_nested_message.add()
953ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # Need to set some differentiating variable so m0 != m1 != m2:
954ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    m0.bb = len(proto.repeated_nested_message)
955ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    m1 = proto.repeated_nested_message.add()
956ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    m1.bb = len(proto.repeated_nested_message)
957ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(m0 != m1)
958ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    m2 = proto.repeated_nested_message.add()
959ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    m2.bb = len(proto.repeated_nested_message)
960ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertListsEqual([m0, m1, m2], proto.repeated_nested_message)
961ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
962ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(3, len(proto.repeated_nested_message))
963ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto.repeated_nested_message.remove(m0)
964ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(2, len(proto.repeated_nested_message))
965ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(m1, proto.repeated_nested_message[0])
966ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(m2, proto.repeated_nested_message[1])
967ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
968ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # Removing m0 again or removing None should raise error
969ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertRaises(ValueError, proto.repeated_nested_message.remove, m0)
970ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertRaises(ValueError, proto.repeated_nested_message.remove, None)
971ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(2, len(proto.repeated_nested_message))
972ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
973ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto.repeated_nested_message.remove(m2)
974ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(1, len(proto.repeated_nested_message))
975ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(m1, proto.repeated_nested_message[0])
976ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHandWrittenReflection(self):
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Hand written extensions are only supported by the pure-Python
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # implementation of the API.
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() != 'python':
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FieldDescriptor = descriptor.FieldDescriptor
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foo_field_descriptor = FieldDescriptor(
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name='foo_field', full_name='MyProto.foo_field',
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        index=0, number=1, type=FieldDescriptor.TYPE_INT64,
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cpp_type=FieldDescriptor.CPPTYPE_INT64,
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        label=FieldDescriptor.LABEL_OPTIONAL, default_value=0,
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        containing_type=None, message_type=None, enum_type=None,
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_extension=False, extension_scope=None,
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options=descriptor_pb2.FieldOptions())
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mydescriptor = descriptor.Descriptor(
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name='MyProto', full_name='MyProto', filename='ignored',
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        containing_type=None, nested_types=[], enum_types=[],
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fields=[foo_field_descriptor], extensions=[],
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options=descriptor_pb2.MessageOptions())
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class MyProtoClass(message.Message):
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DESCRIPTOR = mydescriptor
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __metaclass__ = reflection.GeneratedProtocolMessageType
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    myproto_instance = MyProtoClass()
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, myproto_instance.foo_field)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not myproto_instance.HasField('foo_field'))
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    myproto_instance.foo_field = 23
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, myproto_instance.foo_field)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(myproto_instance.HasField('foo_field'))
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1007ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testDescriptorProtoSupport(self):
1008ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # Hand written descriptors/reflection are only supported by the pure-Python
1009ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # implementation of the API.
1010ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if api_implementation.Type() != 'python':
1011ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return
1012ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1013ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    def AddDescriptorField(proto, field_name, field_type):
1014ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AddDescriptorField.field_index += 1
1015ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new_field = proto.field.add()
1016ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new_field.name = field_name
1017ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new_field.type = field_type
1018ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new_field.number = AddDescriptorField.field_index
1019ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new_field.label = descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL
1020ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1021ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    AddDescriptorField.field_index = 0
1022ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1023ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    desc_proto = descriptor_pb2.DescriptorProto()
1024ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    desc_proto.name = 'Car'
1025ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fdp = descriptor_pb2.FieldDescriptorProto
1026ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    AddDescriptorField(desc_proto, 'name', fdp.TYPE_STRING)
1027ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    AddDescriptorField(desc_proto, 'year', fdp.TYPE_INT64)
1028ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    AddDescriptorField(desc_proto, 'automatic', fdp.TYPE_BOOL)
1029ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    AddDescriptorField(desc_proto, 'price', fdp.TYPE_DOUBLE)
1030ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # Add a repeated field
1031ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    AddDescriptorField.field_index += 1
1032ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    new_field = desc_proto.field.add()
1033ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    new_field.name = 'owners'
1034ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    new_field.type = fdp.TYPE_STRING
1035ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    new_field.number = AddDescriptorField.field_index
1036ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    new_field.label = descriptor_pb2.FieldDescriptorProto.LABEL_REPEATED
1037ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1038ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    desc = descriptor.MakeDescriptor(desc_proto)
1039ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(desc.fields_by_name.has_key('name'))
1040ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(desc.fields_by_name.has_key('year'))
1041ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(desc.fields_by_name.has_key('automatic'))
1042ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(desc.fields_by_name.has_key('price'))
1043ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(desc.fields_by_name.has_key('owners'))
1044ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1045ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    class CarMessage(message.Message):
1046ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      __metaclass__ = reflection.GeneratedProtocolMessageType
1047ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      DESCRIPTOR = desc
1048ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1049ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    prius = CarMessage()
1050ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    prius.name = 'prius'
1051ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    prius.year = 2010
1052ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    prius.automatic = True
1053ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    prius.price = 25134.75
1054ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    prius.owners.extend(['bob', 'susan'])
1055ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1056ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    serialized_prius = prius.SerializeToString()
1057ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    new_prius = reflection.ParseMessage(desc, serialized_prius)
1058ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(new_prius is not prius)
1059ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(prius, new_prius)
1060ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1061ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # these are unnecessary assuming message equality works as advertised but
1062ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # explicitly check to be safe since we're mucking about in metaclass foo
1063ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(prius.name, new_prius.name)
1064ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(prius.year, new_prius.year)
1065ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(prius.automatic, new_prius.automatic)
1066ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(prius.price, new_prius.price)
1067ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(prius.owners, new_prius.owners)
1068ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTopLevelExtensionsForOptionalScalar(self):
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.optional_int32_extension
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, extendee_proto.Extensions[extension])
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # As with normal scalar fields, just doing a read doesn't actually set the
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # "has" bit.
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Actually set the thing.
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.Extensions[extension] = 23
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, extendee_proto.Extensions[extension])
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(extendee_proto.HasExtension(extension))
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that clearing works as well.
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, extendee_proto.Extensions[extension])
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTopLevelExtensionsForRepeatedScalar(self):
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.repeated_string_extension
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.Extensions[extension].append('foo')
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(['foo'], extendee_proto.Extensions[extension])
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string_list = extendee_proto.Extensions[extension]
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(string_list is not extendee_proto.Extensions[extension])
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't be allowed to do Extensions[extension] = 'a'
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      extension, 'a')
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTopLevelExtensionsForOptionalMessage(self):
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.optional_foreign_message_extension
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, extendee_proto.Extensions[extension].c)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # As with normal (non-extension) fields, merely reading from the
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # thing shouldn't set the "has" bit.
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.Extensions[extension].c = 23
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, extendee_proto.Extensions[extension].c)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(extendee_proto.HasExtension(extension))
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Save a reference here.
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message = extendee_proto.Extensions[extension]
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(foreign_message is not extendee_proto.Extensions[extension])
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Setting a field on foreign_message now shouldn't set
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # any "has" bits on extendee_proto.
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message.c = 42
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(42, foreign_message.c)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(foreign_message.HasField('c'))
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't be allowed to do Extensions[extension] = 'a'
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      extension, 'a')
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTopLevelExtensionsForRepeatedMessage(self):
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.repeatedgroup_extension
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group = extendee_proto.Extensions[extension].add()
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group.a = 23
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, extendee_proto.Extensions[extension][0].a)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group.a = 42
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(42, extendee_proto.Extensions[extension][0].a)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_list = extendee_proto.Extensions[extension]
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(group_list is not extendee_proto.Extensions[extension])
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't be allowed to do Extensions[extension] = 'a'
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      extension, 'a')
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNestedExtensions(self):
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.TestRequired.single
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # We just test the non-repeated case.
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    required = extendee_proto.Extensions[extension]
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, required.a)
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    required.a = 23
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, extendee_proto.Extensions[extension].a)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(extendee_proto.HasExtension(extension))
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(required is not extendee_proto.Extensions[extension])
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not extendee_proto.HasExtension(extension))
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # If message A directly contains message B, and
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # a.HasField('b') is currently False, then mutating any
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # extension in B should change a.HasField('b') to True
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # (and so on up the object tree).
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHasBitsForAncestorsOfExtendedMessage(self):
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Optional scalar extension.
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel = more_extensions_pb2.TopLevelMessage()
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, toplevel.submessage.Extensions[
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_int_extension])
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel.submessage.Extensions[
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_int_extension] = 23
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, toplevel.submessage.Extensions[
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_int_extension])
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(toplevel.HasField('submessage'))
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Repeated scalar extension.
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel = more_extensions_pb2.TopLevelMessage()
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([], toplevel.submessage.Extensions[
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_int_extension])
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel.submessage.Extensions[
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_int_extension].append(23)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([23], toplevel.submessage.Extensions[
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_int_extension])
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(toplevel.HasField('submessage'))
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Optional message extension.
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel = more_extensions_pb2.TopLevelMessage()
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, toplevel.submessage.Extensions[
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_message_extension].foreign_message_int)
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel.submessage.Extensions[
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_message_extension].foreign_message_int = 23
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, toplevel.submessage.Extensions[
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.optional_message_extension].foreign_message_int)
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(toplevel.HasField('submessage'))
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Repeated message extension.
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel = more_extensions_pb2.TopLevelMessage()
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, len(toplevel.submessage.Extensions[
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_message_extension]))
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not toplevel.HasField('submessage'))
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign = toplevel.submessage.Extensions[
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_message_extension].add()
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(foreign, toplevel.submessage.Extensions[
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        more_extensions_pb2.repeated_message_extension][0])
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(toplevel.HasField('submessage'))
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDisconnectionAfterClearingEmptyMessage(self):
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toplevel = more_extensions_pb2.TopLevelMessage()
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = toplevel.submessage
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = more_extensions_pb2.optional_message_extension
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_proto = extendee_proto.Extensions[extension]
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto.ClearExtension(extension)
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_proto.foreign_message_int = 23
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(extension_proto is not extendee_proto.Extensions[extension])
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testExtensionFailureModes(self):
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extendee_proto = unittest_pb2.TestAllExtensions()
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Try non-extension-handle arguments to HasExtension,
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # ClearExtension(), and Extensions[]...
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.HasExtension, 1234)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.ClearExtension, 1234)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__, 1234)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__, 1234, 5)
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Try something that *is* an extension handle, just not for
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # this message...
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unknown_handle = more_extensions_pb2.optional_int_extension
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.HasExtension,
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unknown_handle)
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.ClearExtension,
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unknown_handle)
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__,
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unknown_handle)
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__,
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unknown_handle, 5)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Try call HasExtension() with a valid handle, but for a
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # *repeated* field.  (Just as with non-extension repeated
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # fields, Has*() isn't supported for extension repeated fields).
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(KeyError, extendee_proto.HasExtension,
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unittest_pb2.repeated_string_extension)
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testStaticParseFrom(self):
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(proto1)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string1 = proto1.SerializeToString()
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes.FromString(string1)
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Messages should be equal.
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto2, proto1)
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromSingularField(self):
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test merge with just a singular field.
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optional_int32 = 1
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This shouldn't get overwritten.
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.optional_string = 'value'
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.optional_int32)
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('value', proto2.optional_string)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromRepeatedField(self):
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test merge with just a repeated field.
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.repeated_int32.append(1)
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.repeated_int32.append(2)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.repeated_int32.append(0)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto2.repeated_int32[0])
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.repeated_int32[1])
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto2.repeated_int32[2])
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromOptionalGroup(self):
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test merge with an optional group.
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optionalgroup.a = 12
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(12, proto2.optionalgroup.a)
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromRepeatedNestedMessage(self):
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test merge with a repeated nested message.
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = proto1.repeated_nested_message.add()
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 123
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = proto1.repeated_nested_message.add()
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 321
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = proto2.repeated_nested_message.add()
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 999
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(999, proto2.repeated_nested_message[0].bb)
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(123, proto2.repeated_nested_message[1].bb)
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(321, proto2.repeated_nested_message[2].bb)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto3 = unittest_pb2.TestAllTypes()
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto3.repeated_nested_message.MergeFrom(proto2.repeated_nested_message)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(999, proto3.repeated_nested_message[0].bb)
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(123, proto3.repeated_nested_message[1].bb)
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(321, proto3.repeated_nested_message[2].bb)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromAllFields(self):
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # With all fields set.
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(proto1)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Messages should be equal.
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto2, proto1)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Serialized string should be equal too.
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string1 = proto1.SerializeToString()
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string2 = proto2.SerializeToString()
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(string1, string2)
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromExtensionsSingular(self):
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllExtensions()
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.Extensions[unittest_pb2.optional_int32_extension] = 1
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllExtensions()
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1, proto2.Extensions[unittest_pb2.optional_int32_extension])
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromExtensionsRepeated(self):
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllExtensions()
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.Extensions[unittest_pb2.repeated_int32_extension].append(1)
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.Extensions[unittest_pb2.repeated_int32_extension].append(2)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllExtensions()
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.Extensions[unittest_pb2.repeated_int32_extension].append(0)
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        3, len(proto2.Extensions[unittest_pb2.repeated_int32_extension]))
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, proto2.Extensions[unittest_pb2.repeated_int32_extension][0])
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1, proto2.Extensions[unittest_pb2.repeated_int32_extension][1])
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        2, proto2.Extensions[unittest_pb2.repeated_int32_extension][2])
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromExtensionsNestedMessage(self):
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllExtensions()
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext1 = proto1.Extensions[
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.repeated_nested_message_extension]
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = ext1.add()
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 222
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = ext1.add()
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 333
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllExtensions()
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext2 = proto2.Extensions[
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.repeated_nested_message_extension]
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m = ext2.add()
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m.bb = 111
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFrom(proto1)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext2 = proto2.Extensions[
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.repeated_nested_message_extension]
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, len(ext2))
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(111, ext2[0].bb)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(222, ext2[1].bb)
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(333, ext2[2].bb)
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromBug(self):
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = unittest_pb2.TestAllTypes()
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2 = unittest_pb2.TestAllTypes()
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Cause optional_nested_message to be instantiated within message1, even
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # though it is not considered to be "present".
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.optional_nested_message
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(message1.HasField('optional_nested_message'))
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Merge into message2.  This should not instantiate the field is message2.
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.MergeFrom(message1)
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(message2.HasField('optional_nested_message'))
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCopyFromSingularField(self):
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test copy with just a singular field.
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optional_int32 = 1
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optional_string = 'important-text'
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.optional_string = 'value'
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.CopyFrom(proto1)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.optional_int32)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('important-text', proto2.optional_string)
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCopyFromRepeatedField(self):
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test copy with a repeated field.
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.repeated_int32.append(1)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.repeated_int32.append(2)
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.repeated_int32.append(0)
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.CopyFrom(proto1)
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.repeated_int32[0])
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto2.repeated_int32[1])
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCopyFromAllFields(self):
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # With all fields set.
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(proto1)
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.CopyFrom(proto1)
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Messages should be equal.
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto2, proto1)
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Serialized string should be equal too.
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string1 = proto1.SerializeToString()
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string2 = proto2.SerializeToString()
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(string1, string2)
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCopyFromSelf(self):
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.repeated_int32.append(1)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optional_int32 = 2
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.optional_string = 'important-text'
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1.CopyFrom(proto1)
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto1.repeated_int32[0])
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto1.optional_int32)
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('important-text', proto1.optional_string)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCopyFromBadType(self):
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The python implementation doesn't raise an exception in this
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # case. In theory it should.
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() == 'python':
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto1 = unittest_pb2.TestAllTypes()
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllExtensions()
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, proto1.CopyFrom, proto2)
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testClear(self):
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
1456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # C++ implementation does not support lazy fields right now so leave it
1457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # out for now.
1458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if api_implementation.Type() == 'python':
1459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      test_util.SetAllFields(proto)
1460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    else:
1461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      test_util.SetAllNonLazyFields(proto)
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Clear the message.
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Clear()
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(proto.ByteSize(), 0)
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    empty_proto = unittest_pb2.TestAllTypes()
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(proto, empty_proto)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test if extensions which were set are cleared.
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllExtensions(proto)
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Clear the message.
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Clear()
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(proto.ByteSize(), 0)
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    empty_proto = unittest_pb2.TestAllExtensions()
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(proto, empty_proto)
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testDisconnectingBeforeClear(self):
1478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto = unittest_pb2.TestAllTypes()
1479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    nested = proto.optional_nested_message
1480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto.Clear()
1481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(nested is not proto.optional_nested_message)
1482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    nested.bb = 23
1483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(not proto.HasField('optional_nested_message'))
1484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(0, proto.optional_nested_message.bb)
1485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto = unittest_pb2.TestAllTypes()
1487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    nested = proto.optional_nested_message
1488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    nested.bb = 5
1489ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    foreign = proto.optional_foreign_message
1490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    foreign.c = 6
1491ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto.Clear()
1493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(nested is not proto.optional_nested_message)
1494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(foreign is not proto.optional_foreign_message)
1495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(5, nested.bb)
1496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(6, foreign.c)
1497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    nested.bb = 15
1498ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    foreign.c = 16
1499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(not proto.HasField('optional_nested_message'))
1500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(0, proto.optional_nested_message.bb)
1501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertTrue(not proto.HasField('optional_foreign_message'))
1502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEqual(0, proto.optional_foreign_message.c)
1503ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def assertInitialized(self, proto):
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.IsInitialized())
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Neither method should raise an exception.
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializeToString()
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializePartialToString()
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def assertNotInitialized(self, proto):
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(proto.IsInitialized())
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(message.EncodeError, proto.SerializeToString)
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # "Partial" serialization doesn't care if message is uninitialized.
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializePartialToString()
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsInitialized(self):
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Trivial cases - all optional fields and extensions.
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The case of uninitialized required fields.
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequired()
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.a = proto.b = proto.c = 2
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The case of uninitialized submessage.
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequiredForeign()
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.a = 1
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.b = 0
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.c = 0
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Uninitialized repeated submessage.
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = proto.repeated_message.add()
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.a = message1.b = message1.c = 0
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Uninitialized repeated group in an extension.
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.TestRequired.multi
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = proto.Extensions[extension].add()
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2 = proto.Extensions[extension].add()
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.a = 1
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.b = 1
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.c = 1
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.a = 2
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.b = 2
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.c = 2
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Uninitialized nonrepeated message in an extension.
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.TestRequired.single
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension].a = 1
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotInitialized(proto)
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension].b = 2
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension].c = 3
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertInitialized(proto)
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Try passing an errors list.
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    errors = []
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequired()
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(proto.IsInitialized(errors))
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(errors, ['a', 'b', 'c'])
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testStringUTF8Encoding(self):
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Assignment of a unicode object to a field of type 'bytes' is not allowed.
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError,
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      setattr, proto, 'optional_bytes', u'unicode object')
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check that the default value is of python's 'unicode' type.
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(type(proto.optional_string), unicode)
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_string = unicode('Testing')
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.optional_string, str('Testing'))
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Assign a value of type 'str' which can be encoded in UTF-8.
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_string = str('Testing')
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.optional_string, unicode('Testing'))
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() == 'python':
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Values of type 'str' are also accepted as long as they can be
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # encoded in UTF-8.
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(type(proto.optional_string), str)
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Try to assign a 'str' value which contains bytes that aren't 7-bit ASCII.
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(ValueError,
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      setattr, proto, 'optional_string', str('a\x80a'))
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Assign a 'str' object which contains a UTF-8 encoded string.
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(ValueError,
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      setattr, proto, 'optional_string', 'Тест')
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # No exception thrown.
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_string = 'abc'
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testStringUTF8Serialization(self):
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_mset_pb2.TestMessageSet()
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message = unittest_mset_pb2.TestMessageSetExtension2
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = extension_message.message_set_extension
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utf8 = u'Тест'
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utf8_bytes = test_utf8.encode('utf-8')
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 'Test' in another language, using UTF-8 charset.
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension].str = test_utf8
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Serialize using the MessageSet wire format (this is specified in the
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # .proto file).
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check byte size.
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.ByteSize(), len(serialized))
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raw = unittest_mset_pb2.RawMessageSet()
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raw.MergeFromString(serialized)
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2 = unittest_mset_pb2.TestMessageSetExtension2()
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, len(raw.item))
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check that the type_id is the same as the tag ID in the .proto file.
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(raw.item[0].type_id, 1547769)
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check the actual bytes on the wire.
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        raw.item[0].message.endswith(test_utf8_bytes))
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.MergeFromString(raw.item[0].message)
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(type(message2.str), unicode)
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(message2.str, test_utf8)
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The pure Python API throws an exception on MergeFromString(),
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # if any of the string fields of the message can't be UTF-8 decoded.
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The C++ implementation of the API has no way to check that on
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # MergeFromString and thus has no way to throw the exception.
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The pure Python API always returns objects of type 'unicode' (UTF-8
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # encoded), or 'str' (in 7 bit ASCII).
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bytes = raw.item[0].message.replace(
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_utf8_bytes, len(test_utf8_bytes) * '\xff')
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unicode_decode_failed = False
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      message2.MergeFromString(bytes)
1653ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    except UnicodeDecodeError as e:
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unicode_decode_failed = True
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string_field = message2.str
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(unicode_decode_failed or type(string_field) == str)
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testEmptyNestedMessage(self):
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.MergeFrom(
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.TestAllTypes.NestedMessage())
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.CopyFrom(
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.TestAllTypes.NestedMessage())
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.MergeFromString('')
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_nested_message.ParseFromString('')
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestAllTypes()
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFromString(serialized)
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto2.HasField('optional_nested_message'))
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSetInParent(self):
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(proto.HasField('optionalgroup'))
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optionalgroup.SetInParent()
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optionalgroup'))
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  Since we had so many tests for protocol buffer equality, we broke these out
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  into separate TestCase classes.
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestAllTypesEqualityTest(unittest.TestCase):
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto = unittest_pb2.TestAllTypes()
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.second_proto = unittest_pb2.TestAllTypes()
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNotHashable(self):
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, hash, self.first_proto)
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSelfEquality(self):
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.first_proto)
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testEmptyProtosEqual(self):
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullProtosEqualityTest(unittest.TestCase):
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Equality tests using completely-full protos as a starting point."""
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto = unittest_pb2.TestAllTypes()
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.second_proto = unittest_pb2.TestAllTypes()
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(self.first_proto)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(self.second_proto)
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNotHashable(self):
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(TypeError, hash, self.first_proto)
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNoneNotEqual(self):
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, None)
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(None, self.second_proto)
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNotEqualToOtherMessage(self):
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    third_proto = unittest_pb2.TestRequired()
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, third_proto)
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(third_proto, self.second_proto)
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testAllFieldsFilledEquality(self):
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNonRepeatedScalar(self):
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Nonrepeated scalar field change should cause inequality.
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_int32 += 1
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # ...as should clearing a field.
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.ClearField('optional_int32')
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNonRepeatedComposite(self):
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Change a nonrepeated composite field.
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.bb += 1
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.bb -= 1
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Clear a field in the nested message.
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.ClearField('bb')
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.bb = (
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.second_proto.optional_nested_message.bb)
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Remove the nested message entirely.
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.ClearField('optional_nested_message')
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalar(self):
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Change a repeated scalar field.
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.repeated_int32.append(5)
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.ClearField('repeated_int32')
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedComposite(self):
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Change value within a repeated composite field.
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.repeated_nested_message[0].bb += 1
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.repeated_nested_message[0].bb -= 1
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Add a value to a repeated composite field.
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.repeated_nested_message.add()
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.second_proto.repeated_nested_message.add()
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNonRepeatedScalarHasBits(self):
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we test "has" bits as well as value for
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # nonrepeated scalar field.
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.ClearField('optional_int32')
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.second_proto.optional_int32 = 0
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNonRepeatedCompositeHasBits(self):
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we test "has" bits as well as value for
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # nonrepeated composite field.
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.ClearField('optional_nested_message')
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.second_proto.optional_nested_message.ClearField('bb')
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(self.first_proto, self.second_proto)
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.bb = 0
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.first_proto.optional_nested_message.ClearField('bb')
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self.first_proto, self.second_proto)
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionEqualityTest(unittest.TestCase):
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testExtensionEquality(self):
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllExtensions()
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllExtensions()
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllExtensions(first_proto)
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(first_proto, second_proto)
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllExtensions(second_proto)
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we check value equality.
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.Extensions[unittest_pb2.optional_int32_extension] += 1
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(first_proto, second_proto)
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.Extensions[unittest_pb2.optional_int32_extension] -= 1
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we also look at "has" bits.
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.ClearExtension(unittest_pb2.optional_int32_extension)
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.Extensions[unittest_pb2.optional_int32_extension] = 0
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(first_proto, second_proto)
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.Extensions[unittest_pb2.optional_int32_extension] = 0
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that differences in cached values
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # don't matter if "has" bits are both false.
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllExtensions()
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllExtensions()
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, first_proto.Extensions[unittest_pb2.optional_int32_extension])
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MutualRecursionEqualityTest(unittest.TestCase):
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testEqualityWithMutualRecursion(self):
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestMutualRecursionA()
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestMutualRecursionA()
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.bb.a.bb.optional_int32 = 23
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(first_proto, second_proto)
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.bb.a.bb.optional_int32 = 23
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ByteSizeTest(unittest.TestCase):
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto = more_extensions_pb2.ExtendedMessage()
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto = unittest_pb2.TestPackedTypes()
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_extended_proto = unittest_pb2.TestPackedExtensions()
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Size(self):
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.proto.ByteSize()
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testEmptyMessage(self):
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.proto.ByteSize())
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSizedOnKwargs(self):
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Use a separate message to ensure testing right after creation.
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.ByteSize())
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto_kwargs = unittest_pb2.TestAllTypes(optional_int64 = 1)
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for the tag, one to encode varint 1.
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto_kwargs.ByteSize())
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testVarints(self):
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def Test(i, expected_varint_size):
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.proto.Clear()
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.proto.optional_int64 = i
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Add one to the varint size for the tag info
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # for tag 1.
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(expected_varint_size + 1, self.Size())
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Test(0, 1)
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Test(1, 1)
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i, num_bytes in zip(range(7, 63, 7), range(1, 10000)):
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Test((1 << i) - 1, num_bytes)
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Test(-1, 10)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Test(-2, 10)
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Test(-(1 << 63), 10)
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testStrings(self):
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_string = ''
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Need one byte for tag info (tag #14), and one byte for length.
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, self.Size())
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_string = 'abc'
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Need one byte for tag info (tag #14), and one byte for length.
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + len(self.proto.optional_string), self.Size())
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_string = 'x' * 128
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Need one byte for tag info (tag #14), and TWO bytes for length.
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3 + len(self.proto.optional_string), self.Size())
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testOtherNumerics(self):
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_fixed32 = 1234
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for tag and 4 bytes for fixed32.
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, self.Size())
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_fixed64 = 1234
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for tag and 8 bytes for fixed64.
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(9, self.Size())
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_float = 1.234
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for tag and 4 bytes for float.
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, self.Size())
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_double = 1.234
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for tag and 8 bytes for float.
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(9, self.Size())
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_sint32 = 64
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # One byte for tag and 2 bytes for zig-zag-encoded 64.
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.Size())
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto = unittest_pb2.TestAllTypes()
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testComposites(self):
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 3 bytes.
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_nested_message.bb = (1 << 14)
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Plus one byte for bb tag.
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Plus 1 byte for optional_nested_message serialized size.
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Plus two bytes for optional_nested_message tag.
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3 + 1 + 1 + 2, self.Size())
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGroups(self):
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 4 bytes.
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optionalgroup.a = (1 << 21)
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Plus two bytes for |a| tag.
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Plus 2 * two bytes for START_GROUP and END_GROUP tags.
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4 + 2 + 2*2, self.Size())
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalars(self):
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(10)  # 1 byte.
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(128)  # 2 bytes.
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Also need 2 bytes for each entry for tag.
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1 + 2 + 2*2, self.Size())
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalarsExtend(self):
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.extend([10, 128])  # 3 bytes.
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Also need 2 bytes for each entry for tag.
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1 + 2 + 2*2, self.Size())
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedScalarsRemove(self):
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(10)  # 1 byte.
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(128)  # 2 bytes.
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Also need 2 bytes for each entry for tag.
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1 + 2 + 2*2, self.Size())
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.remove(128)
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1 + 2, self.Size())
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedComposites(self):
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Empty message.  2 bytes tag plus 1 byte length.
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_0 = self.proto.repeated_nested_message.add()
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_1 = self.proto.repeated_nested_message.add()
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_1.bb = 7
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size())
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedCompositesDelete(self):
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Empty message.  2 bytes tag plus 1 byte length.
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_0 = self.proto.repeated_nested_message.add()
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_1 = self.proto.repeated_nested_message.add()
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_1.bb = 9
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size())
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del self.proto.repeated_nested_message[0]
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 1 + 1 + 1, self.Size())
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Now add a new message.
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_2 = self.proto.repeated_nested_message.add()
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreign_message_2.bb = 12
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 1 + 1 + 1 + 2 + 1 + 1 + 1, self.Size())
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del self.proto.repeated_nested_message[1]
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 1 + 1 + 1, self.Size())
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    del self.proto.repeated_nested_message[0]
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.Size())
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRepeatedGroups(self):
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2-byte START_GROUP plus 2-byte END_GROUP.
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_0 = self.proto.repeatedgroup.add()
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2-byte START_GROUP plus 2-byte |a| tag + 1-byte |a|
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # plus 2-byte END_GROUP.
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_1 = self.proto.repeatedgroup.add()
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_1.a =  7
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2 + 2 + 2 + 2 + 1 + 2, self.Size())
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testExtensions(self):
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllExtensions()
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, proto.ByteSize())
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = unittest_pb2.optional_int32_extension  # Field #1, 1 byte.
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension] = 23
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 1 byte for tag, 1 byte for value.
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto.ByteSize())
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCacheInvalidationForNonrepeatedScalar(self):
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test non-extension.
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_int32 = 1
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, self.proto.ByteSize())
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_int32 = 128
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.proto.ByteSize())
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.ClearField('optional_int32')
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.proto.ByteSize())
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test within extension.
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = more_extensions_pb2.optional_int_extension
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.Extensions[extension] = 1
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, self.extended_proto.ByteSize())
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.Extensions[extension] = 128
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.extended_proto.ByteSize())
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.ClearExtension(extension)
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.extended_proto.ByteSize())
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCacheInvalidationForRepeatedScalar(self):
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test non-extension.
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(1)
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.proto.ByteSize())
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32.append(1)
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(6, self.proto.ByteSize())
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_int32[1] = 128
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(7, self.proto.ByteSize())
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.ClearField('repeated_int32')
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.proto.ByteSize())
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test within extension.
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = more_extensions_pb2.repeated_int_extension
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    repeated = self.extended_proto.Extensions[extension]
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    repeated.append(1)
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, self.extended_proto.ByteSize())
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    repeated.append(1)
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, self.extended_proto.ByteSize())
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    repeated[1] = 128
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, self.extended_proto.ByteSize())
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.ClearExtension(extension)
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.extended_proto.ByteSize())
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCacheInvalidationForNonrepeatedMessage(self):
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test non-extension.
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_foreign_message.c = 1
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, self.proto.ByteSize())
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_foreign_message.c = 128
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(6, self.proto.ByteSize())
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.optional_foreign_message.ClearField('c')
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.proto.ByteSize())
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.ClearField('optional_foreign_message')
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.proto.ByteSize())
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() == 'python':
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # This is only possible in pure-Python implementation of the API.
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child = self.proto.optional_foreign_message
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.proto.ClearField('optional_foreign_message')
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child.c = 128
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(0, self.proto.ByteSize())
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test within extension.
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = more_extensions_pb2.optional_message_extension
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = self.extended_proto.Extensions[extension]
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.extended_proto.ByteSize())
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child.foreign_message_int = 1
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, self.extended_proto.ByteSize())
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child.foreign_message_int = 128
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, self.extended_proto.ByteSize())
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.ClearExtension(extension)
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.extended_proto.ByteSize())
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCacheInvalidationForRepeatedMessage(self):
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test non-extension.
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child0 = self.proto.repeated_foreign_message.add()
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, self.proto.ByteSize())
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.repeated_foreign_message.add()
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(6, self.proto.ByteSize())
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child0.c = 1
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(8, self.proto.ByteSize())
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.proto.ClearField('repeated_foreign_message')
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.proto.ByteSize())
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test within extension.
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = more_extensions_pb2.repeated_message_extension
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_list = self.extended_proto.Extensions[extension]
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child0 = child_list.add()
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, self.extended_proto.ByteSize())
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_list.add()
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, self.extended_proto.ByteSize())
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child0.foreign_message_int = 1
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(6, self.extended_proto.ByteSize())
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child0.ClearField('foreign_message_int')
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, self.extended_proto.ByteSize())
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extended_proto.ClearExtension(extension)
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.extended_proto.ByteSize())
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPackedRepeatedScalars(self):
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.packed_proto.ByteSize())
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto.packed_int32.append(10)   # 1 byte.
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto.packed_int32.append(128)  # 2 bytes.
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The tag is 2 bytes (the field number is 90), and the varint
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # storing the length is 1 byte.
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_size = 1 + 2 + 3
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(int_size, self.packed_proto.ByteSize())
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto.packed_double.append(4.2)   # 8 bytes
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto.packed_double.append(3.25)  # 8 bytes
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 2 more tag bytes, 1 more length byte.
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double_size = 8 + 8 + 3
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(int_size+double_size, self.packed_proto.ByteSize())
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.packed_proto.ClearField('packed_int32')
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(double_size, self.packed_proto.ByteSize())
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPackedExtensions(self):
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, self.packed_extended_proto.ByteSize())
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = self.packed_extended_proto.Extensions[
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unittest_pb2.packed_fixed32_extension]
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension.extend([1, 2, 3, 4])   # 16 bytes
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Tag is 3 bytes.
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(19, self.packed_extended_proto.ByteSize())
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Issues to be sure to cover include:
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * Handling of unrecognized tags ("uninterpreted_bytes").
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * Handling of MessageSets.
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * Consistent ordering of tags in the wire format,
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     including ordering between extensions and non-extension
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     fields.
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * Consistent serialization of negative numbers, especially
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     negative int32s.
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * Handling of empty submessages (with and without "has"
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     bits set).
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SerializationTest(unittest.TestCase):
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeEmtpyMessage(self):
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllTypes()
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllTypes()
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto.ByteSize(), len(serialized))
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.MergeFromString(serialized)
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeAllFields(self):
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllTypes()
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllTypes()
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(first_proto)
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto.ByteSize(), len(serialized))
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.MergeFromString(serialized)
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeAllExtensions(self):
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllExtensions()
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllExtensions()
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllExtensions(first_proto)
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.MergeFromString(serialized)
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeNegativeValues(self):
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllTypes()
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_int32 = -1
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_int64 = -(2 << 40)
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_sint32 = -3
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_sint64 = -(4 << 40)
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_sfixed32 = -5
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_sfixed64 = -(6 << 40)
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllTypes.FromString(
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        first_proto.SerializeToString())
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testParseTruncated(self):
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This test is only applicable for the Python implementation of the API.
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() != 'python':
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllTypes()
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(first_proto)
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for truncation_point in xrange(len(serialized) + 1):
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      try:
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        second_proto = unittest_pb2.TestAllTypes()
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unknown_fields = unittest_pb2.TestEmptyMessage()
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pos = second_proto._InternalParse(serialized, 0, truncation_point)
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # If we didn't raise an error then we read exactly the amount expected.
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEqual(truncation_point, pos)
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Parsing to unknown fields should not throw if parsing to known fields
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # did not.
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        try:
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pos2 = unknown_fields._InternalParse(serialized, 0, truncation_point)
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self.assertEqual(truncation_point, pos2)
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        except message.DecodeError:
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self.fail('Parsing unknown fields failed when parsing known fields '
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'did not.')
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      except message.DecodeError:
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Parsing unknown fields should also fail.
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertRaises(message.DecodeError, unknown_fields._InternalParse,
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          serialized, 0, truncation_point)
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCanonicalSerializationOrder(self):
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = more_messages_pb2.OutOfOrderFields()
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # These are also their tag numbers.  Even though we're setting these in
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # reverse-tag order AND they're listed in reverse tag-order in the .proto
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # file, they should nonetheless be serialized in tag order.
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_sint32 = 5
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[more_messages_pb2.optional_uint64] = 4
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_uint32 = 3
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[more_messages_pb2.optional_int64] = 2
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 1
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.ByteSize(), len(serialized))
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d = _MiniDecoder(serialized)
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadTag = d.ReadFieldNumberAndWireType
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((1, wire_format.WIRETYPE_VARINT), ReadTag())
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, d.ReadInt32())
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((2, wire_format.WIRETYPE_VARINT), ReadTag())
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, d.ReadInt64())
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((3, wire_format.WIRETYPE_VARINT), ReadTag())
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, d.ReadUInt32())
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((4, wire_format.WIRETYPE_VARINT), ReadTag())
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, d.ReadUInt64())
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((5, wire_format.WIRETYPE_VARINT), ReadTag())
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(5, d.ReadSInt32())
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCanonicalSerializationOrderSameAsCpp(self):
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Copy of the same test we use for C++.
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestFieldOrderings()
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFieldsAndExtensions(proto)
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.ExpectAllFieldsAndExtensionsInOrder(serialized)
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeFromStringWhenFieldsAlreadySet(self):
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestAllTypes()
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.repeated_string.append('foobar')
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_int32 = 23
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.optional_nested_message.bb = 42
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestAllTypes()
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.repeated_string.append('baz')
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.optional_int32 = 100
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.optional_nested_message.bb = 999
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.MergeFromString(serialized)
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we append to repeated fields.
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(['baz', 'foobar'], list(second_proto.repeated_string))
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we overwrite nonrepeatd scalars.
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(23, second_proto.optional_int32)
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Ensure that we recursively call MergeFromString() on
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # submessages.
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(42, second_proto.optional_nested_message.bb)
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMessageSetWireFormat(self):
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_mset_pb2.TestMessageSet()
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message2 = unittest_mset_pb2.TestMessageSetExtension2
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension1 = extension_message1.message_set_extension
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension2 = extension_message2.message_set_extension
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension1].i = 123
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.Extensions[extension2].str = 'foo'
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Serialize using the MessageSet wire format (this is specified in the
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # .proto file).
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raw = unittest_mset_pb2.RawMessageSet()
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(False,
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     raw.DESCRIPTOR.GetOptions().message_set_wire_format)
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raw.MergeFromString(serialized)
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, len(raw.item))
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = unittest_mset_pb2.TestMessageSetExtension1()
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.MergeFromString(raw.item[0].message)
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(123, message1.i)
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2 = unittest_mset_pb2.TestMessageSetExtension2()
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message2.MergeFromString(raw.item[1].message)
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('foo', message2.str)
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Deserialize using the MessageSet wire format.
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_mset_pb2.TestMessageSet()
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFromString(serialized)
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(123, proto2.Extensions[extension1].i)
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('foo', proto2.Extensions[extension2].str)
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check byte size.
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto2.ByteSize(), len(serialized))
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.ByteSize(), len(serialized))
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMessageSetWireFormatUnknownExtension(self):
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Create a message using the message set wire format with an unknown
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # message.
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raw = unittest_mset_pb2.RawMessageSet()
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Add an item.
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item = raw.item.add()
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type_id = 1545008
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = unittest_mset_pb2.TestMessageSetExtension1()
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.i = 12345
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.message = message1.SerializeToString()
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Add a second, unknown extension.
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item = raw.item.add()
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type_id = 1545009
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = unittest_mset_pb2.TestMessageSetExtension1()
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.i = 12346
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.message = message1.SerializeToString()
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Add another unknown extension.
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item = raw.item.add()
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type_id = 1545010
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1 = unittest_mset_pb2.TestMessageSetExtension2()
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message1.str = 'foo'
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.message = message1.SerializeToString()
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = raw.SerializeToString()
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Parse message using the message set wire format.
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_mset_pb2.TestMessageSet()
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.MergeFromString(serialized)
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Check that the message parsed well.
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension1 = extension_message1.message_set_extension
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(12345, proto.Extensions[extension1].i)
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testUnknownFields(self):
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(proto)
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The empty message should be parsable with all of the fields
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # unknown.
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestEmptyMessage()
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Parsing this message should succeed.
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFromString(serialized)
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Now test with a int64 field set.
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int64 = 0x0fffffffffffffff
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # The empty message should be parsable with all of the fields
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # unknown.
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestEmptyMessage()
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Parsing this message should succeed.
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFromString(serialized)
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _CheckRaises(self, exc_class, callable_obj, exception):
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """This method checks if the excpetion type and message are as expected."""
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callable_obj()
2364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    except exc_class as ex:
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Check if the exception message is the right one.
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(exception, str(ex))
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raise self.failureException('%s not raised' % str(exc_class))
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeUninitialized(self):
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequired()
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message.EncodeError,
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proto.SerializeToString,
2376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        'Message protobuf_unittest.TestRequired is missing required fields: '
2377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        'a,b,c')
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't raise exceptions.
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    partial = proto.SerializePartialToString()
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto2 = unittest_pb2.TestRequired()
2382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertFalse(proto2.HasField('a'))
2383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # proto2 ParseFromString does not check that required fields are set.
2384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proto2.ParseFromString(partial)
2385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertFalse(proto2.HasField('a'))
2386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.a = 1
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message.EncodeError,
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proto.SerializeToString,
2391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        'Message protobuf_unittest.TestRequired is missing required fields: b,c')
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't raise exceptions.
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    partial = proto.SerializePartialToString()
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.b = 2
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message.EncodeError,
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proto.SerializeToString,
2399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        'Message protobuf_unittest.TestRequired is missing required fields: c')
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't raise exceptions.
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    partial = proto.SerializePartialToString()
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.c = 3
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Shouldn't raise exceptions.
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    partial = proto.SerializePartialToString()
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2 = unittest_pb2.TestRequired()
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.MergeFromString(serialized)
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.a)
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto2.b)
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, proto2.c)
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto2.ParseFromString(partial)
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto2.a)
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto2.b)
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, proto2.c)
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeUninitializedSubMessage(self):
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequiredForeign()
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Sub-message doesn't exist yet, so this succeeds.
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializeToString()
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.a = 1
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message.EncodeError,
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proto.SerializeToString,
2428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        'Message protobuf_unittest.TestRequiredForeign '
2429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        'is missing required fields: '
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'optional_message.b,optional_message.c')
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.b = 2
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_message.c = 3
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializeToString()
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message.add().a = 1
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message.add().b = 2
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message.EncodeError,
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proto.SerializeToString,
2441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        'Message protobuf_unittest.TestRequiredForeign is missing required fields: '
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'repeated_message[0].b,repeated_message[0].c,'
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'repeated_message[1].a,repeated_message[1].c')
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message[0].b = 2
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message[0].c = 3
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message[1].a = 1
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.repeated_message[1].c = 3
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.SerializeToString()
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeAllPackedFields(self):
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestPackedTypes()
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestPackedTypes()
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllPackedFields(first_proto)
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto.ByteSize(), len(serialized))
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bytes_read = second_proto.MergeFromString(serialized)
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(second_proto.ByteSize(), bytes_read)
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSerializeAllPackedExtensions(self):
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestPackedExtensions()
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestPackedExtensions()
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllPackedExtensions(first_proto)
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bytes_read = second_proto.MergeFromString(serialized)
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(second_proto.ByteSize(), bytes_read)
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(first_proto, second_proto)
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergePackedFromStringWhenSomeFieldsAlreadySet(self):
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto = unittest_pb2.TestPackedTypes()
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.packed_int32.extend([1, 2])
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_proto.packed_double.append(3.0)
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = first_proto.SerializeToString()
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto = unittest_pb2.TestPackedTypes()
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.packed_int32.append(3)
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.packed_double.extend([1.0, 2.0])
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.packed_sint32.append(4)
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_proto.MergeFromString(serialized)
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([3, 1, 2], second_proto.packed_int32)
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([1.0, 2.0, 3.0], second_proto.packed_double)
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([4], second_proto.packed_sint32)
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPackedFieldsWireFormat(self):
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestPackedTypes()
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.packed_int32.extend([1, 2, 150, 3])  # 1 + 1 + 2 + 1 bytes
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.packed_double.extend([1.0, 1000.0])  # 8 + 8 bytes
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.packed_float.append(2.0)             # 4 bytes, will be before double
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized = proto.SerializeToString()
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(proto.ByteSize(), len(serialized))
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d = _MiniDecoder(serialized)
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadTag = d.ReadFieldNumberAndWireType
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((90, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1+1+1+2, d.ReadInt32())
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, d.ReadInt32())
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, d.ReadInt32())
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(150, d.ReadInt32())
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, d.ReadInt32())
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((100, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(4, d.ReadInt32())
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2.0, d.ReadFloat())
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual((101, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(8+8, d.ReadInt32())
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1.0, d.ReadDouble())
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1000.0, d.ReadDouble())
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(d.EndOfStream())
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testParsePackedFromUnpacked(self):
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unpacked = unittest_pb2.TestUnpackedTypes()
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllUnpackedFields(unpacked)
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    packed = unittest_pb2.TestPackedTypes()
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    packed.MergeFromString(unpacked.SerializeToString())
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected = unittest_pb2.TestPackedTypes()
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllPackedFields(expected)
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(expected, packed)
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testParseUnpackedFromPacked(self):
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    packed = unittest_pb2.TestPackedTypes()
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllPackedFields(packed)
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unpacked = unittest_pb2.TestUnpackedTypes()
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unpacked.MergeFromString(packed.SerializeToString())
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected = unittest_pb2.TestUnpackedTypes()
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllUnpackedFields(expected)
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(expected, unpacked)
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testFieldNumbers(self):
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1)
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1)
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16)
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18)
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21)
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31)
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46)
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48)
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51)
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testExtensionFieldNumbers(self):
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestRequired.single.number, 1000)
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestRequired.SINGLE_FIELD_NUMBER, 1000)
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestRequired.multi.number, 1001)
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestRequired.MULTI_FIELD_NUMBER, 1001)
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.optional_int32_extension.number, 1)
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1)
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.optionalgroup_extension.number, 16)
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16)
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.optional_nested_message_extension.number, 18)
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18)
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.optional_nested_enum_extension.number, 21)
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER,
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      21)
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.repeated_int32_extension.number, 31)
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31)
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.repeatedgroup_extension.number, 46)
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46)
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.repeated_nested_message_extension.number, 48)
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unittest_pb2.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48)
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.repeated_nested_enum_extension.number, 51)
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER,
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      51)
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInitKwargs(self):
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_int32=1,
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_string='foo',
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_bool=True,
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_bytes='bar',
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_nested_message=unittest_pb2.TestAllTypes.NestedMessage(bb=1),
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_foreign_message=unittest_pb2.ForeignMessage(c=1),
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_nested_enum=unittest_pb2.TestAllTypes.FOO,
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_foreign_enum=unittest_pb2.FOREIGN_FOO,
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        repeated_int32=[1, 2, 3])
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.IsInitialized())
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_int32'))
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_string'))
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_bool'))
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_bytes'))
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_message'))
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_foreign_message'))
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_nested_enum'))
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_foreign_enum'))
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_int32)
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('foo', proto.optional_string)
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(True, proto.optional_bool)
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('bar', proto.optional_bytes)
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_nested_message.bb)
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_foreign_message.c)
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestAllTypes.FOO,
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     proto.optional_nested_enum)
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.FOREIGN_FOO, proto.optional_foreign_enum)
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual([1, 2, 3], proto.repeated_int32)
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInitArgsUnknownFieldName(self):
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def InitalizeEmptyMessageWithExtraKeywordArg():
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unused_proto = unittest_pb2.TestEmptyMessage(unknown='unknown')
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._CheckRaises(ValueError,
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      InitalizeEmptyMessageWithExtraKeywordArg,
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'Protocol message has no "unknown" field.')
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInitRequiredKwargs(self):
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequired(a=1, b=1, c=1)
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.IsInitialized())
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('a'))
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('b'))
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('c'))
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.HasField('dummy2'))
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.a)
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.b)
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.c)
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInitRequiredForeignKwargs(self):
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestRequiredForeign(
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        optional_message=unittest_pb2.TestRequired(a=1, b=1, c=1))
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.IsInitialized())
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.HasField('optional_message'))
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.optional_message.IsInitialized())
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.optional_message.HasField('a'))
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.optional_message.HasField('b'))
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.optional_message.HasField('c'))
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(not proto.optional_message.HasField('dummy2'))
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(unittest_pb2.TestRequired(a=1, b=1, c=1),
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     proto.optional_message)
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_message.a)
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_message.b)
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.optional_message.c)
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInitRepeatedKwargs(self):
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes(repeated_int32=[1, 2, 3])
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(proto.IsInitialized())
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, proto.repeated_int32[0])
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, proto.repeated_int32[1])
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(3, proto.repeated_int32[2])
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OptionsTest(unittest.TestCase):
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMessageOptions(self):
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_mset_pb2.TestMessageSet()
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(True,
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     proto.DESCRIPTOR.GetOptions().message_set_wire_format)
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(False,
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     proto.DESCRIPTOR.GetOptions().message_set_wire_format)
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPackedOptions(self):
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestAllTypes()
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_int32 = 1
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.optional_double = 3.0
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for field_descriptor, _ in proto.ListFields():
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(False, field_descriptor.GetOptions().packed)
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto = unittest_pb2.TestPackedTypes()
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.packed_int32.append(1)
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.packed_double.append(3.0)
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for field_descriptor, _ in proto.ListFields():
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(True, field_descriptor.GetOptions().packed)
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(reflection._FieldDescriptor.LABEL_REPEATED,
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       field_descriptor.label)
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unittest.main()
2672