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