xref: /aosp_15_r20/external/protobuf/objectivec/Tests/GPBMessageTests+Merge.m (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format
2*1b3f573fSAndroid Build Coastguard Worker// Copyright 2015 Google Inc.  All rights reserved.
3*1b3f573fSAndroid Build Coastguard Worker// https://developers.google.com/protocol-buffers/
4*1b3f573fSAndroid Build Coastguard Worker//
5*1b3f573fSAndroid Build Coastguard Worker// Redistribution and use in source and binary forms, with or without
6*1b3f573fSAndroid Build Coastguard Worker// modification, are permitted provided that the following conditions are
7*1b3f573fSAndroid Build Coastguard Worker// met:
8*1b3f573fSAndroid Build Coastguard Worker//
9*1b3f573fSAndroid Build Coastguard Worker//     * Redistributions of source code must retain the above copyright
10*1b3f573fSAndroid Build Coastguard Worker// notice, this list of conditions and the following disclaimer.
11*1b3f573fSAndroid Build Coastguard Worker//     * Redistributions in binary form must reproduce the above
12*1b3f573fSAndroid Build Coastguard Worker// copyright notice, this list of conditions and the following disclaimer
13*1b3f573fSAndroid Build Coastguard Worker// in the documentation and/or other materials provided with the
14*1b3f573fSAndroid Build Coastguard Worker// distribution.
15*1b3f573fSAndroid Build Coastguard Worker//     * Neither the name of Google Inc. nor the names of its
16*1b3f573fSAndroid Build Coastguard Worker// contributors may be used to endorse or promote products derived from
17*1b3f573fSAndroid Build Coastguard Worker// this software without specific prior written permission.
18*1b3f573fSAndroid Build Coastguard Worker//
19*1b3f573fSAndroid Build Coastguard Worker// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*1b3f573fSAndroid Build Coastguard Worker// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*1b3f573fSAndroid Build Coastguard Worker// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23*1b3f573fSAndroid Build Coastguard Worker// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*1b3f573fSAndroid Build Coastguard Worker// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*1b3f573fSAndroid Build Coastguard Worker// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*1b3f573fSAndroid Build Coastguard Worker// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*1b3f573fSAndroid Build Coastguard Worker// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29*1b3f573fSAndroid Build Coastguard Worker// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*1b3f573fSAndroid Build Coastguard Worker
31*1b3f573fSAndroid Build Coastguard Worker#import "GPBTestUtilities.h"
32*1b3f573fSAndroid Build Coastguard Worker
33*1b3f573fSAndroid Build Coastguard Worker#import <objc/runtime.h>
34*1b3f573fSAndroid Build Coastguard Worker
35*1b3f573fSAndroid Build Coastguard Worker#import "GPBMessage.h"
36*1b3f573fSAndroid Build Coastguard Worker
37*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/MapUnittest.pbobjc.h"
38*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/Unittest.pbobjc.h"
39*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestPreserveUnknownEnum.pbobjc.h"
40*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
41*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
42*1b3f573fSAndroid Build Coastguard Worker
43*1b3f573fSAndroid Build Coastguard Worker@interface MessageMergeTests : GPBTestCase
44*1b3f573fSAndroid Build Coastguard Worker@end
45*1b3f573fSAndroid Build Coastguard Worker
46*1b3f573fSAndroid Build Coastguard Worker@implementation MessageMergeTests
47*1b3f573fSAndroid Build Coastguard Worker
48*1b3f573fSAndroid Build Coastguard Worker// TODO(thomasvl): Pull tests over from GPBMessageTests that are merge specific.
49*1b3f573fSAndroid Build Coastguard Worker
50*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3MergingAndZeroValues {
51*1b3f573fSAndroid Build Coastguard Worker  // Proto2 covered in other tests.
52*1b3f573fSAndroid Build Coastguard Worker
53*1b3f573fSAndroid Build Coastguard Worker  Message3 *src = [[Message3 alloc] init];
54*1b3f573fSAndroid Build Coastguard Worker  Message3 *dst = [[Message3 alloc] init];
55*1b3f573fSAndroid Build Coastguard Worker  NSData *testData1 = [@"abc" dataUsingEncoding:NSUTF8StringEncoding];
56*1b3f573fSAndroid Build Coastguard Worker  NSData *testData2 = [@"def" dataUsingEncoding:NSUTF8StringEncoding];
57*1b3f573fSAndroid Build Coastguard Worker
58*1b3f573fSAndroid Build Coastguard Worker  dst.optionalInt32 = 1;
59*1b3f573fSAndroid Build Coastguard Worker  dst.optionalInt64 = 1;
60*1b3f573fSAndroid Build Coastguard Worker  dst.optionalUint32 = 1;
61*1b3f573fSAndroid Build Coastguard Worker  dst.optionalUint64 = 1;
62*1b3f573fSAndroid Build Coastguard Worker  dst.optionalSint32 = 1;
63*1b3f573fSAndroid Build Coastguard Worker  dst.optionalSint64 = 1;
64*1b3f573fSAndroid Build Coastguard Worker  dst.optionalFixed32 = 1;
65*1b3f573fSAndroid Build Coastguard Worker  dst.optionalFixed64 = 1;
66*1b3f573fSAndroid Build Coastguard Worker  dst.optionalSfixed32 = 1;
67*1b3f573fSAndroid Build Coastguard Worker  dst.optionalSfixed64 = 1;
68*1b3f573fSAndroid Build Coastguard Worker  dst.optionalFloat = 1.0f;
69*1b3f573fSAndroid Build Coastguard Worker  dst.optionalDouble = 1.0;
70*1b3f573fSAndroid Build Coastguard Worker  dst.optionalBool = YES;
71*1b3f573fSAndroid Build Coastguard Worker  dst.optionalString = @"bar";
72*1b3f573fSAndroid Build Coastguard Worker  dst.optionalBytes = testData1;
73*1b3f573fSAndroid Build Coastguard Worker  dst.optionalEnum = Message3_Enum_Bar;
74*1b3f573fSAndroid Build Coastguard Worker
75*1b3f573fSAndroid Build Coastguard Worker  // All zeros, nothing should overright.
76*1b3f573fSAndroid Build Coastguard Worker
77*1b3f573fSAndroid Build Coastguard Worker  src.optionalInt32 = 0;
78*1b3f573fSAndroid Build Coastguard Worker  src.optionalInt64 = 0;
79*1b3f573fSAndroid Build Coastguard Worker  src.optionalUint32 = 0;
80*1b3f573fSAndroid Build Coastguard Worker  src.optionalUint64 = 0;
81*1b3f573fSAndroid Build Coastguard Worker  src.optionalSint32 = 0;
82*1b3f573fSAndroid Build Coastguard Worker  src.optionalSint64 = 0;
83*1b3f573fSAndroid Build Coastguard Worker  src.optionalFixed32 = 0;
84*1b3f573fSAndroid Build Coastguard Worker  src.optionalFixed64 = 0;
85*1b3f573fSAndroid Build Coastguard Worker  src.optionalSfixed32 = 0;
86*1b3f573fSAndroid Build Coastguard Worker  src.optionalSfixed64 = 0;
87*1b3f573fSAndroid Build Coastguard Worker  src.optionalFloat = 0.0f;
88*1b3f573fSAndroid Build Coastguard Worker  src.optionalDouble = 0.0;
89*1b3f573fSAndroid Build Coastguard Worker  src.optionalBool = NO;
90*1b3f573fSAndroid Build Coastguard Worker  src.optionalString = @"";
91*1b3f573fSAndroid Build Coastguard Worker  src.optionalBytes = [NSData data];
92*1b3f573fSAndroid Build Coastguard Worker  src.optionalEnum = Message3_Enum_Foo;  // first value
93*1b3f573fSAndroid Build Coastguard Worker
94*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
95*1b3f573fSAndroid Build Coastguard Worker
96*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalInt32, 1);
97*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalInt64, 1);
98*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalUint32, 1U);
99*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalUint64, 1U);
100*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSint32, 1);
101*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSint64, 1);
102*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalFixed32, 1U);
103*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalFixed64, 1U);
104*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSfixed32, 1);
105*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSfixed64, 1);
106*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalFloat, 1.0f);
107*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalDouble, 1.0);
108*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalBool, YES);
109*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.optionalString, @"bar");
110*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.optionalBytes, testData1);
111*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalEnum, Message3_Enum_Bar);
112*1b3f573fSAndroid Build Coastguard Worker
113*1b3f573fSAndroid Build Coastguard Worker  // Half the values that will replace.
114*1b3f573fSAndroid Build Coastguard Worker
115*1b3f573fSAndroid Build Coastguard Worker  src.optionalInt32 = 0;
116*1b3f573fSAndroid Build Coastguard Worker  src.optionalInt64 = 2;
117*1b3f573fSAndroid Build Coastguard Worker  src.optionalUint32 = 0;
118*1b3f573fSAndroid Build Coastguard Worker  src.optionalUint64 = 2;
119*1b3f573fSAndroid Build Coastguard Worker  src.optionalSint32 = 0;
120*1b3f573fSAndroid Build Coastguard Worker  src.optionalSint64 = 2;
121*1b3f573fSAndroid Build Coastguard Worker  src.optionalFixed32 = 0;
122*1b3f573fSAndroid Build Coastguard Worker  src.optionalFixed64 = 2;
123*1b3f573fSAndroid Build Coastguard Worker  src.optionalSfixed32 = 0;
124*1b3f573fSAndroid Build Coastguard Worker  src.optionalSfixed64 = 2;
125*1b3f573fSAndroid Build Coastguard Worker  src.optionalFloat = 0.0f;
126*1b3f573fSAndroid Build Coastguard Worker  src.optionalDouble = 2.0;
127*1b3f573fSAndroid Build Coastguard Worker  src.optionalBool = YES;  // No other value to use.  :(
128*1b3f573fSAndroid Build Coastguard Worker  src.optionalString = @"baz";
129*1b3f573fSAndroid Build Coastguard Worker  src.optionalBytes = nil;
130*1b3f573fSAndroid Build Coastguard Worker  src.optionalEnum = Message3_Enum_Baz;
131*1b3f573fSAndroid Build Coastguard Worker
132*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
133*1b3f573fSAndroid Build Coastguard Worker
134*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalInt32, 1);
135*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalInt64, 2);
136*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalUint32, 1U);
137*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalUint64, 2U);
138*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSint32, 1);
139*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSint64, 2);
140*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalFixed32, 1U);
141*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalFixed64, 2U);
142*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSfixed32, 1);
143*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSfixed64, 2);
144*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalFloat, 1.0f);
145*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalDouble, 2.0);
146*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalBool, YES);
147*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.optionalString, @"baz");
148*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.optionalBytes, testData1);
149*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalEnum, Message3_Enum_Baz);
150*1b3f573fSAndroid Build Coastguard Worker
151*1b3f573fSAndroid Build Coastguard Worker  // Other half the values that will replace.
152*1b3f573fSAndroid Build Coastguard Worker
153*1b3f573fSAndroid Build Coastguard Worker  src.optionalInt32 = 3;
154*1b3f573fSAndroid Build Coastguard Worker  src.optionalInt64 = 0;
155*1b3f573fSAndroid Build Coastguard Worker  src.optionalUint32 = 3;
156*1b3f573fSAndroid Build Coastguard Worker  src.optionalUint64 = 0;
157*1b3f573fSAndroid Build Coastguard Worker  src.optionalSint32 = 3;
158*1b3f573fSAndroid Build Coastguard Worker  src.optionalSint64 = 0;
159*1b3f573fSAndroid Build Coastguard Worker  src.optionalFixed32 = 3;
160*1b3f573fSAndroid Build Coastguard Worker  src.optionalFixed64 = 0;
161*1b3f573fSAndroid Build Coastguard Worker  src.optionalSfixed32 = 3;
162*1b3f573fSAndroid Build Coastguard Worker  src.optionalSfixed64 = 0;
163*1b3f573fSAndroid Build Coastguard Worker  src.optionalFloat = 3.0f;
164*1b3f573fSAndroid Build Coastguard Worker  src.optionalDouble = 0.0;
165*1b3f573fSAndroid Build Coastguard Worker  src.optionalBool = YES;  // No other value to use.  :(
166*1b3f573fSAndroid Build Coastguard Worker  src.optionalString = nil;
167*1b3f573fSAndroid Build Coastguard Worker  src.optionalBytes = testData2;
168*1b3f573fSAndroid Build Coastguard Worker  src.optionalEnum = Message3_Enum_Foo;
169*1b3f573fSAndroid Build Coastguard Worker
170*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
171*1b3f573fSAndroid Build Coastguard Worker
172*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalInt32, 3);
173*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalInt64, 2);
174*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalUint32, 3U);
175*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalUint64, 2U);
176*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSint32, 3);
177*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSint64, 2);
178*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalFixed32, 3U);
179*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalFixed64, 2U);
180*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSfixed32, 3);
181*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalSfixed64, 2);
182*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalFloat, 3.0f);
183*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalDouble, 2.0);
184*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalBool, YES);
185*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.optionalString, @"baz");
186*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.optionalBytes, testData2);
187*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.optionalEnum, Message3_Enum_Baz);
188*1b3f573fSAndroid Build Coastguard Worker
189*1b3f573fSAndroid Build Coastguard Worker  [src release];
190*1b3f573fSAndroid Build Coastguard Worker  [dst release];
191*1b3f573fSAndroid Build Coastguard Worker}
192*1b3f573fSAndroid Build Coastguard Worker
193*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3MergingEnums {
194*1b3f573fSAndroid Build Coastguard Worker  UnknownEnumsMyMessage *src = [UnknownEnumsMyMessage message];
195*1b3f573fSAndroid Build Coastguard Worker  UnknownEnumsMyMessage *dst = [UnknownEnumsMyMessage message];
196*1b3f573fSAndroid Build Coastguard Worker
197*1b3f573fSAndroid Build Coastguard Worker  // Known value.
198*1b3f573fSAndroid Build Coastguard Worker
199*1b3f573fSAndroid Build Coastguard Worker  src.e = UnknownEnumsMyEnum_Bar;
200*1b3f573fSAndroid Build Coastguard Worker  src.repeatedEArray =
201*1b3f573fSAndroid Build Coastguard Worker      [GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnum_IsValidValue
202*1b3f573fSAndroid Build Coastguard Worker                                       rawValue:UnknownEnumsMyEnum_Bar];
203*1b3f573fSAndroid Build Coastguard Worker  src.repeatedPackedEArray =
204*1b3f573fSAndroid Build Coastguard Worker      [GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnum_IsValidValue
205*1b3f573fSAndroid Build Coastguard Worker                                       rawValue:UnknownEnumsMyEnum_Bar];
206*1b3f573fSAndroid Build Coastguard Worker  src.oneofE1 = UnknownEnumsMyEnum_Bar;
207*1b3f573fSAndroid Build Coastguard Worker
208*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
209*1b3f573fSAndroid Build Coastguard Worker
210*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.e, UnknownEnumsMyEnum_Bar);
211*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.repeatedEArray.count, 1U);
212*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([dst.repeatedEArray valueAtIndex:0], UnknownEnumsMyEnum_Bar);
213*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.repeatedPackedEArray.count, 1U);
214*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([dst.repeatedPackedEArray valueAtIndex:0],
215*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnum_Bar);
216*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofE1, UnknownEnumsMyEnum_Bar);
217*1b3f573fSAndroid Build Coastguard Worker
218*1b3f573fSAndroid Build Coastguard Worker  // Unknown value.
219*1b3f573fSAndroid Build Coastguard Worker
220*1b3f573fSAndroid Build Coastguard Worker  const int32_t kUnknownValue = 666;
221*1b3f573fSAndroid Build Coastguard Worker
222*1b3f573fSAndroid Build Coastguard Worker  SetUnknownEnumsMyMessage_E_RawValue(src, kUnknownValue);
223*1b3f573fSAndroid Build Coastguard Worker  src.repeatedEArray =
224*1b3f573fSAndroid Build Coastguard Worker      [GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnum_IsValidValue
225*1b3f573fSAndroid Build Coastguard Worker                                       rawValue:kUnknownValue];
226*1b3f573fSAndroid Build Coastguard Worker  src.repeatedPackedEArray =
227*1b3f573fSAndroid Build Coastguard Worker      [GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnum_IsValidValue
228*1b3f573fSAndroid Build Coastguard Worker                                       rawValue:kUnknownValue];
229*1b3f573fSAndroid Build Coastguard Worker  SetUnknownEnumsMyMessage_OneofE1_RawValue(src, kUnknownValue);
230*1b3f573fSAndroid Build Coastguard Worker
231*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
232*1b3f573fSAndroid Build Coastguard Worker
233*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.e, UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
234*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(UnknownEnumsMyMessage_E_RawValue(dst), kUnknownValue);
235*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.repeatedEArray.count, 2U);
236*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([dst.repeatedEArray valueAtIndex:0], UnknownEnumsMyEnum_Bar);
237*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([dst.repeatedEArray valueAtIndex:1],
238*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
239*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([dst.repeatedEArray rawValueAtIndex:1], kUnknownValue);
240*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.repeatedPackedEArray.count, 2U);
241*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([dst.repeatedPackedEArray valueAtIndex:0],
242*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnum_Bar);
243*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([dst.repeatedPackedEArray valueAtIndex:1],
244*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
245*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([dst.repeatedPackedEArray rawValueAtIndex:1], kUnknownValue);
246*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofE1,
247*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
248*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(UnknownEnumsMyMessage_OneofE1_RawValue(dst), kUnknownValue);
249*1b3f573fSAndroid Build Coastguard Worker}
250*1b3f573fSAndroid Build Coastguard Worker
251*1b3f573fSAndroid Build Coastguard Worker- (void)testProto2MergeOneof {
252*1b3f573fSAndroid Build Coastguard Worker  Message2 *src = [Message2 message];
253*1b3f573fSAndroid Build Coastguard Worker  Message2 *dst = [Message2 message];
254*1b3f573fSAndroid Build Coastguard Worker
255*1b3f573fSAndroid Build Coastguard Worker  //
256*1b3f573fSAndroid Build Coastguard Worker  // Make sure whatever is in dst gets cleared out be merging in something else.
257*1b3f573fSAndroid Build Coastguard Worker  //
258*1b3f573fSAndroid Build Coastguard Worker
259*1b3f573fSAndroid Build Coastguard Worker  dst.oneofEnum = Message2_Enum_Bar;
260*1b3f573fSAndroid Build Coastguard Worker
261*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE MERGE2_TEST(SET_NAME, SET_VALUE, CLEARED_NAME, CLEARED_DEFAULT)
262*1b3f573fSAndroid Build Coastguard Worker//%  src.oneof##SET_NAME = SET_VALUE;
263*1b3f573fSAndroid Build Coastguard Worker//%  [dst mergeFrom:src];
264*1b3f573fSAndroid Build Coastguard Worker//%  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_Oneof##SET_NAME);
265*1b3f573fSAndroid Build Coastguard Worker//%  XCTAssertEqual(dst.oneof##SET_NAME, SET_VALUE);
266*1b3f573fSAndroid Build Coastguard Worker//%  XCTAssertEqual(dst.oneof##CLEARED_NAME, CLEARED_DEFAULT);
267*1b3f573fSAndroid Build Coastguard Worker//%
268*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Int32, 10, Enum, Message2_Enum_Baz)
269*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
270*1b3f573fSAndroid Build Coastguard Worker// clang-format off
271*1b3f573fSAndroid Build Coastguard Worker
272*1b3f573fSAndroid Build Coastguard Worker  src.oneofInt32 = 10;
273*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
274*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
275*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofInt32, 10);
276*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofEnum, Message2_Enum_Baz);
277*1b3f573fSAndroid Build Coastguard Worker
278*1b3f573fSAndroid Build Coastguard Worker// clang-format on
279*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Int64, 11, Int32, 100)
280*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
281*1b3f573fSAndroid Build Coastguard Worker// clang-format off
282*1b3f573fSAndroid Build Coastguard Worker
283*1b3f573fSAndroid Build Coastguard Worker  src.oneofInt64 = 11;
284*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
285*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
286*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofInt64, 11);
287*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofInt32, 100);
288*1b3f573fSAndroid Build Coastguard Worker
289*1b3f573fSAndroid Build Coastguard Worker// clang-format on
290*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Uint32, 12U, Int64, 101)
291*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
292*1b3f573fSAndroid Build Coastguard Worker// clang-format off
293*1b3f573fSAndroid Build Coastguard Worker
294*1b3f573fSAndroid Build Coastguard Worker  src.oneofUint32 = 12U;
295*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
296*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
297*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofUint32, 12U);
298*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofInt64, 101);
299*1b3f573fSAndroid Build Coastguard Worker
300*1b3f573fSAndroid Build Coastguard Worker// clang-format on
301*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Uint64, 13U, Uint32, 102U)
302*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
303*1b3f573fSAndroid Build Coastguard Worker// clang-format off
304*1b3f573fSAndroid Build Coastguard Worker
305*1b3f573fSAndroid Build Coastguard Worker  src.oneofUint64 = 13U;
306*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
307*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
308*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofUint64, 13U);
309*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofUint32, 102U);
310*1b3f573fSAndroid Build Coastguard Worker
311*1b3f573fSAndroid Build Coastguard Worker// clang-format on
312*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Sint32, 14, Uint64, 103U)
313*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
314*1b3f573fSAndroid Build Coastguard Worker// clang-format off
315*1b3f573fSAndroid Build Coastguard Worker
316*1b3f573fSAndroid Build Coastguard Worker  src.oneofSint32 = 14;
317*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
318*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
319*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSint32, 14);
320*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofUint64, 103U);
321*1b3f573fSAndroid Build Coastguard Worker
322*1b3f573fSAndroid Build Coastguard Worker// clang-format on
323*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Sint64, 15, Sint32, 104)
324*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
325*1b3f573fSAndroid Build Coastguard Worker// clang-format off
326*1b3f573fSAndroid Build Coastguard Worker
327*1b3f573fSAndroid Build Coastguard Worker  src.oneofSint64 = 15;
328*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
329*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
330*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSint64, 15);
331*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSint32, 104);
332*1b3f573fSAndroid Build Coastguard Worker
333*1b3f573fSAndroid Build Coastguard Worker// clang-format on
334*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Fixed32, 16U, Sint64, 105)
335*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
336*1b3f573fSAndroid Build Coastguard Worker// clang-format off
337*1b3f573fSAndroid Build Coastguard Worker
338*1b3f573fSAndroid Build Coastguard Worker  src.oneofFixed32 = 16U;
339*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
340*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
341*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFixed32, 16U);
342*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSint64, 105);
343*1b3f573fSAndroid Build Coastguard Worker
344*1b3f573fSAndroid Build Coastguard Worker// clang-format on
345*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Fixed64, 17U, Fixed32, 106U)
346*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
347*1b3f573fSAndroid Build Coastguard Worker// clang-format off
348*1b3f573fSAndroid Build Coastguard Worker
349*1b3f573fSAndroid Build Coastguard Worker  src.oneofFixed64 = 17U;
350*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
351*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
352*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFixed64, 17U);
353*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFixed32, 106U);
354*1b3f573fSAndroid Build Coastguard Worker
355*1b3f573fSAndroid Build Coastguard Worker// clang-format on
356*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Sfixed32, 18, Fixed64, 107U)
357*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
358*1b3f573fSAndroid Build Coastguard Worker// clang-format off
359*1b3f573fSAndroid Build Coastguard Worker
360*1b3f573fSAndroid Build Coastguard Worker  src.oneofSfixed32 = 18;
361*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
362*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
363*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSfixed32, 18);
364*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFixed64, 107U);
365*1b3f573fSAndroid Build Coastguard Worker
366*1b3f573fSAndroid Build Coastguard Worker// clang-format on
367*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Sfixed64, 19, Sfixed32, 108)
368*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
369*1b3f573fSAndroid Build Coastguard Worker// clang-format off
370*1b3f573fSAndroid Build Coastguard Worker
371*1b3f573fSAndroid Build Coastguard Worker  src.oneofSfixed64 = 19;
372*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
373*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
374*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSfixed64, 19);
375*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSfixed32, 108);
376*1b3f573fSAndroid Build Coastguard Worker
377*1b3f573fSAndroid Build Coastguard Worker// clang-format on
378*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Float, 20.0f, Sfixed64, 109)
379*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
380*1b3f573fSAndroid Build Coastguard Worker// clang-format off
381*1b3f573fSAndroid Build Coastguard Worker
382*1b3f573fSAndroid Build Coastguard Worker  src.oneofFloat = 20.0f;
383*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
384*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
385*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFloat, 20.0f);
386*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSfixed64, 109);
387*1b3f573fSAndroid Build Coastguard Worker
388*1b3f573fSAndroid Build Coastguard Worker// clang-format on
389*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Double, 21.0, Float, 110.0f)
390*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
391*1b3f573fSAndroid Build Coastguard Worker// clang-format off
392*1b3f573fSAndroid Build Coastguard Worker
393*1b3f573fSAndroid Build Coastguard Worker  src.oneofDouble = 21.0;
394*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
395*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
396*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofDouble, 21.0);
397*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFloat, 110.0f);
398*1b3f573fSAndroid Build Coastguard Worker
399*1b3f573fSAndroid Build Coastguard Worker// clang-format on
400*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Bool, NO, Double, 111.0)
401*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
402*1b3f573fSAndroid Build Coastguard Worker// clang-format off
403*1b3f573fSAndroid Build Coastguard Worker
404*1b3f573fSAndroid Build Coastguard Worker  src.oneofBool = NO;
405*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
406*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofBool);
407*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofBool, NO);
408*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofDouble, 111.0);
409*1b3f573fSAndroid Build Coastguard Worker
410*1b3f573fSAndroid Build Coastguard Worker// clang-format on
411*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE2_TEST(Enum, Message2_Enum_Bar, Bool, YES)
412*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
413*1b3f573fSAndroid Build Coastguard Worker// clang-format off
414*1b3f573fSAndroid Build Coastguard Worker
415*1b3f573fSAndroid Build Coastguard Worker  src.oneofEnum = Message2_Enum_Bar;
416*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
417*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
418*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofEnum, Message2_Enum_Bar);
419*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofBool, YES);
420*1b3f573fSAndroid Build Coastguard Worker
421*1b3f573fSAndroid Build Coastguard Worker// clang-format on
422*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END (14 expansions)
423*1b3f573fSAndroid Build Coastguard Worker
424*1b3f573fSAndroid Build Coastguard Worker  NSString *oneofStringDefault = @"string";
425*1b3f573fSAndroid Build Coastguard Worker  NSData *oneofBytesDefault = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
426*1b3f573fSAndroid Build Coastguard Worker
427*1b3f573fSAndroid Build Coastguard Worker  src.oneofString = @"foo";
428*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
429*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofString);
430*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.oneofString, @"foo");
431*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofEnum, Message2_Enum_Baz);
432*1b3f573fSAndroid Build Coastguard Worker
433*1b3f573fSAndroid Build Coastguard Worker  src.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
434*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
435*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
436*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.oneofBytes,
437*1b3f573fSAndroid Build Coastguard Worker                        [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
438*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.oneofString, oneofStringDefault);
439*1b3f573fSAndroid Build Coastguard Worker
440*1b3f573fSAndroid Build Coastguard Worker  Message2_OneofGroup *group = [Message2_OneofGroup message];
441*1b3f573fSAndroid Build Coastguard Worker  group.a = 666;
442*1b3f573fSAndroid Build Coastguard Worker  src.oneofGroup = group;
443*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
444*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
445*1b3f573fSAndroid Build Coastguard Worker  Message2_OneofGroup *mergedGroup = [[dst.oneofGroup retain] autorelease];
446*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(mergedGroup);
447*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(mergedGroup, group);  // Pointer comparison.
448*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(mergedGroup, group);
449*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.oneofBytes, oneofBytesDefault);
450*1b3f573fSAndroid Build Coastguard Worker
451*1b3f573fSAndroid Build Coastguard Worker  Message2 *subMessage = [Message2 message];
452*1b3f573fSAndroid Build Coastguard Worker  subMessage.optionalInt32 = 777;
453*1b3f573fSAndroid Build Coastguard Worker  src.oneofMessage = subMessage;
454*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
455*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
456*1b3f573fSAndroid Build Coastguard Worker  Message2 *mergedSubMessage = [[dst.oneofMessage retain] autorelease];
457*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(mergedSubMessage);
458*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(mergedSubMessage, subMessage);  // Pointer comparison.
459*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(mergedSubMessage, subMessage);
460*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(dst.oneofGroup);
461*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(dst.oneofGroup, mergedGroup);  // Pointer comparison.
462*1b3f573fSAndroid Build Coastguard Worker
463*1b3f573fSAndroid Build Coastguard Worker  // Back to something else to make sure message clears out ok.
464*1b3f573fSAndroid Build Coastguard Worker
465*1b3f573fSAndroid Build Coastguard Worker  src.oneofInt32 = 10;
466*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
467*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
468*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(dst.oneofMessage);
469*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(dst.oneofMessage,
470*1b3f573fSAndroid Build Coastguard Worker                    mergedSubMessage);  // Pointer comparison.
471*1b3f573fSAndroid Build Coastguard Worker
472*1b3f573fSAndroid Build Coastguard Worker  //
473*1b3f573fSAndroid Build Coastguard Worker  // Test merging in to message/group when they already had something.
474*1b3f573fSAndroid Build Coastguard Worker  //
475*1b3f573fSAndroid Build Coastguard Worker
476*1b3f573fSAndroid Build Coastguard Worker  src.oneofGroup = group;
477*1b3f573fSAndroid Build Coastguard Worker  mergedGroup = [Message2_OneofGroup message];
478*1b3f573fSAndroid Build Coastguard Worker  mergedGroup.b = 888;
479*1b3f573fSAndroid Build Coastguard Worker  dst.oneofGroup = mergedGroup;
480*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
481*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
482*1b3f573fSAndroid Build Coastguard Worker  // Shouldn't have been a new object.
483*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofGroup, mergedGroup);  // Pointer comparison.
484*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofGroup.a, 666);        // Pointer comparison.
485*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofGroup.b, 888);        // Pointer comparison.
486*1b3f573fSAndroid Build Coastguard Worker
487*1b3f573fSAndroid Build Coastguard Worker  src.oneofMessage = subMessage;
488*1b3f573fSAndroid Build Coastguard Worker  mergedSubMessage = [Message2 message];
489*1b3f573fSAndroid Build Coastguard Worker  mergedSubMessage.optionalInt64 = 999;
490*1b3f573fSAndroid Build Coastguard Worker  dst.oneofMessage = mergedSubMessage;
491*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
492*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
493*1b3f573fSAndroid Build Coastguard Worker  // Shouldn't have been a new object.
494*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofMessage, mergedSubMessage);   // Pointer comparison.
495*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofMessage.optionalInt32, 777);  // Pointer comparison.
496*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofMessage.optionalInt64, 999);  // Pointer comparison.
497*1b3f573fSAndroid Build Coastguard Worker}
498*1b3f573fSAndroid Build Coastguard Worker
499*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3MergeOneof {
500*1b3f573fSAndroid Build Coastguard Worker  Message3 *src = [Message3 message];
501*1b3f573fSAndroid Build Coastguard Worker  Message3 *dst = [Message3 message];
502*1b3f573fSAndroid Build Coastguard Worker
503*1b3f573fSAndroid Build Coastguard Worker  //
504*1b3f573fSAndroid Build Coastguard Worker  // Make sure whatever is in dst gets cleared out be merging in something else.
505*1b3f573fSAndroid Build Coastguard Worker  //
506*1b3f573fSAndroid Build Coastguard Worker
507*1b3f573fSAndroid Build Coastguard Worker  dst.oneofEnum = Message3_Enum_Bar;
508*1b3f573fSAndroid Build Coastguard Worker
509*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE MERGE3_TEST(SET_NAME, SET_VALUE, CLEARED_NAME, CLEARED_DEFAULT)
510*1b3f573fSAndroid Build Coastguard Worker//%  src.oneof##SET_NAME = SET_VALUE;
511*1b3f573fSAndroid Build Coastguard Worker//%  [dst mergeFrom:src];
512*1b3f573fSAndroid Build Coastguard Worker//%  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_Oneof##SET_NAME);
513*1b3f573fSAndroid Build Coastguard Worker//%  XCTAssertEqual(dst.oneof##SET_NAME, SET_VALUE);
514*1b3f573fSAndroid Build Coastguard Worker//%  XCTAssertEqual(dst.oneof##CLEARED_NAME, CLEARED_DEFAULT);
515*1b3f573fSAndroid Build Coastguard Worker//%
516*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Int32, 10, Enum, Message3_Enum_Foo)
517*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
518*1b3f573fSAndroid Build Coastguard Worker// clang-format off
519*1b3f573fSAndroid Build Coastguard Worker
520*1b3f573fSAndroid Build Coastguard Worker  src.oneofInt32 = 10;
521*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
522*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
523*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofInt32, 10);
524*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofEnum, Message3_Enum_Foo);
525*1b3f573fSAndroid Build Coastguard Worker
526*1b3f573fSAndroid Build Coastguard Worker// clang-format on
527*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Int64, 11, Int32, 0)
528*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
529*1b3f573fSAndroid Build Coastguard Worker// clang-format off
530*1b3f573fSAndroid Build Coastguard Worker
531*1b3f573fSAndroid Build Coastguard Worker  src.oneofInt64 = 11;
532*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
533*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
534*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofInt64, 11);
535*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofInt32, 0);
536*1b3f573fSAndroid Build Coastguard Worker
537*1b3f573fSAndroid Build Coastguard Worker// clang-format on
538*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Uint32, 12U, Int64, 0)
539*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
540*1b3f573fSAndroid Build Coastguard Worker// clang-format off
541*1b3f573fSAndroid Build Coastguard Worker
542*1b3f573fSAndroid Build Coastguard Worker  src.oneofUint32 = 12U;
543*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
544*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
545*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofUint32, 12U);
546*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofInt64, 0);
547*1b3f573fSAndroid Build Coastguard Worker
548*1b3f573fSAndroid Build Coastguard Worker// clang-format on
549*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Uint64, 13U, Uint32, 0U)
550*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
551*1b3f573fSAndroid Build Coastguard Worker// clang-format off
552*1b3f573fSAndroid Build Coastguard Worker
553*1b3f573fSAndroid Build Coastguard Worker  src.oneofUint64 = 13U;
554*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
555*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
556*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofUint64, 13U);
557*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofUint32, 0U);
558*1b3f573fSAndroid Build Coastguard Worker
559*1b3f573fSAndroid Build Coastguard Worker// clang-format on
560*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Sint32, 14, Uint64, 0U)
561*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
562*1b3f573fSAndroid Build Coastguard Worker// clang-format off
563*1b3f573fSAndroid Build Coastguard Worker
564*1b3f573fSAndroid Build Coastguard Worker  src.oneofSint32 = 14;
565*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
566*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
567*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSint32, 14);
568*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofUint64, 0U);
569*1b3f573fSAndroid Build Coastguard Worker
570*1b3f573fSAndroid Build Coastguard Worker// clang-format on
571*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Sint64, 15, Sint32, 0)
572*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
573*1b3f573fSAndroid Build Coastguard Worker// clang-format off
574*1b3f573fSAndroid Build Coastguard Worker
575*1b3f573fSAndroid Build Coastguard Worker  src.oneofSint64 = 15;
576*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
577*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
578*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSint64, 15);
579*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSint32, 0);
580*1b3f573fSAndroid Build Coastguard Worker
581*1b3f573fSAndroid Build Coastguard Worker// clang-format on
582*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Fixed32, 16U, Sint64, 0)
583*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
584*1b3f573fSAndroid Build Coastguard Worker// clang-format off
585*1b3f573fSAndroid Build Coastguard Worker
586*1b3f573fSAndroid Build Coastguard Worker  src.oneofFixed32 = 16U;
587*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
588*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
589*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFixed32, 16U);
590*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSint64, 0);
591*1b3f573fSAndroid Build Coastguard Worker
592*1b3f573fSAndroid Build Coastguard Worker// clang-format on
593*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Fixed64, 17U, Fixed32, 0U)
594*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
595*1b3f573fSAndroid Build Coastguard Worker// clang-format off
596*1b3f573fSAndroid Build Coastguard Worker
597*1b3f573fSAndroid Build Coastguard Worker  src.oneofFixed64 = 17U;
598*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
599*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
600*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFixed64, 17U);
601*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFixed32, 0U);
602*1b3f573fSAndroid Build Coastguard Worker
603*1b3f573fSAndroid Build Coastguard Worker// clang-format on
604*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Sfixed32, 18, Fixed64, 0U)
605*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
606*1b3f573fSAndroid Build Coastguard Worker// clang-format off
607*1b3f573fSAndroid Build Coastguard Worker
608*1b3f573fSAndroid Build Coastguard Worker  src.oneofSfixed32 = 18;
609*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
610*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
611*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSfixed32, 18);
612*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFixed64, 0U);
613*1b3f573fSAndroid Build Coastguard Worker
614*1b3f573fSAndroid Build Coastguard Worker// clang-format on
615*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Sfixed64, 19, Sfixed32, 0)
616*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
617*1b3f573fSAndroid Build Coastguard Worker// clang-format off
618*1b3f573fSAndroid Build Coastguard Worker
619*1b3f573fSAndroid Build Coastguard Worker  src.oneofSfixed64 = 19;
620*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
621*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
622*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSfixed64, 19);
623*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSfixed32, 0);
624*1b3f573fSAndroid Build Coastguard Worker
625*1b3f573fSAndroid Build Coastguard Worker// clang-format on
626*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Float, 20.0f, Sfixed64, 0)
627*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
628*1b3f573fSAndroid Build Coastguard Worker// clang-format off
629*1b3f573fSAndroid Build Coastguard Worker
630*1b3f573fSAndroid Build Coastguard Worker  src.oneofFloat = 20.0f;
631*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
632*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
633*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFloat, 20.0f);
634*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofSfixed64, 0);
635*1b3f573fSAndroid Build Coastguard Worker
636*1b3f573fSAndroid Build Coastguard Worker// clang-format on
637*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Double, 21.0, Float, 0.0f)
638*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
639*1b3f573fSAndroid Build Coastguard Worker// clang-format off
640*1b3f573fSAndroid Build Coastguard Worker
641*1b3f573fSAndroid Build Coastguard Worker  src.oneofDouble = 21.0;
642*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
643*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
644*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofDouble, 21.0);
645*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofFloat, 0.0f);
646*1b3f573fSAndroid Build Coastguard Worker
647*1b3f573fSAndroid Build Coastguard Worker// clang-format on
648*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Bool, YES, Double, 0.0)
649*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
650*1b3f573fSAndroid Build Coastguard Worker// clang-format off
651*1b3f573fSAndroid Build Coastguard Worker
652*1b3f573fSAndroid Build Coastguard Worker  src.oneofBool = YES;
653*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
654*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofBool);
655*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofBool, YES);
656*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofDouble, 0.0);
657*1b3f573fSAndroid Build Coastguard Worker
658*1b3f573fSAndroid Build Coastguard Worker// clang-format on
659*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MERGE3_TEST(Enum, Message3_Enum_Bar, Bool, NO)
660*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
661*1b3f573fSAndroid Build Coastguard Worker// clang-format off
662*1b3f573fSAndroid Build Coastguard Worker
663*1b3f573fSAndroid Build Coastguard Worker  src.oneofEnum = Message3_Enum_Bar;
664*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
665*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
666*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofEnum, Message3_Enum_Bar);
667*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofBool, NO);
668*1b3f573fSAndroid Build Coastguard Worker
669*1b3f573fSAndroid Build Coastguard Worker// clang-format on
670*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END (14 expansions)
671*1b3f573fSAndroid Build Coastguard Worker
672*1b3f573fSAndroid Build Coastguard Worker  NSString *oneofStringDefault = @"";
673*1b3f573fSAndroid Build Coastguard Worker  NSData *oneofBytesDefault = [NSData data];
674*1b3f573fSAndroid Build Coastguard Worker
675*1b3f573fSAndroid Build Coastguard Worker  src.oneofString = @"foo";
676*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
677*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofString);
678*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.oneofString, @"foo");
679*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofEnum, Message3_Enum_Foo);
680*1b3f573fSAndroid Build Coastguard Worker
681*1b3f573fSAndroid Build Coastguard Worker  src.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
682*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
683*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
684*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.oneofBytes,
685*1b3f573fSAndroid Build Coastguard Worker                        [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
686*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.oneofString, oneofStringDefault);
687*1b3f573fSAndroid Build Coastguard Worker
688*1b3f573fSAndroid Build Coastguard Worker
689*1b3f573fSAndroid Build Coastguard Worker  Message3 *subMessage = [Message3 message];
690*1b3f573fSAndroid Build Coastguard Worker  subMessage.optionalInt32 = 777;
691*1b3f573fSAndroid Build Coastguard Worker  src.oneofMessage = subMessage;
692*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
693*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
694*1b3f573fSAndroid Build Coastguard Worker  Message3 *mergedSubMessage = [[dst.oneofMessage retain] autorelease];
695*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(mergedSubMessage);
696*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(mergedSubMessage, subMessage);  // Pointer comparison.
697*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(mergedSubMessage, subMessage);
698*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(dst.oneofBytes, oneofBytesDefault);
699*1b3f573fSAndroid Build Coastguard Worker
700*1b3f573fSAndroid Build Coastguard Worker  // Back to something else to make sure message clears out ok.
701*1b3f573fSAndroid Build Coastguard Worker
702*1b3f573fSAndroid Build Coastguard Worker  src.oneofInt32 = 10;
703*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
704*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
705*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(dst.oneofMessage);
706*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(dst.oneofMessage,
707*1b3f573fSAndroid Build Coastguard Worker                    mergedSubMessage);  // Pointer comparison.
708*1b3f573fSAndroid Build Coastguard Worker
709*1b3f573fSAndroid Build Coastguard Worker  //
710*1b3f573fSAndroid Build Coastguard Worker  // Test merging in to message when they already had something.
711*1b3f573fSAndroid Build Coastguard Worker  //
712*1b3f573fSAndroid Build Coastguard Worker
713*1b3f573fSAndroid Build Coastguard Worker  src.oneofMessage = subMessage;
714*1b3f573fSAndroid Build Coastguard Worker  mergedSubMessage = [Message3 message];
715*1b3f573fSAndroid Build Coastguard Worker  mergedSubMessage.optionalInt64 = 999;
716*1b3f573fSAndroid Build Coastguard Worker  dst.oneofMessage = mergedSubMessage;
717*1b3f573fSAndroid Build Coastguard Worker  [dst mergeFrom:src];
718*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
719*1b3f573fSAndroid Build Coastguard Worker  // Shouldn't have been a new object.
720*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofMessage, mergedSubMessage);   // Pointer comparison.
721*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofMessage.optionalInt32, 777);  // Pointer comparison.
722*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(dst.oneofMessage.optionalInt64, 999);  // Pointer comparison.
723*1b3f573fSAndroid Build Coastguard Worker}
724*1b3f573fSAndroid Build Coastguard Worker
725*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Subset from from map_tests.cc
726*1b3f573fSAndroid Build Coastguard Worker
727*1b3f573fSAndroid Build Coastguard Worker// TEST(GeneratedMapFieldTest, CopyFromMessageMap)
728*1b3f573fSAndroid Build Coastguard Worker- (void)testMap_CopyFromMessageMap {
729*1b3f573fSAndroid Build Coastguard Worker  TestMessageMap *msg1 = [[TestMessageMap alloc] init];
730*1b3f573fSAndroid Build Coastguard Worker  TestMessageMap *msg2 = [[TestMessageMap alloc] init];
731*1b3f573fSAndroid Build Coastguard Worker
732*1b3f573fSAndroid Build Coastguard Worker  TestAllTypes *subMsg = [TestAllTypes message];
733*1b3f573fSAndroid Build Coastguard Worker  subMsg.repeatedInt32Array = [GPBInt32Array arrayWithValue:100];
734*1b3f573fSAndroid Build Coastguard Worker  [msg1.mapInt32Message setObject:subMsg forKey:0];
735*1b3f573fSAndroid Build Coastguard Worker  subMsg = nil;
736*1b3f573fSAndroid Build Coastguard Worker
737*1b3f573fSAndroid Build Coastguard Worker  subMsg = [TestAllTypes message];
738*1b3f573fSAndroid Build Coastguard Worker  subMsg.repeatedInt32Array = [GPBInt32Array arrayWithValue:101];
739*1b3f573fSAndroid Build Coastguard Worker
740*1b3f573fSAndroid Build Coastguard Worker  [msg2.mapInt32Message setObject:subMsg forKey:0];
741*1b3f573fSAndroid Build Coastguard Worker  subMsg = nil;
742*1b3f573fSAndroid Build Coastguard Worker
743*1b3f573fSAndroid Build Coastguard Worker  [msg1 mergeFrom:msg2];
744*1b3f573fSAndroid Build Coastguard Worker
745*1b3f573fSAndroid Build Coastguard Worker  // Checks repeated field is overwritten.
746*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg1.mapInt32Message.count, 1U);
747*1b3f573fSAndroid Build Coastguard Worker  subMsg = [msg1.mapInt32Message objectForKey:0];
748*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(subMsg);
749*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(subMsg.repeatedInt32Array.count, 1U);
750*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([subMsg.repeatedInt32Array valueAtIndex:0], 101);
751*1b3f573fSAndroid Build Coastguard Worker
752*1b3f573fSAndroid Build Coastguard Worker  [msg2 release];
753*1b3f573fSAndroid Build Coastguard Worker  [msg1 release];
754*1b3f573fSAndroid Build Coastguard Worker}
755*1b3f573fSAndroid Build Coastguard Worker
756*1b3f573fSAndroid Build Coastguard Worker@end
757