1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <iostream>
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/logging.h>
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/arena_test_util.h>
39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/map_lite_unittest.pb.h>
40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/map_lite_test_util.h>
41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/test_util_lite.h>
42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/unittest_lite.pb.h>
43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/io/coded_stream.h>
44a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
45a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/wire_format_lite.h>
46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/wire_format_lite_inl.h>
47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/strutil.h>
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing namespace std;
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace {
52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Helper methods to test parsing merge behavior.
53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ExpectMessageMerged(const google::protobuf::unittest::TestAllTypesLite& message) {
54a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  GOOGLE_CHECK(message.optional_int32() == 3);
55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  GOOGLE_CHECK(message.optional_int64() == 2);
56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  GOOGLE_CHECK(message.optional_string() == "hello");
57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
58a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
59a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid AssignParsingMergeMessages(
60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::unittest::TestAllTypesLite* msg1,
61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::unittest::TestAllTypesLite* msg2,
62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::unittest::TestAllTypesLite* msg3) {
63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  msg1->set_optional_int32(1);
64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  msg2->set_optional_int64(2);
65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  msg3->set_optional_int32(3);
66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  msg3->set_optional_string("hello");
67a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
68a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid SetAllTypesInEmptyMessageUnknownFields(
70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::unittest::TestEmptyMessageLite* empty_message) {
71a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  protobuf_unittest::TestAllTypesLite message;
72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  google::protobuf::TestUtilLite::ExpectClear(message);
73a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  google::protobuf::TestUtilLite::SetAllFields(&message);
74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  string data = message.SerializeAsString();
75a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  empty_message->ParseFromString(data);
76a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
77a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
78a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid SetSomeTypesInEmptyMessageUnknownFields(
79a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::unittest::TestEmptyMessageLite* empty_message) {
80a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  protobuf_unittest::TestAllTypesLite message;
81a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  google::protobuf::TestUtilLite::ExpectClear(message);
82a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  message.set_optional_int32(101);
83a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  message.set_optional_int64(102);
84a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  message.set_optional_uint32(103);
85a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  message.set_optional_uint64(104);
86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  string data = message.SerializeAsString();
87a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  empty_message->ParseFromString(data);
88a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace
91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define EXPECT_TRUE GOOGLE_CHECK
93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define ASSERT_TRUE GOOGLE_CHECK
94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define EXPECT_FALSE(COND) GOOGLE_CHECK(!(COND))
95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define EXPECT_EQ GOOGLE_CHECK_EQ
96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define ASSERT_EQ GOOGLE_CHECK_EQ
97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint main(int argc, char* argv[]) {
99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  string data, data2, packed_data;
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    protobuf_unittest::TestAllTypesLite message, message2, message3;
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectClear(message);
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::SetAllFields(&message);
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2.CopyFrom(message);
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    data = message.SerializeAsString();
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message3.ParseFromString(data);
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectAllFieldsSet(message);
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectAllFieldsSet(message2);
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectAllFieldsSet(message3);
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ModifyRepeatedFields(&message);
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectRepeatedFieldsModified(message);
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message.Clear();
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectClear(message);
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    protobuf_unittest::TestAllExtensionsLite message, message2, message3;
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectExtensionsClear(message);
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::SetAllExtensions(&message);
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2.CopyFrom(message);
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string extensions_data = message.SerializeAsString();
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message3.ParseFromString(extensions_data);
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message);
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message2);
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message3);
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ModifyRepeatedExtensions(&message);
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectRepeatedExtensionsModified(message);
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message.Clear();
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectExtensionsClear(message);
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    protobuf_unittest::TestPackedTypesLite message, message2, message3;
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedClear(message);
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::SetPackedFields(&message);
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2.CopyFrom(message);
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    packed_data = message.SerializeAsString();
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message3.ParseFromString(packed_data);
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message);
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message2);
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message3);
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ModifyPackedFields(&message);
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedFieldsModified(message);
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message.Clear();
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedClear(message);
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    protobuf_unittest::TestPackedExtensionsLite message, message2, message3;
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message);
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::SetPackedExtensions(&message);
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message2.CopyFrom(message);
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string packed_extensions_data = message.SerializeAsString();
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_CHECK(packed_extensions_data == packed_data);
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message3.ParseFromString(packed_extensions_data);
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message);
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message2);
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message3);
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ModifyPackedExtensions(&message);
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedExtensionsModified(message);
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message.Clear();
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message);
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  {
167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Test that if an optional or required message/group field appears multiple
168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // times in the input, they need to be merged.
169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::unittest::TestParsingMergeLite::RepeatedFieldsGenerator generator;
170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::unittest::TestAllTypesLite* msg1;
171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::unittest::TestAllTypesLite* msg2;
172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::unittest::TestAllTypesLite* msg3;
173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define ASSIGN_REPEATED_FIELD(FIELD)                \
175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  msg1 = generator.add_##FIELD();                   \
176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  msg2 = generator.add_##FIELD();                   \
177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  msg3 = generator.add_##FIELD();                   \
178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  AssignParsingMergeMessages(msg1, msg2, msg3)
179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ASSIGN_REPEATED_FIELD(field1);
181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ASSIGN_REPEATED_FIELD(field2);
182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ASSIGN_REPEATED_FIELD(field3);
183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ASSIGN_REPEATED_FIELD(ext1);
184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ASSIGN_REPEATED_FIELD(ext2);
185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef ASSIGN_REPEATED_FIELD
187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define ASSIGN_REPEATED_GROUP(FIELD)                \
188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  msg1 = generator.add_##FIELD()->mutable_field1(); \
189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  msg2 = generator.add_##FIELD()->mutable_field1(); \
190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  msg3 = generator.add_##FIELD()->mutable_field1(); \
191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  AssignParsingMergeMessages(msg1, msg2, msg3)
192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ASSIGN_REPEATED_GROUP(group1);
194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ASSIGN_REPEATED_GROUP(group2);
195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef ASSIGN_REPEATED_GROUP
197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    string buffer;
199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    generator.SerializeToString(&buffer);
200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::unittest::TestParsingMergeLite parsing_merge;
201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    parsing_merge.ParseFromString(buffer);
202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Required and optional fields should be merged.
204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ExpectMessageMerged(parsing_merge.required_all_types());
205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ExpectMessageMerged(parsing_merge.optional_all_types());
206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ExpectMessageMerged(
207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        parsing_merge.optionalgroup().optional_group_all_types());
208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ExpectMessageMerged(parsing_merge.GetExtension(
209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        google::protobuf::unittest::TestParsingMergeLite::optional_ext));
210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Repeated fields should not be merged.
212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    GOOGLE_CHECK(parsing_merge.repeated_all_types_size() == 3);
213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    GOOGLE_CHECK(parsing_merge.repeatedgroup_size() == 3);
214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    GOOGLE_CHECK(parsing_merge.ExtensionSize(
215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        google::protobuf::unittest::TestParsingMergeLite::repeated_ext) == 3);
216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Test unknown fields support for lite messages.
219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  {
220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestAllTypesLite message, message2;
221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestEmptyMessageLite empty_message;
222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectClear(message);
223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::SetAllFields(&message);
224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = message.SerializeAsString();
225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    empty_message.ParseFromString(data);
226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data.clear();
227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = empty_message.SerializeAsString();
228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message2.ParseFromString(data);
229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = message2.SerializeAsString();
230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectAllFieldsSet(message2);
231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message.Clear();
232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectClear(message);
233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  {
236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestAllExtensionsLite message, message2;
237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestEmptyMessageLite empty_message;
238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectExtensionsClear(message);
239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::SetAllExtensions(&message);
240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = message.SerializeAsString();
241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    empty_message.ParseFromString(data);
242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data.clear();
243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = empty_message.SerializeAsString();
244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message2.ParseFromString(data);
245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = message2.SerializeAsString();
246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message2);
247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message.Clear();
248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectExtensionsClear(message);
249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  {
252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestPackedTypesLite message, message2;
253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestEmptyMessageLite empty_message;
254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectPackedClear(message);
255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::SetPackedFields(&message);
256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = message.SerializeAsString();
257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    empty_message.ParseFromString(data);
258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data.clear();
259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = empty_message.SerializeAsString();
260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message2.ParseFromString(data);
261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = message2.SerializeAsString();
262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message2);
263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message.Clear();
264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectPackedClear(message);
265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  {
268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestPackedExtensionsLite message, message2;
269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestEmptyMessageLite empty_message;
270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message);
271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::SetPackedExtensions(&message);
272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = message.SerializeAsString();
273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    empty_message.ParseFromString(data);
274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data.clear();
275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = empty_message.SerializeAsString();
276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message2.ParseFromString(data);
277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = message2.SerializeAsString();
278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message2);
279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message.Clear();
280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message);
281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  {
284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Test Unknown fields swap
285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestEmptyMessageLite empty_message, empty_message2;
286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    SetAllTypesInEmptyMessageUnknownFields(&empty_message);
287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    SetSomeTypesInEmptyMessageUnknownFields(&empty_message2);
288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = empty_message.SerializeAsString();
289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data2 = empty_message2.SerializeAsString();
290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    empty_message.Swap(&empty_message2);
291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    GOOGLE_CHECK_EQ(data, empty_message2.SerializeAsString());
292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    GOOGLE_CHECK_EQ(data2, empty_message.SerializeAsString());
293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  {
296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Test unknown fields swap with self
297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestEmptyMessageLite empty_message;
298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    SetAllTypesInEmptyMessageUnknownFields(&empty_message);
299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = empty_message.SerializeAsString();
300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    empty_message.Swap(&empty_message);
301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    GOOGLE_CHECK_EQ(data, empty_message.SerializeAsString());
302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  {
305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Test MergeFrom with unknown fields
306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestAllTypesLite message, message2;
307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestEmptyMessageLite empty_message, empty_message2;
308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message.set_optional_int32(101);
309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message.add_repeated_int32(201);
310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message.set_optional_nested_enum(google::protobuf::unittest::TestAllTypesLite::BAZ);
311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message2.set_optional_int64(102);
312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message2.add_repeated_int64(202);
313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message2.set_optional_foreign_enum(google::protobuf::unittest::FOREIGN_LITE_BAZ);
314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = message.SerializeAsString();
316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    empty_message.ParseFromString(data);
317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = message2.SerializeAsString();
318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    empty_message2.ParseFromString(data);
319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message.MergeFrom(message2);
320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    empty_message.MergeFrom(empty_message2);
321a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = empty_message.SerializeAsString();
323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message2.ParseFromString(data);
324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // We do not compare the serialized output of a normal message and a lite
325a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // message because the order of fields do not match. We convert lite message
326a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // back into normal message, then compare.
327a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    GOOGLE_CHECK_EQ(message.SerializeAsString(), message2.SerializeAsString());
328a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
329a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
330a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  {
331a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Test unknown enum value
332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestAllTypesLite message;
333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    string buffer;
334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    {
335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      google::protobuf::io::StringOutputStream output_stream(&buffer);
336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      google::protobuf::io::CodedOutputStream coded_output(&output_stream);
337a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      google::protobuf::internal::WireFormatLite::WriteTag(
338a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          protobuf_unittest::TestAllTypesLite::kOptionalNestedEnumFieldNumber,
339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT, &coded_output);
340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      coded_output.WriteVarint32(10);
341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      google::protobuf::internal::WireFormatLite::WriteTag(
342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          protobuf_unittest::TestAllTypesLite::kRepeatedNestedEnumFieldNumber,
343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT, &coded_output);
344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      coded_output.WriteVarint32(20);
345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message.ParseFromString(buffer);
347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    data = message.SerializeAsString();
348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    GOOGLE_CHECK_EQ(data, buffer);
349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  {
352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Test Clear with unknown fields
353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    protobuf_unittest::TestEmptyMessageLite empty_message;
354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    SetAllTypesInEmptyMessageUnknownFields(&empty_message);
355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    empty_message.Clear();
356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    GOOGLE_CHECK_EQ(0, empty_message.unknown_fields().size());
357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Tests for map lite =============================================
360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Accessors
363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message);
366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message);
367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ModifyMapFields(&message);
369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsModified(message);
370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // SetMapFieldsInitialized
374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFieldsInitialized(&message);
377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSetInitialized(message);
378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Clear
382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message);
385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message.Clear();
386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectClear(message);
387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // ClearMessageMap
391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMessageMapLite message;
392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Creates a TestAllTypes with default value
394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::TestUtilLite::ExpectClear(
395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        (*message.mutable_map_int32_message())[0]);
396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // CopyFrom
400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message1, message2;
401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message1);
403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message2.CopyFrom(message1);
404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Copying from self should be a no-op.
407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message2.CopyFrom(message2);
408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // CopyFromMessageMap
413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMessageMapLite message1, message2;
414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*message1.mutable_map_int32_message())[0].add_repeated_int32(100);
416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*message2.mutable_map_int32_message())[0].add_repeated_int32(101);
417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message1.CopyFrom(message2);
419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Checks repeated field is overwritten.
421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size());
422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0));
423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // SwapWithEmpty
427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message1, message2;
428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message1);
430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message1);
431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectClear(message2);
432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message1.Swap(&message2);
434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectClear(message1);
436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // SwapWithSelf
440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message);
443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message);
444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message.Swap(&message);
446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message);
447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // SwapWithOther
451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message1, message2;
452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message1);
454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message2);
455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ModifyMapFields(&message2);
456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message1.Swap(&message2);
458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsModified(message1);
459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // CopyConstructor
464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message1;
465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message1);
466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message2(message1);
468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // CopyAssignmentOperator
473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message1;
474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message1);
475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message2;
477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message2 = message1;
478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Make sure that self-assignment does something sane.
481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message2.operator=(message2);
482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // NonEmptyMergeFrom
487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message1, message2;
488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message1);
490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // This field will test merging into an empty spot.
492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*message2.mutable_map_int32_int32())[1] = 1;
493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message1.mutable_map_int32_int32()->erase(1);
494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // This tests overwriting.
496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*message2.mutable_map_int32_double())[1] = 1;
497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*message1.mutable_map_int32_double())[1] = 2;
498b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
499b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message1.MergeFrom(message2);
500b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message1);
501b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
502b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
503b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
504b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // MergeFromMessageMap
505b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMessageMapLite message1, message2;
506b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
507b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*message1.mutable_map_int32_message())[0].add_repeated_int32(100);
508b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*message2.mutable_map_int32_message())[0].add_repeated_int32(101);
509b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
510b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message1.MergeFrom(message2);
511b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
512b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Checks repeated field is overwritten.
513b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size());
514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0));
515b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
517b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
518b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Test the generated SerializeWithCachedSizesToArray()
519b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message1, message2;
520b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string data;
521b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message1);
522b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    int size = message1.ByteSize();
523b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    data.resize(size);
524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ::google::protobuf::uint8* start = reinterpret_cast< ::google::protobuf::uint8*>(::google::protobuf::string_as_array(&data));
525b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ::google::protobuf::uint8* end = message1.SerializeWithCachedSizesToArray(start);
526b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(size, end - start);
527b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(message2.ParseFromString(data));
528b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
529b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
530b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
531b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Test the generated SerializeWithCachedSizes()
533b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message1, message2;
534b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::SetMapFields(&message1);
535b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    int size = message1.ByteSize();
536b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string data;
537b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    data.resize(size);
538b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    {
539b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // Allow the output stream to buffer only one byte at a time.
540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      google::protobuf::io::ArrayOutputStream array_stream(
541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          ::google::protobuf::string_as_array(&data), size, 1);
542b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      google::protobuf::io::CodedOutputStream output_stream(&array_stream);
543b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      message1.SerializeWithCachedSizes(&output_stream);
544b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      EXPECT_FALSE(output_stream.HadError());
545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      EXPECT_EQ(size, output_stream.ByteCount());
546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(message2.ParseFromString(data));
548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Proto2UnknownEnum
554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestEnumMapPlusExtraLite from;
555b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*from.mutable_known_map_field())[0] =
556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        protobuf_unittest::E_PROTO2_MAP_ENUM_FOO_LITE;
557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*from.mutable_unknown_map_field())[0] =
558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        protobuf_unittest::E_PROTO2_MAP_ENUM_EXTRA_LITE;
559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string data;
560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    from.SerializeToString(&data);
561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestEnumMapLite to;
563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(to.ParseFromString(data));
564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(0, to.unknown_map_field().size());
565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_FALSE(to.mutable_unknown_fields()->empty());
566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, to.known_map_field().size());
567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(protobuf_unittest::PROTO2_MAP_ENUM_FOO_LITE,
568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              to.known_map_field().at(0));
569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    data.clear();
571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    from.Clear();
572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    to.SerializeToString(&data);
573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(from.ParseFromString(data));
574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, from.known_map_field().size());
575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(protobuf_unittest::E_PROTO2_MAP_ENUM_FOO_LITE,
576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              from.known_map_field().at(0));
577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, from.unknown_map_field().size());
578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(protobuf_unittest::E_PROTO2_MAP_ENUM_EXTRA_LITE,
579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              from.unknown_map_field().at(0));
580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // StandardWireFormat
584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string data = "\x0A\x04\x08\x01\x10\x01";
586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(message.ParseFromString(data));
588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message.map_int32_int32().size());
589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message.map_int32_int32().at(1));
590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // UnorderedWireFormat
594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // put value before key in wire format
597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string data = "\x0A\x04\x10\x01\x08\x02";
598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(message.ParseFromString(data));
600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message.map_int32_int32().size());
601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message.map_int32_int32().at(2));
602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // DuplicatedKeyWireFormat
606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Two key fields in wire format
609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string data = "\x0A\x06\x08\x01\x08\x02\x10\x01";
610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(message.ParseFromString(data));
612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message.map_int32_int32().size());
613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message.map_int32_int32().at(2));
614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // DuplicatedValueWireFormat
618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Two value fields in wire format
621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string data = "\x0A\x06\x08\x01\x10\x01\x10\x02";
622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(message.ParseFromString(data));
624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message.map_int32_int32().size());
625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(2, message.map_int32_int32().at(1));
626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // MissedKeyWireFormat
630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // No key field in wire format
633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string data = "\x0A\x02\x10\x01";
634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(message.ParseFromString(data));
636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message.map_int32_int32().size());
637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message.map_int32_int32().at(0));
638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // MissedValueWireFormat
642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // No value field in wire format
645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string data = "\x0A\x02\x08\x01";
646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(message.ParseFromString(data));
648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message.map_int32_int32().size());
649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(0, message.map_int32_int32().at(1));
650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // UnknownFieldWireFormat
654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Unknown field in wire format
657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string data = "\x0A\x06\x08\x02\x10\x03\x18\x01";
658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(message.ParseFromString(data));
660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(1, message.map_int32_int32().size());
661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_EQ(3, message.map_int32_int32().at(2));
662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // CorruptedWireFormat
666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestMapLite message;
667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // corrupted data in wire format
669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string data = "\x0A\x06\x08\x02\x11\x03";
670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_FALSE(message.ParseFromString(data));
672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // IsInitialized
676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    protobuf_unittest::TestRequiredMessageMapLite map_message;
677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Add an uninitialized message.
679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*map_message.mutable_map_field())[0];
680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_FALSE(map_message.IsInitialized());
681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Initialize uninitialized message
683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*map_message.mutable_map_field())[0].set_a(0);
684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*map_message.mutable_map_field())[0].set_b(0);
685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*map_message.mutable_map_field())[0].set_c(0);
686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    EXPECT_TRUE(map_message.IsInitialized());
687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // Check that adding more values to enum does not corrupt message
691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // when passed through an old client.
692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      protobuf_unittest::V2MessageLite v2_message;
693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      v2_message.set_int_field(800);
694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // Set enum field to the value not understood by the old client.
695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      v2_message.set_enum_field(protobuf_unittest::V2_SECOND);
696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      string v2_bytes = v2_message.SerializeAsString();
697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      protobuf_unittest::V1MessageLite v1_message;
699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      v1_message.ParseFromString(v2_bytes);
700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      EXPECT_TRUE(v1_message.IsInitialized());
701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      EXPECT_EQ(v1_message.int_field(), v2_message.int_field());
702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // V1 client does not understand V2_SECOND value, so it discards it and
703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // uses default value instead.
704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      EXPECT_EQ(v1_message.enum_field(), protobuf_unittest::V1_FIRST);
705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // However, when re-serialized, it should preserve enum value.
707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      string v1_bytes = v1_message.SerializeAsString();
708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      protobuf_unittest::V2MessageLite same_v2_message;
710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      same_v2_message.ParseFromString(v1_bytes);
711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      EXPECT_EQ(v2_message.int_field(), same_v2_message.int_field());
713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      EXPECT_EQ(v2_message.enum_field(), same_v2_message.enum_field());
714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  std::cout << "PASS" << std::endl;
717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return 0;
718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
719