1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#! /usr/bin/python
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# -*- coding: utf-8 -*-
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Protocol Buffers - Google's data interchange format
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2008 Google Inc.  All rights reserved.
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# http://code.google.com/p/protobuf/
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met:
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions of source code must retain the above copyright
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer.
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions in binary form must reproduce the above
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Neither the name of Google Inc. nor the names of its
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission.
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Unittest for reflection.py, which also indirectly tests the output of the
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepure-Python protocol compiler.
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'robinson@google.com (Will Robinson)'
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport operator
41d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleimport struct
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport unittest
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): When we split this test in two, only some of these imports
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# will be necessary in each test.
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import unittest_import_pb2
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import unittest_mset_pb2
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import unittest_pb2
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import descriptor_pb2
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import descriptor
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import message
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import reflection
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf.internal import more_extensions_pb2
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf.internal import more_messages_pb2
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf.internal import wire_format
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf.internal import test_util
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf.internal import decoder
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
60d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass _MiniDecoder(object):
61d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  """Decodes a stream of values from a string.
62d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
63d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  Once upon a time we actually had a class called decoder.Decoder.  Then we
64d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  got rid of it during a redesign that made decoding much, much faster overall.
65d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  But a couple tests in this file used it to check that the serialized form of
66d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  a message was correct.  So, this class implements just the methods that were
67d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  used by said tests, so that we don't have to rewrite the tests.
68d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  """
69d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
70d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def __init__(self, bytes):
71d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._bytes = bytes
72d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._pos = 0
73d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
74d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def ReadVarint(self):
75d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    result, self._pos = decoder._DecodeVarint(self._bytes, self._pos)
76d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return result
77d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
78d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  ReadInt32 = ReadVarint
79d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  ReadInt64 = ReadVarint
80d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  ReadUInt32 = ReadVarint
81d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  ReadUInt64 = ReadVarint
82d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
83d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def ReadSInt64(self):
84d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return wire_format.ZigZagDecode(self.ReadVarint())
85d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
86d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  ReadSInt32 = ReadSInt64
87d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
88d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def ReadFieldNumberAndWireType(self):
89d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return wire_format.UnpackTag(self.ReadVarint())
90d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
91d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def ReadFloat(self):
92d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    result = struct.unpack("<f", self._bytes[self._pos:self._pos+4])[0]
93d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._pos += 4
94d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return result
95d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
96d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def ReadDouble(self):
97d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    result = struct.unpack("<d", self._bytes[self._pos:self._pos+8])[0]
98d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._pos += 8
99d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return result
100d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
101d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def EndOfStream(self):
102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return self._pos == len(self._bytes)
103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
104d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ReflectionTest(unittest.TestCase):
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def assertIs(self, values, others):
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(len(values), len(others))
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for i in range(len(values)):
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertTrue(values[i] is others[i])
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
112d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testScalarConstructor(self):
113d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # Constructor with only scalar types should succeed.
114d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto = unittest_pb2.TestAllTypes(
115d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        optional_int32=24,
116d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        optional_double=54.321,
117d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        optional_string='optional_string')
118d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEqual(24, proto.optional_int32)
120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEqual(54.321, proto.optional_double)
121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEqual('optional_string', proto.optional_string)
122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testRepeatedScalarConstructor(self):
124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # Constructor with only repeated scalar types should succeed.
125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto = unittest_pb2.TestAllTypes(
126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        repeated_int32=[1, 2, 3, 4],
127d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        repeated_double=[1.23, 54.321],
128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        repeated_bool=[True, False, False],
129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        repeated_string=["optional_string"])
130d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
131d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEquals([1, 2, 3, 4], list(proto.repeated_int32))
132d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEquals([1.23, 54.321], list(proto.repeated_double))
133d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEquals([True, False, False], list(proto.repeated_bool))
134d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEquals(["optional_string"], list(proto.repeated_string))
135d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
136d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testRepeatedCompositeConstructor(self):
137d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # Constructor with only repeated composite types should succeed.
138d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto = unittest_pb2.TestAllTypes(
139d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        repeated_nested_message=[
140d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.TestAllTypes.NestedMessage(
141d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                bb=unittest_pb2.TestAllTypes.FOO),
142d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.TestAllTypes.NestedMessage(
143d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                bb=unittest_pb2.TestAllTypes.BAR)],
144d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        repeated_foreign_message=[
145d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.ForeignMessage(c=-43),
146d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.ForeignMessage(c=45324),
147d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.ForeignMessage(c=12)],
148d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        repeatedgroup=[
149d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.TestAllTypes.RepeatedGroup(),
150d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.TestAllTypes.RepeatedGroup(a=1),
151d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.TestAllTypes.RepeatedGroup(a=2)])
152d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
153d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEquals(
154d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        [unittest_pb2.TestAllTypes.NestedMessage(
155d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            bb=unittest_pb2.TestAllTypes.FOO),
156d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville         unittest_pb2.TestAllTypes.NestedMessage(
157d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville             bb=unittest_pb2.TestAllTypes.BAR)],
158d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        list(proto.repeated_nested_message))
159d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEquals(
160d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        [unittest_pb2.ForeignMessage(c=-43),
161d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville         unittest_pb2.ForeignMessage(c=45324),
162d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville         unittest_pb2.ForeignMessage(c=12)],
163d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        list(proto.repeated_foreign_message))
164d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEquals(
165d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        [unittest_pb2.TestAllTypes.RepeatedGroup(),
166d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville         unittest_pb2.TestAllTypes.RepeatedGroup(a=1),
167d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville         unittest_pb2.TestAllTypes.RepeatedGroup(a=2)],
168d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        list(proto.repeatedgroup))
169d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
170d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testMixedConstructor(self):
171d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # Constructor with only mixed types should succeed.
172d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto = unittest_pb2.TestAllTypes(
173d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        optional_int32=24,
174d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        optional_string='optional_string',
175d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        repeated_double=[1.23, 54.321],
176d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        repeated_bool=[True, False, False],
177d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        repeated_nested_message=[
178d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.TestAllTypes.NestedMessage(
179d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                bb=unittest_pb2.TestAllTypes.FOO),
180d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.TestAllTypes.NestedMessage(
181d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                bb=unittest_pb2.TestAllTypes.BAR)],
182d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        repeated_foreign_message=[
183d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.ForeignMessage(c=-43),
184d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.ForeignMessage(c=45324),
185d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            unittest_pb2.ForeignMessage(c=12)])
186d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
187d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEqual(24, proto.optional_int32)
188d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEqual('optional_string', proto.optional_string)
189d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEquals([1.23, 54.321], list(proto.repeated_double))
190d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEquals([True, False, False], list(proto.repeated_bool))
191d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEquals(
192d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        [unittest_pb2.TestAllTypes.NestedMessage(
193d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            bb=unittest_pb2.TestAllTypes.FOO),
194d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville         unittest_pb2.TestAllTypes.NestedMessage(
195d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville             bb=unittest_pb2.TestAllTypes.BAR)],
196d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        list(proto.repeated_nested_message))
197d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEquals(
198d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        [unittest_pb2.ForeignMessage(c=-43),
199d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville         unittest_pb2.ForeignMessage(c=45324),
200d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville         unittest_pb2.ForeignMessage(c=12)],
201d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        list(proto.repeated_foreign_message))
202d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSimpleHasBits(self):
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test a scalar.
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.HasField('optional_int32'))
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_int32)
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # HasField() shouldn't be true if all we've done is
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # read the default value.
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.HasField('optional_int32'))
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_int32 = 1
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Setting a value however *should* set the "has" bit.
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_int32'))
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.ClearField('optional_int32')
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # And clearing that value should unset the "has" bit.
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.HasField('optional_int32'))
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testHasBitsWithSinglyNestedScalar(self):
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Helper used to test foreign messages and groups.
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # composite_field_name should be the name of a non-repeated
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # composite (i.e., foreign or group) field in TestAllTypes,
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # and scalar_field_name should be the name of an integer-valued
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # scalar field within that composite.
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # I never thought I'd miss C++ macros and templates so much. :(
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # This helper is semantically just:
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert proto.composite_field.scalar_field == 0
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert not proto.composite_field.HasField('scalar_field')
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert not proto.HasField('composite_field')
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   proto.composite_field.scalar_field = 10
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   old_composite_field = proto.composite_field
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert proto.composite_field.scalar_field == 10
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert proto.composite_field.HasField('scalar_field')
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert proto.HasField('composite_field')
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   proto.ClearField('composite_field')
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert not proto.composite_field.HasField('scalar_field')
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert not proto.HasField('composite_field')
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert proto.composite_field.scalar_field == 0
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   # Now ensure that ClearField('composite_field') disconnected
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   # the old field object from the object tree...
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert old_composite_field is not proto.composite_field
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   old_composite_field.scalar_field = 20
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert not proto.composite_field.HasField('scalar_field')
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   assert not proto.HasField('composite_field')
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    def TestCompositeHasBits(composite_field_name, scalar_field_name):
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      proto = unittest_pb2.TestAllTypes()
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # First, check that we can get the scalar value, and see that it's the
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # default (0), but that proto.HasField('omposite') and
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # proto.composite.HasField('scalar') will still return False.
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      composite_field = getattr(proto, composite_field_name)
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      original_scalar_value = getattr(composite_field, scalar_field_name)
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertEqual(0, original_scalar_value)
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # Assert that the composite object does not "have" the scalar.
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertTrue(not composite_field.HasField(scalar_field_name))
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # Assert that proto does not "have" the composite field.
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertTrue(not proto.HasField(composite_field_name))
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # Now set the scalar within the composite field.  Ensure that the setting
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # is reflected, and that proto.HasField('composite') and
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # proto.composite.HasField('scalar') now both return True.
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      new_val = 20
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      setattr(composite_field, scalar_field_name, new_val)
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertEqual(new_val, getattr(composite_field, scalar_field_name))
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # Hold on to a reference to the current composite_field object.
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      old_composite_field = composite_field
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # Assert that the has methods now return true.
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertTrue(composite_field.HasField(scalar_field_name))
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertTrue(proto.HasField(composite_field_name))
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # Now call the clear method...
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      proto.ClearField(composite_field_name)
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # ...and ensure that the "has" bits are all back to False...
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      composite_field = getattr(proto, composite_field_name)
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertTrue(not composite_field.HasField(scalar_field_name))
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertTrue(not proto.HasField(composite_field_name))
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # ...and ensure that the scalar field has returned to its default.
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertEqual(0, getattr(composite_field, scalar_field_name))
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # Finally, ensure that modifications to the old composite field object
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # don't have any effect on the parent.
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      #
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # (NOTE that when we clear the composite field in the parent, we actually
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # don't recursively clear down the tree.  Instead, we just disconnect the
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # cleared composite from the tree.)
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertTrue(old_composite_field is not composite_field)
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      setattr(old_composite_field, scalar_field_name, new_val)
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertTrue(not composite_field.HasField(scalar_field_name))
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertTrue(not proto.HasField(composite_field_name))
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertEqual(0, getattr(composite_field, scalar_field_name))
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test simple, single-level nesting when we set a scalar.
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestCompositeHasBits('optionalgroup', 'a')
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestCompositeHasBits('optional_nested_message', 'bb')
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestCompositeHasBits('optional_foreign_message', 'c')
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestCompositeHasBits('optional_import_message', 'd')
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testReferencesToNestedMessage(self):
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    nested = proto.optional_nested_message
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del proto
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # A previous version had a bug where this would raise an exception when
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # hitting a now-dead weak reference.
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    nested.bb = 23
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testDisconnectingNestedMessageBeforeSettingField(self):
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    nested = proto.optional_nested_message
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.ClearField('optional_nested_message')  # Should disconnect from parent
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(nested is not proto.optional_nested_message)
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    nested.bb = 23
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.HasField('optional_nested_message'))
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_nested_message.bb)
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testHasBitsWhenModifyingRepeatedFields(self):
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test nesting when we add an element to a repeated field in a submessage.
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestNestedMessageHasBits()
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_nested_message.nestedmessage_repeated_int32.append(5)
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        [5], proto.optional_nested_message.nestedmessage_repeated_int32)
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_nested_message'))
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Do the same test, but with a repeated composite field within the
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # submessage.
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.ClearField('optional_nested_message')
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.HasField('optional_nested_message'))
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_nested_message.nestedmessage_repeated_foreignmessage.add()
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_nested_message'))
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testHasBitsForManyLevelsOfNesting(self):
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test nesting many levels deep.
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    recursive_proto = unittest_pb2.TestMutualRecursionA()
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not recursive_proto.HasField('bb'))
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, recursive_proto.bb.a.bb.a.bb.optional_int32)
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not recursive_proto.HasField('bb'))
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    recursive_proto.bb.a.bb.a.bb.optional_int32 = 5
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, recursive_proto.bb.a.bb.a.bb.optional_int32)
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(recursive_proto.HasField('bb'))
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(recursive_proto.bb.HasField('a'))
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(recursive_proto.bb.a.HasField('bb'))
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(recursive_proto.bb.a.bb.HasField('a'))
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(recursive_proto.bb.a.bb.a.HasField('bb'))
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not recursive_proto.bb.a.bb.a.bb.HasField('a'))
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(recursive_proto.bb.a.bb.a.bb.HasField('optional_int32'))
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSingularListFields(self):
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_fixed32 = 1
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_int32 = 5
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_string = 'foo'
358d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # Access sub-message but don't set it yet.
359d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    nested_message = proto.optional_nested_message
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 5),
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1),
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo') ],
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      proto.ListFields())
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
366d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.optional_nested_message.bb = 123
367d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEqual(
368d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 5),
369d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1),
370d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo'),
371d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        (proto.DESCRIPTOR.fields_by_name['optional_nested_message' ],
372d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville             nested_message) ],
373d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto.ListFields())
374d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedListFields(self):
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_fixed32.append(1)
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.append(5)
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.append(11)
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_string.extend(['foo', 'bar'])
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_string.extend([])
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_string.append('baz')
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_string.extend(str(x) for x in xrange(2))
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_int32 = 21
385d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.repeated_bool  # Access but don't set anything; should not be listed.
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 21),
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (proto.DESCRIPTOR.fields_by_name['repeated_int32'  ], [5, 11]),
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (proto.DESCRIPTOR.fields_by_name['repeated_fixed32'], [1]),
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (proto.DESCRIPTOR.fields_by_name['repeated_string' ],
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          ['foo', 'bar', 'baz', '0', '1']) ],
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      proto.ListFields())
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSingularListExtensions(self):
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllExtensions()
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[unittest_pb2.optional_fixed32_extension] = 1
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[unittest_pb2.optional_int32_extension  ] = 5
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[unittest_pb2.optional_string_extension ] = 'foo'
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      [ (unittest_pb2.optional_int32_extension  , 5),
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (unittest_pb2.optional_fixed32_extension, 1),
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (unittest_pb2.optional_string_extension , 'foo') ],
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      proto.ListFields())
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedListExtensions(self):
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllExtensions()
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[unittest_pb2.repeated_fixed32_extension].append(1)
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[unittest_pb2.repeated_int32_extension  ].append(5)
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[unittest_pb2.repeated_int32_extension  ].append(11)
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[unittest_pb2.repeated_string_extension ].append('foo')
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[unittest_pb2.repeated_string_extension ].append('bar')
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[unittest_pb2.repeated_string_extension ].append('baz')
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[unittest_pb2.optional_int32_extension  ] = 21
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      [ (unittest_pb2.optional_int32_extension  , 21),
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (unittest_pb2.repeated_int32_extension  , [5, 11]),
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (unittest_pb2.repeated_fixed32_extension, [1]),
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (unittest_pb2.repeated_string_extension , ['foo', 'bar', 'baz']) ],
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      proto.ListFields())
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testListFieldsAndExtensions(self):
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestFieldOrderings()
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllFieldsAndExtensions(proto)
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest_pb2.my_extension_int
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      [ (proto.DESCRIPTOR.fields_by_name['my_int'   ], 1),
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (unittest_pb2.my_extension_int               , 23),
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (proto.DESCRIPTOR.fields_by_name['my_string'], 'foo'),
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (unittest_pb2.my_extension_string            , 'bar'),
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (proto.DESCRIPTOR.fields_by_name['my_float' ], 1.0) ],
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      proto.ListFields())
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testDefaultValues(self):
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_int32)
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_int64)
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_uint32)
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_uint64)
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_sint32)
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_sint64)
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_fixed32)
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_fixed64)
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_sfixed32)
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_sfixed64)
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0.0, proto.optional_float)
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0.0, proto.optional_double)
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(False, proto.optional_bool)
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual('', proto.optional_string)
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual('', proto.optional_bytes)
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(41, proto.default_int32)
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(42, proto.default_int64)
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(43, proto.default_uint32)
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(44, proto.default_uint64)
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(-45, proto.default_sint32)
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(46, proto.default_sint64)
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(47, proto.default_fixed32)
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(48, proto.default_fixed64)
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(49, proto.default_sfixed32)
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(-50, proto.default_sfixed64)
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(51.5, proto.default_float)
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(52e3, proto.default_double)
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(True, proto.default_bool)
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual('hello', proto.default_string)
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual('world', proto.default_bytes)
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestAllTypes.BAR, proto.default_nested_enum)
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.FOREIGN_BAR, proto.default_foreign_enum)
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_import_pb2.IMPORT_BAR,
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     proto.default_import_enum)
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestExtremeDefaultValues()
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(u'\u1234', proto.utf8_string)
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testHasFieldWithUnknownFieldName(self):
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(ValueError, proto.HasField, 'nonexistent_field')
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testClearFieldWithUnknownFieldName(self):
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(ValueError, proto.ClearField, 'nonexistent_field')
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testDisallowedAssignments(self):
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # It's illegal to assign values directly to repeated fields
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # or to nonrepeated composite fields.  Ensure that this fails.
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Repeated fields.
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', 10)
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Lists shouldn't work, either.
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', [10])
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Composite fields.
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(AttributeError, setattr, proto,
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      'optional_nested_message', 23)
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Assignment to a repeated nested message field without specifying
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # the index in the array of nested messages.
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(AttributeError, setattr, proto.repeated_nested_message,
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      'bb', 34)
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Assignment to an attribute of a repeated field.
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(AttributeError, setattr, proto.repeated_float,
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      'some_attribute', 34)
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # proto.nonexistent_field = 23 should fail as well.
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(AttributeError, setattr, proto, 'nonexistent_field', 23)
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Add type-safety check for enums.
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSingleScalarTypeSafety(self):
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, setattr, proto, 'optional_int32', 1.1)
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, setattr, proto, 'optional_int32', 'foo')
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, setattr, proto, 'optional_string', 10)
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, setattr, proto, 'optional_bytes', 10)
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSingleScalarBoundsChecking(self):
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    def TestMinAndMaxIntegers(field_name, expected_min, expected_max):
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      pb = unittest_pb2.TestAllTypes()
514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      setattr(pb, field_name, expected_min)
515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      setattr(pb, field_name, expected_max)
516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertRaises(ValueError, setattr, pb, field_name, expected_min - 1)
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertRaises(ValueError, setattr, pb, field_name, expected_max + 1)
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestMinAndMaxIntegers('optional_int32', -(1 << 31), (1 << 31) - 1)
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestMinAndMaxIntegers('optional_uint32', 0, 0xffffffff)
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestMinAndMaxIntegers('optional_int64', -(1 << 63), (1 << 63) - 1)
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestMinAndMaxIntegers('optional_uint64', 0, 0xffffffffffffffff)
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestMinAndMaxIntegers('optional_nested_enum', -(1 << 31), (1 << 31) - 1)
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedScalarTypeSafety(self):
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, proto.repeated_int32.append, 1.1)
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, proto.repeated_int32.append, 'foo')
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, proto.repeated_string, 10)
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, proto.repeated_bytes, 10)
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.append(10)
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32[0] = 23
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(IndexError, proto.repeated_int32.__setitem__, 500, 23)
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, proto.repeated_int32.__setitem__, 0, 'abc')
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSingleScalarGettersAndSetters(self):
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_int32)
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_int32 = 1
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.optional_int32)
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # TODO(robinson): Test all other scalar field types.
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSingleScalarClearField(self):
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Should be allowed to clear something that's not there (a no-op).
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.ClearField('optional_int32')
548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_int32 = 1
549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_int32'))
550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.ClearField('optional_int32')
551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.optional_int32)
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.HasField('optional_int32'))
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # TODO(robinson): Test all other scalar field types.
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testEnums(self):
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.FOO)
558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, unittest_pb2.TestAllTypes.FOO)
559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, proto.BAR)
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, unittest_pb2.TestAllTypes.BAR)
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, proto.BAZ)
562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ)
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedScalars(self):
565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.repeated_int32)
568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, len(proto.repeated_int32))
569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.append(5)
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.append(10)
571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.append(15)
572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.repeated_int32)
573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, len(proto.repeated_int32))
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([5, 10, 15], proto.repeated_int32)
576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test single retrieval.
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, proto.repeated_int32[0])
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(15, proto.repeated_int32[-1])
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test out-of-bounds indices.
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(IndexError, proto.repeated_int32.__getitem__, 1234)
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(IndexError, proto.repeated_int32.__getitem__, -1234)
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test incorrect types passed to __getitem__.
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, proto.repeated_int32.__getitem__, 'foo')
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, proto.repeated_int32.__getitem__, None)
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test single assignment.
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32[1] = 20
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([5, 20, 15], proto.repeated_int32)
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test insertion.
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.insert(1, 25)
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([5, 25, 20, 15], proto.repeated_int32)
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test slice retrieval.
596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.append(30)
597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([25, 20, 15], proto.repeated_int32[1:4])
598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([5, 25, 20, 15, 30], proto.repeated_int32[:])
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test slice assignment with an iterator
601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32[1:4] = (i for i in xrange(3))
602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([5, 0, 1, 2, 30], proto.repeated_int32)
603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test slice assignment.
605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32[1:4] = [35, 40, 45]
606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([5, 35, 40, 45, 30], proto.repeated_int32)
607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test that we can use the field as an iterator.
609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    result = []
610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for i in proto.repeated_int32:
611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      result.append(i)
612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([5, 35, 40, 45, 30], result)
613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test single deletion.
615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del proto.repeated_int32[2]
616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([5, 35, 45, 30], proto.repeated_int32)
617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test slice deletion.
619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del proto.repeated_int32[2:]
620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([5, 35], proto.repeated_int32)
621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test clearing.
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.ClearField('repeated_int32')
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.repeated_int32)
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, len(proto.repeated_int32))
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedScalarsRemove(self):
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.repeated_int32)
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, len(proto.repeated_int32))
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.append(5)
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.append(10)
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.append(5)
635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.append(5)
636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(4, len(proto.repeated_int32))
638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.remove(5)
639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, len(proto.repeated_int32))
640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(10, proto.repeated_int32[0])
641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, proto.repeated_int32[1])
642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, proto.repeated_int32[2])
643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.remove(5)
645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, len(proto.repeated_int32))
646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(10, proto.repeated_int32[0])
647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, proto.repeated_int32[1])
648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.repeated_int32.remove(10)
650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, len(proto.repeated_int32))
651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, proto.repeated_int32[0])
652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Remove a non-existent element.
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(ValueError, proto.repeated_int32.remove, 123)
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedComposites(self):
657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.repeated_nested_message)
659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, len(proto.repeated_nested_message))
660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m0 = proto.repeated_nested_message.add()
661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m1 = proto.repeated_nested_message.add()
662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.repeated_nested_message)
663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, len(proto.repeated_nested_message))
664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertIs([m0, m1], proto.repeated_nested_message)
665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(isinstance(m0, unittest_pb2.TestAllTypes.NestedMessage))
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test out-of-bounds indices.
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__,
669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      1234)
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__,
671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      -1234)
672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test incorrect types passed to __getitem__.
674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__,
675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      'foo')
676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__,
677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      None)
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test slice retrieval.
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m2 = proto.repeated_nested_message.add()
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m3 = proto.repeated_nested_message.add()
682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m4 = proto.repeated_nested_message.add()
683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertIs([m1, m2, m3], proto.repeated_nested_message[1:4])
684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertIs([m0, m1, m2, m3, m4], proto.repeated_nested_message[:])
685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test that we can use the field as an iterator.
687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    result = []
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for i in proto.repeated_nested_message:
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      result.append(i)
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertIs([m0, m1, m2, m3, m4], result)
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test single deletion.
693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del proto.repeated_nested_message[2]
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertIs([m0, m1, m3, m4], proto.repeated_nested_message)
695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test slice deletion.
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del proto.repeated_nested_message[2:]
698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertIs([m0, m1], proto.repeated_nested_message)
699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test clearing.
701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.ClearField('repeated_nested_message')
702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.repeated_nested_message)
703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, len(proto.repeated_nested_message))
704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testHandWrittenReflection(self):
706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # TODO(robinson): We probably need a better way to specify
707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # protocol types by hand.  But then again, this isn't something
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # we expect many people to do.  Hmm.
709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor = descriptor.FieldDescriptor
710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foo_field_descriptor = FieldDescriptor(
711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        name='foo_field', full_name='MyProto.foo_field',
712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        index=0, number=1, type=FieldDescriptor.TYPE_INT64,
713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        cpp_type=FieldDescriptor.CPPTYPE_INT64,
714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        label=FieldDescriptor.LABEL_OPTIONAL, default_value=0,
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        containing_type=None, message_type=None, enum_type=None,
716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        is_extension=False, extension_scope=None,
717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        options=descriptor_pb2.FieldOptions())
718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    mydescriptor = descriptor.Descriptor(
719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        name='MyProto', full_name='MyProto', filename='ignored',
720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        containing_type=None, nested_types=[], enum_types=[],
721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        fields=[foo_field_descriptor], extensions=[],
722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        options=descriptor_pb2.MessageOptions())
723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class MyProtoClass(message.Message):
724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      DESCRIPTOR = mydescriptor
725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      __metaclass__ = reflection.GeneratedProtocolMessageType
726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    myproto_instance = MyProtoClass()
727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, myproto_instance.foo_field)
728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not myproto_instance.HasField('foo_field'))
729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    myproto_instance.foo_field = 23
730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(23, myproto_instance.foo_field)
731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(myproto_instance.HasField('foo_field'))
732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testTopLevelExtensionsForOptionalScalar(self):
734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto = unittest_pb2.TestAllExtensions()
735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = unittest_pb2.optional_int32_extension
736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not extendee_proto.HasExtension(extension))
737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, extendee_proto.Extensions[extension])
738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # As with normal scalar fields, just doing a read doesn't actually set the
739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # "has" bit.
740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not extendee_proto.HasExtension(extension))
741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Actually set the thing.
742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto.Extensions[extension] = 23
743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(23, extendee_proto.Extensions[extension])
744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(extendee_proto.HasExtension(extension))
745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Ensure that clearing works as well.
746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto.ClearExtension(extension)
747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, extendee_proto.Extensions[extension])
748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not extendee_proto.HasExtension(extension))
749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testTopLevelExtensionsForRepeatedScalar(self):
751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto = unittest_pb2.TestAllExtensions()
752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = unittest_pb2.repeated_string_extension
753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto.Extensions[extension].append('foo')
755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(['foo'], extendee_proto.Extensions[extension])
756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string_list = extendee_proto.Extensions[extension]
757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto.ClearExtension(extension)
758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(string_list is not extendee_proto.Extensions[extension])
760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Shouldn't be allowed to do Extensions[extension] = 'a'
761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      extension, 'a')
763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testTopLevelExtensionsForOptionalMessage(self):
765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto = unittest_pb2.TestAllExtensions()
766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = unittest_pb2.optional_foreign_message_extension
767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not extendee_proto.HasExtension(extension))
768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, extendee_proto.Extensions[extension].c)
769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # As with normal (non-extension) fields, merely reading from the
770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # thing shouldn't set the "has" bit.
771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not extendee_proto.HasExtension(extension))
772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto.Extensions[extension].c = 23
773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(23, extendee_proto.Extensions[extension].c)
774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(extendee_proto.HasExtension(extension))
775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Save a reference here.
776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foreign_message = extendee_proto.Extensions[extension]
777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto.ClearExtension(extension)
778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(foreign_message is not extendee_proto.Extensions[extension])
779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Setting a field on foreign_message now shouldn't set
780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # any "has" bits on extendee_proto.
781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foreign_message.c = 42
782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(42, foreign_message.c)
783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(foreign_message.HasField('c'))
784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not extendee_proto.HasExtension(extension))
785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Shouldn't be allowed to do Extensions[extension] = 'a'
786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      extension, 'a')
788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testTopLevelExtensionsForRepeatedMessage(self):
790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto = unittest_pb2.TestAllExtensions()
791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = unittest_pb2.repeatedgroup_extension
792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    group = extendee_proto.Extensions[extension].add()
794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    group.a = 23
795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(23, extendee_proto.Extensions[extension][0].a)
796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    group.a = 42
797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(42, extendee_proto.Extensions[extension][0].a)
798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    group_list = extendee_proto.Extensions[extension]
799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto.ClearExtension(extension)
800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, len(extendee_proto.Extensions[extension]))
801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(group_list is not extendee_proto.Extensions[extension])
802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Shouldn't be allowed to do Extensions[extension] = 'a'
803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      extension, 'a')
805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testNestedExtensions(self):
807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto = unittest_pb2.TestAllExtensions()
808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = unittest_pb2.TestRequired.single
809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # We just test the non-repeated case.
811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not extendee_proto.HasExtension(extension))
812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    required = extendee_proto.Extensions[extension]
813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, required.a)
814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not extendee_proto.HasExtension(extension))
815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    required.a = 23
816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(23, extendee_proto.Extensions[extension].a)
817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(extendee_proto.HasExtension(extension))
818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto.ClearExtension(extension)
819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(required is not extendee_proto.Extensions[extension])
820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not extendee_proto.HasExtension(extension))
821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # If message A directly contains message B, and
823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # a.HasField('b') is currently False, then mutating any
824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # extension in B should change a.HasField('b') to True
825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # (and so on up the object tree).
826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testHasBitsForAncestorsOfExtendedMessage(self):
827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Optional scalar extension.
828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    toplevel = more_extensions_pb2.TopLevelMessage()
829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not toplevel.HasField('submessage'))
830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, toplevel.submessage.Extensions[
831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.optional_int_extension])
832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not toplevel.HasField('submessage'))
833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    toplevel.submessage.Extensions[
834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.optional_int_extension] = 23
835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(23, toplevel.submessage.Extensions[
836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.optional_int_extension])
837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(toplevel.HasField('submessage'))
838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Repeated scalar extension.
840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    toplevel = more_extensions_pb2.TopLevelMessage()
841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not toplevel.HasField('submessage'))
842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([], toplevel.submessage.Extensions[
843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.repeated_int_extension])
844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not toplevel.HasField('submessage'))
845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    toplevel.submessage.Extensions[
846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.repeated_int_extension].append(23)
847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([23], toplevel.submessage.Extensions[
848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.repeated_int_extension])
849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(toplevel.HasField('submessage'))
850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Optional message extension.
852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    toplevel = more_extensions_pb2.TopLevelMessage()
853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not toplevel.HasField('submessage'))
854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, toplevel.submessage.Extensions[
855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.optional_message_extension].foreign_message_int)
856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not toplevel.HasField('submessage'))
857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    toplevel.submessage.Extensions[
858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.optional_message_extension].foreign_message_int = 23
859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(23, toplevel.submessage.Extensions[
860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.optional_message_extension].foreign_message_int)
861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(toplevel.HasField('submessage'))
862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Repeated message extension.
864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    toplevel = more_extensions_pb2.TopLevelMessage()
865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not toplevel.HasField('submessage'))
866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, len(toplevel.submessage.Extensions[
867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.repeated_message_extension]))
868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not toplevel.HasField('submessage'))
869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foreign = toplevel.submessage.Extensions[
870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.repeated_message_extension].add()
871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(foreign is toplevel.submessage.Extensions[
872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        more_extensions_pb2.repeated_message_extension][0])
873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(toplevel.HasField('submessage'))
874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testDisconnectionAfterClearingEmptyMessage(self):
876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    toplevel = more_extensions_pb2.TopLevelMessage()
877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto = toplevel.submessage
878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = more_extensions_pb2.optional_message_extension
879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension_proto = extendee_proto.Extensions[extension]
880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto.ClearExtension(extension)
881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension_proto.foreign_message_int = 23
882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(extension_proto is not extendee_proto.Extensions[extension])
884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testExtensionFailureModes(self):
886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extendee_proto = unittest_pb2.TestAllExtensions()
887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Try non-extension-handle arguments to HasExtension,
889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # ClearExtension(), and Extensions[]...
890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(KeyError, extendee_proto.HasExtension, 1234)
891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(KeyError, extendee_proto.ClearExtension, 1234)
892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__, 1234)
893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__, 1234, 5)
894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Try something that *is* an extension handle, just not for
896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # this message...
897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unknown_handle = more_extensions_pb2.optional_int_extension
898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(KeyError, extendee_proto.HasExtension,
899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      unknown_handle)
900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(KeyError, extendee_proto.ClearExtension,
901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      unknown_handle)
902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__,
903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      unknown_handle)
904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__,
905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      unknown_handle, 5)
906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Try call HasExtension() with a valid handle, but for a
908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # *repeated* field.  (Just as with non-extension repeated
909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # fields, Has*() isn't supported for extension repeated fields).
910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(KeyError, extendee_proto.HasExtension,
911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      unittest_pb2.repeated_string_extension)
912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testStaticParseFrom(self):
914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllTypes()
915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllFields(proto1)
916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string1 = proto1.SerializeToString()
918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllTypes.FromString(string1)
919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Messages should be equal.
921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(proto2, proto1)
922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMergeFromSingularField(self):
924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test merge with just a singular field.
925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllTypes()
926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.optional_int32 = 1
927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllTypes()
929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # This shouldn't get overwritten.
930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.optional_string = 'value'
931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFrom(proto1)
933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto2.optional_int32)
934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual('value', proto2.optional_string)
935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMergeFromRepeatedField(self):
937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test merge with just a repeated field.
938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllTypes()
939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.repeated_int32.append(1)
940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.repeated_int32.append(2)
941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllTypes()
943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.repeated_int32.append(0)
944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFrom(proto1)
945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto2.repeated_int32[0])
947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto2.repeated_int32[1])
948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, proto2.repeated_int32[2])
949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMergeFromOptionalGroup(self):
951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test merge with an optional group.
952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllTypes()
953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.optionalgroup.a = 12
954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllTypes()
955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFrom(proto1)
956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(12, proto2.optionalgroup.a)
957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMergeFromRepeatedNestedMessage(self):
959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test merge with a repeated nested message.
960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllTypes()
961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m = proto1.repeated_nested_message.add()
962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m.bb = 123
963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m = proto1.repeated_nested_message.add()
964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m.bb = 321
965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllTypes()
967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m = proto2.repeated_nested_message.add()
968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m.bb = 999
969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFrom(proto1)
970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(999, proto2.repeated_nested_message[0].bb)
971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(123, proto2.repeated_nested_message[1].bb)
972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(321, proto2.repeated_nested_message[2].bb)
973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMergeFromAllFields(self):
975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # With all fields set.
976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllTypes()
977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllFields(proto1)
978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllTypes()
979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFrom(proto1)
980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Messages should be equal.
982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(proto2, proto1)
983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Serialized string should be equal too.
985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string1 = proto1.SerializeToString()
986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string2 = proto2.SerializeToString()
987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(string1, string2)
988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMergeFromExtensionsSingular(self):
990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllExtensions()
991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.Extensions[unittest_pb2.optional_int32_extension] = 1
992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllExtensions()
994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFrom(proto1)
995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        1, proto2.Extensions[unittest_pb2.optional_int32_extension])
997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMergeFromExtensionsRepeated(self):
999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllExtensions()
1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.Extensions[unittest_pb2.repeated_int32_extension].append(1)
1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.Extensions[unittest_pb2.repeated_int32_extension].append(2)
1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllExtensions()
1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.Extensions[unittest_pb2.repeated_int32_extension].append(0)
1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFrom(proto1)
1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        3, len(proto2.Extensions[unittest_pb2.repeated_int32_extension]))
1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        0, proto2.Extensions[unittest_pb2.repeated_int32_extension][0])
1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        1, proto2.Extensions[unittest_pb2.repeated_int32_extension][1])
1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        2, proto2.Extensions[unittest_pb2.repeated_int32_extension][2])
1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMergeFromExtensionsNestedMessage(self):
1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllExtensions()
1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ext1 = proto1.Extensions[
1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        unittest_pb2.repeated_nested_message_extension]
1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m = ext1.add()
1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m.bb = 222
1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m = ext1.add()
1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m.bb = 333
1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllExtensions()
1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ext2 = proto2.Extensions[
1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        unittest_pb2.repeated_nested_message_extension]
1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m = ext2.add()
1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    m.bb = 111
1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFrom(proto1)
1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ext2 = proto2.Extensions[
1032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        unittest_pb2.repeated_nested_message_extension]
1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, len(ext2))
1034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(111, ext2[0].bb)
1035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(222, ext2[1].bb)
1036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(333, ext2[2].bb)
1037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testCopyFromSingularField(self):
1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test copy with just a singular field.
1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllTypes()
1041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.optional_int32 = 1
1042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.optional_string = 'important-text'
1043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllTypes()
1045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.optional_string = 'value'
1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.CopyFrom(proto1)
1048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto2.optional_int32)
1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual('important-text', proto2.optional_string)
1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testCopyFromRepeatedField(self):
1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test copy with a repeated field.
1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllTypes()
1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.repeated_int32.append(1)
1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.repeated_int32.append(2)
1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllTypes()
1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.repeated_int32.append(0)
1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.CopyFrom(proto1)
1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto2.repeated_int32[0])
1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, proto2.repeated_int32[1])
1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testCopyFromAllFields(self):
1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # With all fields set.
1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllTypes()
1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllFields(proto1)
1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestAllTypes()
1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.CopyFrom(proto1)
1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Messages should be equal.
1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(proto2, proto1)
1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Serialized string should be equal too.
1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string1 = proto1.SerializeToString()
1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string2 = proto2.SerializeToString()
1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(string1, string2)
1078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testCopyFromSelf(self):
1080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1 = unittest_pb2.TestAllTypes()
1081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.repeated_int32.append(1)
1082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.optional_int32 = 2
1083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.optional_string = 'important-text'
1084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto1.CopyFrom(proto1)
1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto1.repeated_int32[0])
1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, proto1.optional_int32)
1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual('important-text', proto1.optional_string)
1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testClear(self):
1091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
1092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllFields(proto)
1093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Clear the message.
1094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Clear()
1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEquals(proto.ByteSize(), 0)
1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    empty_proto = unittest_pb2.TestAllTypes()
1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEquals(proto, empty_proto)
1098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test if extensions which were set are cleared.
1100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllExtensions()
1101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllExtensions(proto)
1102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Clear the message.
1103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Clear()
1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEquals(proto.ByteSize(), 0)
1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    empty_proto = unittest_pb2.TestAllExtensions()
1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEquals(proto, empty_proto)
1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1108d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def assertInitialized(self, proto):
1109d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertTrue(proto.IsInitialized())
1110d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # Neither method should raise an exception.
1111d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.SerializeToString()
1112d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.SerializePartialToString()
1113d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1114d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def assertNotInitialized(self, proto):
1115d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertFalse(proto.IsInitialized())
1116d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertRaises(message.EncodeError, proto.SerializeToString)
1117d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # "Partial" serialization doesn't care if message is uninitialized.
1118d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.SerializePartialToString()
1119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testIsInitialized(self):
1121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Trivial cases - all optional fields and extensions.
1122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
1123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertInitialized(proto)
1124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllExtensions()
1125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertInitialized(proto)
1126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # The case of uninitialized required fields.
1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestRequired()
1129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertNotInitialized(proto)
1130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.a = proto.b = proto.c = 2
1131d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertInitialized(proto)
1132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # The case of uninitialized submessage.
1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestRequiredForeign()
1135d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertInitialized(proto)
1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_message.a = 1
1137d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertNotInitialized(proto)
1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_message.b = 0
1139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_message.c = 0
1140d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertInitialized(proto)
1141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Uninitialized repeated submessage.
1143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1 = proto.repeated_message.add()
1144d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertNotInitialized(proto)
1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1.a = message1.b = message1.c = 0
1146d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertInitialized(proto)
1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Uninitialized repeated group in an extension.
1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllExtensions()
1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = unittest_pb2.TestRequired.multi
1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1 = proto.Extensions[extension].add()
1152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2 = proto.Extensions[extension].add()
1153d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertNotInitialized(proto)
1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1.a = 1
1155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1.b = 1
1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1.c = 1
1157d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertNotInitialized(proto)
1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2.a = 2
1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2.b = 2
1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2.c = 2
1161d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertInitialized(proto)
1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Uninitialized nonrepeated message in an extension.
1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllExtensions()
1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = unittest_pb2.TestRequired.single
1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[extension].a = 1
1167d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertNotInitialized(proto)
1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[extension].b = 2
1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[extension].c = 3
1170d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertInitialized(proto)
1171d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1172d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # Try passing an errors list.
1173d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    errors = []
1174d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto = unittest_pb2.TestRequired()
1175d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertFalse(proto.IsInitialized(errors))
1176d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEqual(errors, ['a', 'b', 'c'])
1177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testStringUTF8Encoding(self):
1179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
1180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Assignment of a unicode object to a field of type 'bytes' is not allowed.
1182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(TypeError,
1183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      setattr, proto, 'optional_bytes', u'unicode object')
1184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Check that the default value is of python's 'unicode' type.
1186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(type(proto.optional_string), unicode)
1187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_string = unicode('Testing')
1189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(proto.optional_string, str('Testing'))
1190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Assign a value of type 'str' which can be encoded in UTF-8.
1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_string = str('Testing')
1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(proto.optional_string, unicode('Testing'))
1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Values of type 'str' are also accepted as long as they can be encoded in
1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # UTF-8.
1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(type(proto.optional_string), str)
1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Try to assign a 'str' value which contains bytes that aren't 7-bit ASCII.
1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(ValueError,
1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      setattr, proto, 'optional_string', str('a\x80a'))
1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Assign a 'str' object which contains a UTF-8 encoded string.
1203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(ValueError,
1204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      setattr, proto, 'optional_string', 'Тест')
1205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # No exception thrown.
1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_string = 'abc'
1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testStringUTF8Serialization(self):
1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_mset_pb2.TestMessageSet()
1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension_message = unittest_mset_pb2.TestMessageSetExtension2
1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = extension_message.message_set_extension
1212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_utf8 = u'Тест'
1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_utf8_bytes = test_utf8.encode('utf-8')
1215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 'Test' in another language, using UTF-8 charset.
1217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[extension].str = test_utf8
1218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Serialize using the MessageSet wire format (this is specified in the
1220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # .proto file).
1221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = proto.SerializeToString()
1222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Check byte size.
1224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(proto.ByteSize(), len(serialized))
1225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raw = unittest_mset_pb2.RawMessageSet()
1227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raw.MergeFromString(serialized)
1228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2 = unittest_mset_pb2.TestMessageSetExtension2()
1230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, len(raw.item))
1232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Check that the type_id is the same as the tag ID in the .proto file.
1233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(raw.item[0].type_id, 1547769)
1234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Check the actually bytes on the wire.
1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(
1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        raw.item[0].message.endswith(test_utf8_bytes))
1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2.MergeFromString(raw.item[0].message)
1239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(type(message2.str), unicode)
1241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(message2.str, test_utf8)
1242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # How about if the bytes on the wire aren't a valid UTF-8 encoded string.
1244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bytes = raw.item[0].message.replace(
1245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        test_utf8_bytes, len(test_utf8_bytes) * '\xff')
1246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertRaises(UnicodeDecodeError, message2.MergeFromString, bytes)
1247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1248d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testEmptyNestedMessage(self):
1249d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto = unittest_pb2.TestAllTypes()
1250d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.optional_nested_message.MergeFrom(
1251d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        unittest_pb2.TestAllTypes.NestedMessage())
1252d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertTrue(proto.HasField('optional_nested_message'))
1253d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1254d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto = unittest_pb2.TestAllTypes()
1255d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.optional_nested_message.CopyFrom(
1256d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        unittest_pb2.TestAllTypes.NestedMessage())
1257d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertTrue(proto.HasField('optional_nested_message'))
1258d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1259d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto = unittest_pb2.TestAllTypes()
1260d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.optional_nested_message.MergeFromString('')
1261d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertTrue(proto.HasField('optional_nested_message'))
1262d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1263d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto = unittest_pb2.TestAllTypes()
1264d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.optional_nested_message.ParseFromString('')
1265d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertTrue(proto.HasField('optional_nested_message'))
1266d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1267d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    serialized = proto.SerializeToString()
1268d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto2 = unittest_pb2.TestAllTypes()
1269d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto2.MergeFromString(serialized)
1270d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertTrue(proto2.HasField('optional_nested_message'))
1271d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1272d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testSetInParent(self):
1273d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto = unittest_pb2.TestAllTypes()
1274d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertFalse(proto.HasField('optionalgroup'))
1275d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.optionalgroup.SetInParent()
1276d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertTrue(proto.HasField('optionalgroup'))
1277d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#  Since we had so many tests for protocol buffer equality, we broke these out
1280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#  into separate TestCase classes.
1281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TestAllTypesEqualityTest(unittest.TestCase):
1284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def setUp(self):
1286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto = unittest_pb2.TestAllTypes()
1287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.second_proto = unittest_pb2.TestAllTypes()
1288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSelfEquality(self):
1290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(self.first_proto, self.first_proto)
1291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testEmptyProtosEqual(self):
1293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(self.first_proto, self.second_proto)
1294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FullProtosEqualityTest(unittest.TestCase):
1297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Equality tests using completely-full protos as a starting point."""
1299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def setUp(self):
1301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto = unittest_pb2.TestAllTypes()
1302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.second_proto = unittest_pb2.TestAllTypes()
1303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllFields(self.first_proto)
1304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllFields(self.second_proto)
1305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testNoneNotEqual(self):
1307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, None)
1308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(None, self.second_proto)
1309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testNotEqualToOtherMessage(self):
1311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    third_proto = unittest_pb2.TestRequired()
1312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, third_proto)
1313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(third_proto, self.second_proto)
1314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testAllFieldsFilledEquality(self):
1316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(self.first_proto, self.second_proto)
1317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testNonRepeatedScalar(self):
1319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Nonrepeated scalar field change should cause inequality.
1320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.optional_int32 += 1
1321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, self.second_proto)
1322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # ...as should clearing a field.
1323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.ClearField('optional_int32')
1324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, self.second_proto)
1325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testNonRepeatedComposite(self):
1327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Change a nonrepeated composite field.
1328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.optional_nested_message.bb += 1
1329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, self.second_proto)
1330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.optional_nested_message.bb -= 1
1331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(self.first_proto, self.second_proto)
1332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Clear a field in the nested message.
1333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.optional_nested_message.ClearField('bb')
1334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, self.second_proto)
1335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.optional_nested_message.bb = (
1336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        self.second_proto.optional_nested_message.bb)
1337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(self.first_proto, self.second_proto)
1338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Remove the nested message entirely.
1339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.ClearField('optional_nested_message')
1340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, self.second_proto)
1341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedScalar(self):
1343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Change a repeated scalar field.
1344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.repeated_int32.append(5)
1345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, self.second_proto)
1346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.ClearField('repeated_int32')
1347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, self.second_proto)
1348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedComposite(self):
1350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Change value within a repeated composite field.
1351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.repeated_nested_message[0].bb += 1
1352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, self.second_proto)
1353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.repeated_nested_message[0].bb -= 1
1354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(self.first_proto, self.second_proto)
1355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Add a value to a repeated composite field.
1356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.repeated_nested_message.add()
1357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, self.second_proto)
1358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.second_proto.repeated_nested_message.add()
1359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(self.first_proto, self.second_proto)
1360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testNonRepeatedScalarHasBits(self):
1362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Ensure that we test "has" bits as well as value for
1363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # nonrepeated scalar field.
1364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.ClearField('optional_int32')
1365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.second_proto.optional_int32 = 0
1366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, self.second_proto)
1367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testNonRepeatedCompositeHasBits(self):
1369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Ensure that we test "has" bits as well as value for
1370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # nonrepeated composite field.
1371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.ClearField('optional_nested_message')
1372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.second_proto.optional_nested_message.ClearField('bb')
1373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(self.first_proto, self.second_proto)
1374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # TODO(robinson): Replace next two lines with method
1375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # to set the "has" bit without changing the value,
1376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # if/when such a method exists.
1377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.optional_nested_message.bb = 0
1378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.first_proto.optional_nested_message.ClearField('bb')
1379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(self.first_proto, self.second_proto)
1380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ExtensionEqualityTest(unittest.TestCase):
1383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testExtensionEquality(self):
1385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto = unittest_pb2.TestAllExtensions()
1386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto = unittest_pb2.TestAllExtensions()
1387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
1388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllExtensions(first_proto)
1389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(first_proto, second_proto)
1390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllExtensions(second_proto)
1391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
1392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Ensure that we check value equality.
1394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto.Extensions[unittest_pb2.optional_int32_extension] += 1
1395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(first_proto, second_proto)
1396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto.Extensions[unittest_pb2.optional_int32_extension] -= 1
1397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
1398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Ensure that we also look at "has" bits.
1400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto.ClearExtension(unittest_pb2.optional_int32_extension)
1401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.Extensions[unittest_pb2.optional_int32_extension] = 0
1402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(first_proto, second_proto)
1403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto.Extensions[unittest_pb2.optional_int32_extension] = 0
1404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
1405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Ensure that differences in cached values
1407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # don't matter if "has" bits are both false.
1408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto = unittest_pb2.TestAllExtensions()
1409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto = unittest_pb2.TestAllExtensions()
1410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
1411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        0, first_proto.Extensions[unittest_pb2.optional_int32_extension])
1412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
1413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MutualRecursionEqualityTest(unittest.TestCase):
1416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testEqualityWithMutualRecursion(self):
1418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto = unittest_pb2.TestMutualRecursionA()
1419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto = unittest_pb2.TestMutualRecursionA()
1420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
1421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto.bb.a.bb.optional_int32 = 23
1422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertNotEqual(first_proto, second_proto)
1423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.bb.a.bb.optional_int32 = 23
1424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
1425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ByteSizeTest(unittest.TestCase):
1428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def setUp(self):
1430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto = unittest_pb2.TestAllTypes()
1431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extended_proto = more_extensions_pb2.ExtendedMessage()
1432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.packed_proto = unittest_pb2.TestPackedTypes()
1433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.packed_extended_proto = unittest_pb2.TestPackedExtensions()
1434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def Size(self):
1436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return self.proto.ByteSize()
1437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testEmptyMessage(self):
1439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.proto.ByteSize())
1440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testVarints(self):
1442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    def Test(i, expected_varint_size):
1443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.proto.Clear()
1444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.proto.optional_int64 = i
1445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # Add one to the varint size for the tag info
1446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # for tag 1.
1447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertEqual(expected_varint_size + 1, self.Size())
1448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Test(0, 1)
1449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Test(1, 1)
1450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for i, num_bytes in zip(range(7, 63, 7), range(1, 10000)):
1451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Test((1 << i) - 1, num_bytes)
1452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Test(-1, 10)
1453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Test(-2, 10)
1454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Test(-(1 << 63), 10)
1455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testStrings(self):
1457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_string = ''
1458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Need one byte for tag info (tag #14), and one byte for length.
1459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, self.Size())
1460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_string = 'abc'
1462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Need one byte for tag info (tag #14), and one byte for length.
1463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2 + len(self.proto.optional_string), self.Size())
1464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_string = 'x' * 128
1466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Need one byte for tag info (tag #14), and TWO bytes for length.
1467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3 + len(self.proto.optional_string), self.Size())
1468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testOtherNumerics(self):
1470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_fixed32 = 1234
1471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # One byte for tag and 4 bytes for fixed32.
1472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, self.Size())
1473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto = unittest_pb2.TestAllTypes()
1474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_fixed64 = 1234
1476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # One byte for tag and 8 bytes for fixed64.
1477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(9, self.Size())
1478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto = unittest_pb2.TestAllTypes()
1479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_float = 1.234
1481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # One byte for tag and 4 bytes for float.
1482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, self.Size())
1483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto = unittest_pb2.TestAllTypes()
1484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_double = 1.234
1486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # One byte for tag and 8 bytes for float.
1487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(9, self.Size())
1488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto = unittest_pb2.TestAllTypes()
1489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_sint32 = 64
1491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # One byte for tag and 2 bytes for zig-zag-encoded 64.
1492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, self.Size())
1493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto = unittest_pb2.TestAllTypes()
1494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testComposites(self):
1496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 3 bytes.
1497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_nested_message.bb = (1 << 14)
1498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Plus one byte for bb tag.
1499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Plus 1 byte for optional_nested_message serialized size.
1500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Plus two bytes for optional_nested_message tag.
1501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3 + 1 + 1 + 2, self.Size())
1502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testGroups(self):
1504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 4 bytes.
1505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optionalgroup.a = (1 << 21)
1506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Plus two bytes for |a| tag.
1507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Plus 2 * two bytes for START_GROUP and END_GROUP tags.
1508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(4 + 2 + 2*2, self.Size())
1509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedScalars(self):
1511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.repeated_int32.append(10)  # 1 byte.
1512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.repeated_int32.append(128)  # 2 bytes.
1513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Also need 2 bytes for each entry for tag.
1514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1 + 2 + 2*2, self.Size())
1515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedScalarsExtend(self):
1517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.repeated_int32.extend([10, 128])  # 3 bytes.
1518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Also need 2 bytes for each entry for tag.
1519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1 + 2 + 2*2, self.Size())
1520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedScalarsRemove(self):
1522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.repeated_int32.append(10)  # 1 byte.
1523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.repeated_int32.append(128)  # 2 bytes.
1524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Also need 2 bytes for each entry for tag.
1525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1 + 2 + 2*2, self.Size())
1526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.repeated_int32.remove(128)
1527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1 + 2, self.Size())
1528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedComposites(self):
1530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Empty message.  2 bytes tag plus 1 byte length.
1531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foreign_message_0 = self.proto.repeated_nested_message.add()
1532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
1533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foreign_message_1 = self.proto.repeated_nested_message.add()
1534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foreign_message_1.bb = 7
1535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size())
1536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedCompositesDelete(self):
1538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Empty message.  2 bytes tag plus 1 byte length.
1539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foreign_message_0 = self.proto.repeated_nested_message.add()
1540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
1541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foreign_message_1 = self.proto.repeated_nested_message.add()
1542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foreign_message_1.bb = 9
1543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size())
1544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
1546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del self.proto.repeated_nested_message[0]
1547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2 + 1 + 1 + 1, self.Size())
1548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Now add a new message.
1550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foreign_message_2 = self.proto.repeated_nested_message.add()
1551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    foreign_message_2.bb = 12
1552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
1554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
1555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2 + 1 + 1 + 1 + 2 + 1 + 1 + 1, self.Size())
1556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
1558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del self.proto.repeated_nested_message[1]
1559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2 + 1 + 1 + 1, self.Size())
1560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del self.proto.repeated_nested_message[0]
1562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.Size())
1563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testRepeatedGroups(self):
1565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 2-byte START_GROUP plus 2-byte END_GROUP.
1566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    group_0 = self.proto.repeatedgroup.add()
1567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 2-byte START_GROUP plus 2-byte |a| tag + 1-byte |a|
1568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # plus 2-byte END_GROUP.
1569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    group_1 = self.proto.repeatedgroup.add()
1570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    group_1.a =  7
1571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2 + 2 + 2 + 2 + 1 + 2, self.Size())
1572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testExtensions(self):
1574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllExtensions()
1575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, proto.ByteSize())
1576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = unittest_pb2.optional_int32_extension  # Field #1, 1 byte.
1577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[extension] = 23
1578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 1 byte for tag, 1 byte for value.
1579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, proto.ByteSize())
1580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testCacheInvalidationForNonrepeatedScalar(self):
1582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test non-extension.
1583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_int32 = 1
1584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, self.proto.ByteSize())
1585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_int32 = 128
1586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, self.proto.ByteSize())
1587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.ClearField('optional_int32')
1588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.proto.ByteSize())
1589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test within extension.
1591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = more_extensions_pb2.optional_int_extension
1592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extended_proto.Extensions[extension] = 1
1593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, self.extended_proto.ByteSize())
1594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extended_proto.Extensions[extension] = 128
1595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, self.extended_proto.ByteSize())
1596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extended_proto.ClearExtension(extension)
1597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.extended_proto.ByteSize())
1598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testCacheInvalidationForRepeatedScalar(self):
1600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test non-extension.
1601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.repeated_int32.append(1)
1602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, self.proto.ByteSize())
1603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.repeated_int32.append(1)
1604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(6, self.proto.ByteSize())
1605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.repeated_int32[1] = 128
1606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(7, self.proto.ByteSize())
1607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.ClearField('repeated_int32')
1608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.proto.ByteSize())
1609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test within extension.
1611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = more_extensions_pb2.repeated_int_extension
1612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    repeated = self.extended_proto.Extensions[extension]
1613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    repeated.append(1)
1614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, self.extended_proto.ByteSize())
1615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    repeated.append(1)
1616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(4, self.extended_proto.ByteSize())
1617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    repeated[1] = 128
1618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, self.extended_proto.ByteSize())
1619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extended_proto.ClearExtension(extension)
1620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.extended_proto.ByteSize())
1621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testCacheInvalidationForNonrepeatedMessage(self):
1623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test non-extension.
1624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_foreign_message.c = 1
1625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, self.proto.ByteSize())
1626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_foreign_message.c = 128
1627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(6, self.proto.ByteSize())
1628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.optional_foreign_message.ClearField('c')
1629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, self.proto.ByteSize())
1630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.ClearField('optional_foreign_message')
1631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.proto.ByteSize())
1632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child = self.proto.optional_foreign_message
1633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.ClearField('optional_foreign_message')
1634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child.c = 128
1635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.proto.ByteSize())
1636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test within extension.
1638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = more_extensions_pb2.optional_message_extension
1639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child = self.extended_proto.Extensions[extension]
1640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.extended_proto.ByteSize())
1641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child.foreign_message_int = 1
1642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(4, self.extended_proto.ByteSize())
1643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child.foreign_message_int = 128
1644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, self.extended_proto.ByteSize())
1645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extended_proto.ClearExtension(extension)
1646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.extended_proto.ByteSize())
1647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testCacheInvalidationForRepeatedMessage(self):
1649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test non-extension.
1650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child0 = self.proto.repeated_foreign_message.add()
1651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, self.proto.ByteSize())
1652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.repeated_foreign_message.add()
1653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(6, self.proto.ByteSize())
1654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child0.c = 1
1655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(8, self.proto.ByteSize())
1656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.proto.ClearField('repeated_foreign_message')
1657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.proto.ByteSize())
1658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Test within extension.
1660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = more_extensions_pb2.repeated_message_extension
1661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child_list = self.extended_proto.Extensions[extension]
1662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child0 = child_list.add()
1663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, self.extended_proto.ByteSize())
1664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child_list.add()
1665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(4, self.extended_proto.ByteSize())
1666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child0.foreign_message_int = 1
1667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(6, self.extended_proto.ByteSize())
1668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    child0.ClearField('foreign_message_int')
1669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(4, self.extended_proto.ByteSize())
1670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extended_proto.ClearExtension(extension)
1671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.extended_proto.ByteSize())
1672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testPackedRepeatedScalars(self):
1674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.packed_proto.ByteSize())
1675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.packed_proto.packed_int32.append(10)   # 1 byte.
1677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.packed_proto.packed_int32.append(128)  # 2 bytes.
1678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # The tag is 2 bytes (the field number is 90), and the varint
1679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # storing the length is 1 byte.
1680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int_size = 1 + 2 + 3
1681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(int_size, self.packed_proto.ByteSize())
1682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.packed_proto.packed_double.append(4.2)   # 8 bytes
1684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.packed_proto.packed_double.append(3.25)  # 8 bytes
1685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # 2 more tag bytes, 1 more length byte.
1686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    double_size = 8 + 8 + 3
1687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(int_size+double_size, self.packed_proto.ByteSize())
1688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.packed_proto.ClearField('packed_int32')
1690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(double_size, self.packed_proto.ByteSize())
1691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testPackedExtensions(self):
1693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(0, self.packed_extended_proto.ByteSize())
1694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension = self.packed_extended_proto.Extensions[
1695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        unittest_pb2.packed_fixed32_extension]
1696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension.extend([1, 2, 3, 4])   # 16 bytes
1697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Tag is 3 bytes.
1698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(19, self.packed_extended_proto.ByteSize())
1699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): We need cross-language serialization consistency tests.
1702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Issues to be sure to cover include:
1703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   * Handling of unrecognized tags ("uninterpreted_bytes").
1704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   * Handling of MessageSets.
1705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   * Consistent ordering of tags in the wire format,
1706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     including ordering between extensions and non-extension
1707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     fields.
1708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   * Consistent serialization of negative numbers, especially
1709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     negative int32s.
1710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   * Handling of empty submessages (with and without "has"
1711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     bits set).
1712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass SerializationTest(unittest.TestCase):
1714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSerializeEmtpyMessage(self):
1716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto = unittest_pb2.TestAllTypes()
1717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto = unittest_pb2.TestAllTypes()
1718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = first_proto.SerializeToString()
1719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto.ByteSize(), len(serialized))
1720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.MergeFromString(serialized)
1721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
1722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSerializeAllFields(self):
1724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto = unittest_pb2.TestAllTypes()
1725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto = unittest_pb2.TestAllTypes()
1726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllFields(first_proto)
1727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = first_proto.SerializeToString()
1728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto.ByteSize(), len(serialized))
1729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.MergeFromString(serialized)
1730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
1731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSerializeAllExtensions(self):
1733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto = unittest_pb2.TestAllExtensions()
1734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto = unittest_pb2.TestAllExtensions()
1735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllExtensions(first_proto)
1736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = first_proto.SerializeToString()
1737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.MergeFromString(serialized)
1738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
1739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1740d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testSerializeNegativeValues(self):
1741d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    first_proto = unittest_pb2.TestAllTypes()
1742d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1743d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    first_proto.optional_int32 = -1
1744d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    first_proto.optional_int64 = -(2 << 40)
1745d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    first_proto.optional_sint32 = -3
1746d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    first_proto.optional_sint64 = -(4 << 40)
1747d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    first_proto.optional_sfixed32 = -5
1748d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    first_proto.optional_sfixed64 = -(6 << 40)
1749d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1750d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    second_proto = unittest_pb2.TestAllTypes.FromString(
1751d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        first_proto.SerializeToString())
1752d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1753d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEqual(first_proto, second_proto)
1754d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1755d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testParseTruncated(self):
1756d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    first_proto = unittest_pb2.TestAllTypes()
1757d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    test_util.SetAllFields(first_proto)
1758d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    serialized = first_proto.SerializeToString()
1759d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1760d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    for truncation_point in xrange(len(serialized) + 1):
1761d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      try:
1762d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        second_proto = unittest_pb2.TestAllTypes()
1763d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        unknown_fields = unittest_pb2.TestEmptyMessage()
1764d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        pos = second_proto._InternalParse(serialized, 0, truncation_point)
1765d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        # If we didn't raise an error then we read exactly the amount expected.
1766d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        self.assertEqual(truncation_point, pos)
1767d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1768d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        # Parsing to unknown fields should not throw if parsing to known fields
1769d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        # did not.
1770d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        try:
1771d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          pos2 = unknown_fields._InternalParse(serialized, 0, truncation_point)
1772d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          self.assertEqual(truncation_point, pos2)
1773d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        except message.DecodeError:
1774d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          self.fail('Parsing unknown fields failed when parsing known fields '
1775d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                    'did not.')
1776d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      except message.DecodeError:
1777d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        # Parsing unknown fields should also fail.
1778d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        self.assertRaises(message.DecodeError, unknown_fields._InternalParse,
1779d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                          serialized, 0, truncation_point)
1780d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testCanonicalSerializationOrder(self):
1782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = more_messages_pb2.OutOfOrderFields()
1783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # These are also their tag numbers.  Even though we're setting these in
1784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # reverse-tag order AND they're listed in reverse tag-order in the .proto
1785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # file, they should nonetheless be serialized in tag order.
1786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_sint32 = 5
1787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[more_messages_pb2.optional_uint64] = 4
1788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_uint32 = 3
1789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[more_messages_pb2.optional_int64] = 2
1790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_int32 = 1
1791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = proto.SerializeToString()
1792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(proto.ByteSize(), len(serialized))
1793d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    d = _MiniDecoder(serialized)
1794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ReadTag = d.ReadFieldNumberAndWireType
1795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual((1, wire_format.WIRETYPE_VARINT), ReadTag())
1796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, d.ReadInt32())
1797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual((2, wire_format.WIRETYPE_VARINT), ReadTag())
1798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, d.ReadInt64())
1799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual((3, wire_format.WIRETYPE_VARINT), ReadTag())
1800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, d.ReadUInt32())
1801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual((4, wire_format.WIRETYPE_VARINT), ReadTag())
1802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(4, d.ReadUInt64())
1803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual((5, wire_format.WIRETYPE_VARINT), ReadTag())
1804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(5, d.ReadSInt32())
1805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testCanonicalSerializationOrderSameAsCpp(self):
1807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Copy of the same test we use for C++.
1808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestFieldOrderings()
1809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllFieldsAndExtensions(proto)
1810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = proto.SerializeToString()
1811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.ExpectAllFieldsAndExtensionsInOrder(serialized)
1812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMergeFromStringWhenFieldsAlreadySet(self):
1814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto = unittest_pb2.TestAllTypes()
1815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto.repeated_string.append('foobar')
1816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto.optional_int32 = 23
1817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto.optional_nested_message.bb = 42
1818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = first_proto.SerializeToString()
1819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto = unittest_pb2.TestAllTypes()
1821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.repeated_string.append('baz')
1822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.optional_int32 = 100
1823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.optional_nested_message.bb = 999
1824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.MergeFromString(serialized)
1826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Ensure that we append to repeated fields.
1827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(['baz', 'foobar'], list(second_proto.repeated_string))
1828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Ensure that we overwrite nonrepeatd scalars.
1829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(23, second_proto.optional_int32)
1830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Ensure that we recursively call MergeFromString() on
1831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # submessages.
1832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(42, second_proto.optional_nested_message.bb)
1833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMessageSetWireFormat(self):
1835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_mset_pb2.TestMessageSet()
1836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
1837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension_message2 = unittest_mset_pb2.TestMessageSetExtension2
1838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension1 = extension_message1.message_set_extension
1839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension2 = extension_message2.message_set_extension
1840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[extension1].i = 123
1841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.Extensions[extension2].str = 'foo'
1842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Serialize using the MessageSet wire format (this is specified in the
1844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # .proto file).
1845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = proto.SerializeToString()
1846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raw = unittest_mset_pb2.RawMessageSet()
1848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(False,
1849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     raw.DESCRIPTOR.GetOptions().message_set_wire_format)
1850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raw.MergeFromString(serialized)
1851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, len(raw.item))
1852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1 = unittest_mset_pb2.TestMessageSetExtension1()
1854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1.MergeFromString(raw.item[0].message)
1855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(123, message1.i)
1856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2 = unittest_mset_pb2.TestMessageSetExtension2()
1858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2.MergeFromString(raw.item[1].message)
1859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual('foo', message2.str)
1860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Deserialize using the MessageSet wire format.
1862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_mset_pb2.TestMessageSet()
1863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFromString(serialized)
1864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(123, proto2.Extensions[extension1].i)
1865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual('foo', proto2.Extensions[extension2].str)
1866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Check byte size.
1868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(proto2.ByteSize(), len(serialized))
1869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(proto.ByteSize(), len(serialized))
1870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMessageSetWireFormatUnknownExtension(self):
1872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Create a message using the message set wire format with an unknown
1873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # message.
1874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raw = unittest_mset_pb2.RawMessageSet()
1875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Add an item.
1877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    item = raw.item.add()
1878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    item.type_id = 1545008
1879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
1880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1 = unittest_mset_pb2.TestMessageSetExtension1()
1881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1.i = 12345
1882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    item.message = message1.SerializeToString()
1883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Add a second, unknown extension.
1885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    item = raw.item.add()
1886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    item.type_id = 1545009
1887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
1888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1 = unittest_mset_pb2.TestMessageSetExtension1()
1889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1.i = 12346
1890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    item.message = message1.SerializeToString()
1891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Add another unknown extension.
1893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    item = raw.item.add()
1894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    item.type_id = 1545010
1895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1 = unittest_mset_pb2.TestMessageSetExtension2()
1896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message1.str = 'foo'
1897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    item.message = message1.SerializeToString()
1898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = raw.SerializeToString()
1900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Parse message using the message set wire format.
1902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_mset_pb2.TestMessageSet()
1903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.MergeFromString(serialized)
1904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Check that the message parsed well.
1906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
1907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension1 = extension_message1.message_set_extension
1908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEquals(12345, proto.Extensions[extension1].i)
1909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testUnknownFields(self):
1911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
1912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllFields(proto)
1913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = proto.SerializeToString()
1915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # The empty message should be parsable with all of the fields
1917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # unknown.
1918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestEmptyMessage()
1919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Parsing this message should succeed.
1921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFromString(serialized)
1922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Now test with a int64 field set.
1924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
1925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_int64 = 0x0fffffffffffffff
1926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = proto.SerializeToString()
1927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # The empty message should be parsable with all of the fields
1928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # unknown.
1929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestEmptyMessage()
1930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Parsing this message should succeed.
1931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFromString(serialized)
1932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def _CheckRaises(self, exc_class, callable_obj, exception):
1934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """This method checks if the excpetion type and message are as expected."""
1935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    try:
1936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      callable_obj()
1937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    except exc_class, ex:
1938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      # Check if the exception message is the right one.
1939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertEqual(exception, str(ex))
1940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
1941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
1942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      raise self.failureException('%s not raised' % str(exc_class))
1943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSerializeUninitialized(self):
1945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestRequired()
1946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._CheckRaises(
1947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        message.EncodeError,
1948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        proto.SerializeToString,
1949d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        'Message is missing required fields: a,b,c')
1950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Shouldn't raise exceptions.
1951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    partial = proto.SerializePartialToString()
1952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.a = 1
1954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._CheckRaises(
1955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        message.EncodeError,
1956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        proto.SerializeToString,
1957d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        'Message is missing required fields: b,c')
1958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Shouldn't raise exceptions.
1959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    partial = proto.SerializePartialToString()
1960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.b = 2
1962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._CheckRaises(
1963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        message.EncodeError,
1964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        proto.SerializeToString,
1965d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        'Message is missing required fields: c')
1966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Shouldn't raise exceptions.
1967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    partial = proto.SerializePartialToString()
1968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.c = 3
1970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = proto.SerializeToString()
1971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Shouldn't raise exceptions.
1972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    partial = proto.SerializePartialToString()
1973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2 = unittest_pb2.TestRequired()
1975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.MergeFromString(serialized)
1976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto2.a)
1977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, proto2.b)
1978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, proto2.c)
1979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto2.ParseFromString(partial)
1980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto2.a)
1981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, proto2.b)
1982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, proto2.c)
1983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1984d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testSerializeUninitializedSubMessage(self):
1985d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto = unittest_pb2.TestRequiredForeign()
1986d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1987d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # Sub-message doesn't exist yet, so this succeeds.
1988d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.SerializeToString()
1989d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1990d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.optional_message.a = 1
1991d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._CheckRaises(
1992d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        message.EncodeError,
1993d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        proto.SerializeToString,
1994d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        'Message is missing required fields: '
1995d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        'optional_message.b,optional_message.c')
1996d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1997d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.optional_message.b = 2
1998d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.optional_message.c = 3
1999d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.SerializeToString()
2000d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2001d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.repeated_message.add().a = 1
2002d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.repeated_message.add().b = 2
2003d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._CheckRaises(
2004d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        message.EncodeError,
2005d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        proto.SerializeToString,
2006d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        'Message is missing required fields: '
2007d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        'repeated_message[0].b,repeated_message[0].c,'
2008d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        'repeated_message[1].a,repeated_message[1].c')
2009d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2010d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.repeated_message[0].b = 2
2011d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.repeated_message[0].c = 3
2012d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.repeated_message[1].a = 1
2013d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.repeated_message[1].c = 3
2014d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.SerializeToString()
2015d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSerializeAllPackedFields(self):
2017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto = unittest_pb2.TestPackedTypes()
2018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto = unittest_pb2.TestPackedTypes()
2019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllPackedFields(first_proto)
2020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = first_proto.SerializeToString()
2021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto.ByteSize(), len(serialized))
2022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bytes_read = second_proto.MergeFromString(serialized)
2023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(second_proto.ByteSize(), bytes_read)
2024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
2025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testSerializeAllPackedExtensions(self):
2027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto = unittest_pb2.TestPackedExtensions()
2028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto = unittest_pb2.TestPackedExtensions()
2029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_util.SetAllPackedExtensions(first_proto)
2030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = first_proto.SerializeToString()
2031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bytes_read = second_proto.MergeFromString(serialized)
2032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(second_proto.ByteSize(), bytes_read)
2033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(first_proto, second_proto)
2034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMergePackedFromStringWhenSomeFieldsAlreadySet(self):
2036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto = unittest_pb2.TestPackedTypes()
2037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto.packed_int32.extend([1, 2])
2038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    first_proto.packed_double.append(3.0)
2039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = first_proto.SerializeToString()
2040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto = unittest_pb2.TestPackedTypes()
2042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.packed_int32.append(3)
2043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.packed_double.extend([1.0, 2.0])
2044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.packed_sint32.append(4)
2045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    second_proto.MergeFromString(serialized)
2047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([3, 1, 2], second_proto.packed_int32)
2048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([1.0, 2.0, 3.0], second_proto.packed_double)
2049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([4], second_proto.packed_sint32)
2050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testPackedFieldsWireFormat(self):
2052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestPackedTypes()
2053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.packed_int32.extend([1, 2, 150, 3])  # 1 + 1 + 2 + 1 bytes
2054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.packed_double.extend([1.0, 1000.0])  # 8 + 8 bytes
2055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.packed_float.append(2.0)             # 4 bytes, will be before double
2056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    serialized = proto.SerializeToString()
2057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(proto.ByteSize(), len(serialized))
2058d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    d = _MiniDecoder(serialized)
2059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ReadTag = d.ReadFieldNumberAndWireType
2060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual((90, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
2061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1+1+1+2, d.ReadInt32())
2062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, d.ReadInt32())
2063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, d.ReadInt32())
2064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(150, d.ReadInt32())
2065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, d.ReadInt32())
2066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual((100, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
2067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(4, d.ReadInt32())
2068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2.0, d.ReadFloat())
2069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual((101, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
2070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(8+8, d.ReadInt32())
2071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1.0, d.ReadDouble())
2072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1000.0, d.ReadDouble())
2073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(d.EndOfStream())
2074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2075d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testParsePackedFromUnpacked(self):
2076d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    unpacked = unittest_pb2.TestUnpackedTypes()
2077d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    test_util.SetAllUnpackedFields(unpacked)
2078d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    packed = unittest_pb2.TestPackedTypes()
2079d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    packed.MergeFromString(unpacked.SerializeToString())
2080d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    expected = unittest_pb2.TestPackedTypes()
2081d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    test_util.SetAllPackedFields(expected)
2082d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEqual(expected, packed)
2083d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2084d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testParseUnpackedFromPacked(self):
2085d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    packed = unittest_pb2.TestPackedTypes()
2086d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    test_util.SetAllPackedFields(packed)
2087d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    unpacked = unittest_pb2.TestUnpackedTypes()
2088d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    unpacked.MergeFromString(packed.SerializeToString())
2089d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    expected = unittest_pb2.TestUnpackedTypes()
2090d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    test_util.SetAllUnpackedFields(expected)
2091d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assertEqual(expected, unpacked)
2092d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testFieldNumbers(self):
2094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
2095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1)
2096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1)
2097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16)
2098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
2099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      unittest_pb2.TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18)
2100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
2101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      unittest_pb2.TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21)
2102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31)
2103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46)
2104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
2105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      unittest_pb2.TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48)
2106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
2107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      unittest_pb2.TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51)
2108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testExtensionFieldNumbers(self):
2110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestRequired.single.number, 1000)
2111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestRequired.SINGLE_FIELD_NUMBER, 1000)
2112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestRequired.multi.number, 1001)
2113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestRequired.MULTI_FIELD_NUMBER, 1001)
2114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.optional_int32_extension.number, 1)
2115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1)
2116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.optionalgroup_extension.number, 16)
2117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16)
2118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.optional_nested_message_extension.number, 18)
2119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
2120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      unittest_pb2.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18)
2121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.optional_nested_enum_extension.number, 21)
2122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER,
2123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      21)
2124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.repeated_int32_extension.number, 31)
2125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31)
2126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.repeatedgroup_extension.number, 46)
2127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46)
2128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.repeated_nested_message_extension.number, 48)
2129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(
2130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      unittest_pb2.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48)
2131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.repeated_nested_enum_extension.number, 51)
2132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER,
2133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      51)
2134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testInitKwargs(self):
2136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes(
2137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        optional_int32=1,
2138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        optional_string='foo',
2139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        optional_bool=True,
2140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        optional_bytes='bar',
2141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        optional_nested_message=unittest_pb2.TestAllTypes.NestedMessage(bb=1),
2142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        optional_foreign_message=unittest_pb2.ForeignMessage(c=1),
2143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        optional_nested_enum=unittest_pb2.TestAllTypes.FOO,
2144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        optional_foreign_enum=unittest_pb2.FOREIGN_FOO,
2145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        repeated_int32=[1, 2, 3])
2146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.IsInitialized())
2147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_int32'))
2148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_string'))
2149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_bool'))
2150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_bytes'))
2151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_nested_message'))
2152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_foreign_message'))
2153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_nested_enum'))
2154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_foreign_enum'))
2155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.optional_int32)
2156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual('foo', proto.optional_string)
2157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(True, proto.optional_bool)
2158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual('bar', proto.optional_bytes)
2159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.optional_nested_message.bb)
2160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.optional_foreign_message.c)
2161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestAllTypes.FOO,
2162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     proto.optional_nested_enum)
2163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.FOREIGN_FOO, proto.optional_foreign_enum)
2164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual([1, 2, 3], proto.repeated_int32)
2165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testInitArgsUnknownFieldName(self):
2167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    def InitalizeEmptyMessageWithExtraKeywordArg():
2168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      unused_proto = unittest_pb2.TestEmptyMessage(unknown='unknown')
2169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._CheckRaises(ValueError,
2170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      InitalizeEmptyMessageWithExtraKeywordArg,
2171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      'Protocol message has no "unknown" field.')
2172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testInitRequiredKwargs(self):
2174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestRequired(a=1, b=1, c=1)
2175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.IsInitialized())
2176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('a'))
2177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('b'))
2178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('c'))
2179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.HasField('dummy2'))
2180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.a)
2181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.b)
2182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.c)
2183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testInitRequiredForeignKwargs(self):
2185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestRequiredForeign(
2186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        optional_message=unittest_pb2.TestRequired(a=1, b=1, c=1))
2187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.IsInitialized())
2188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.HasField('optional_message'))
2189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.optional_message.IsInitialized())
2190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.optional_message.HasField('a'))
2191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.optional_message.HasField('b'))
2192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.optional_message.HasField('c'))
2193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(not proto.optional_message.HasField('dummy2'))
2194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(unittest_pb2.TestRequired(a=1, b=1, c=1),
2195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     proto.optional_message)
2196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.optional_message.a)
2197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.optional_message.b)
2198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.optional_message.c)
2199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testInitRepeatedKwargs(self):
2201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes(repeated_int32=[1, 2, 3])
2202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertTrue(proto.IsInitialized())
2203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(1, proto.repeated_int32[0])
2204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(2, proto.repeated_int32[1])
2205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(3, proto.repeated_int32[2])
2206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass OptionsTest(unittest.TestCase):
2209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testMessageOptions(self):
2211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_mset_pb2.TestMessageSet()
2212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(True,
2213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     proto.DESCRIPTOR.GetOptions().message_set_wire_format)
2214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
2215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(False,
2216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     proto.DESCRIPTOR.GetOptions().message_set_wire_format)
2217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testPackedOptions(self):
2219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestAllTypes()
2220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_int32 = 1
2221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.optional_double = 3.0
2222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for field_descriptor, _ in proto.ListFields():
2223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertEqual(False, field_descriptor.GetOptions().packed)
2224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto = unittest_pb2.TestPackedTypes()
2226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.packed_int32.append(1)
2227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    proto.packed_double.append(3.0)
2228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for field_descriptor, _ in proto.ListFields():
2229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertEqual(True, field_descriptor.GetOptions().packed)
2230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertEqual(reflection._FieldDescriptor.LABEL_REPEATED,
2231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                       field_descriptor.label)
2232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif __name__ == '__main__':
2236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest.main()
2237