xref: /aosp_15_r20/external/protobuf/objectivec/Tests/GPBMessageTests+Serialization.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/MapProto2Unittest.pbobjc.h"
38*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/MapUnittest.pbobjc.h"
39*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/Unittest.pbobjc.h"
40*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestDropUnknownFields.pbobjc.h"
41*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestPreserveUnknownEnum.pbobjc.h"
42*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
43*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
44*1b3f573fSAndroid Build Coastguard Worker
45*1b3f573fSAndroid Build Coastguard Worker@interface MessageSerializationTests : GPBTestCase
46*1b3f573fSAndroid Build Coastguard Worker@end
47*1b3f573fSAndroid Build Coastguard Worker
48*1b3f573fSAndroid Build Coastguard Worker@implementation MessageSerializationTests
49*1b3f573fSAndroid Build Coastguard Worker
50*1b3f573fSAndroid Build Coastguard Worker// TODO(thomasvl): Pull tests over from GPBMessageTests that are serialization
51*1b3f573fSAndroid Build Coastguard Worker// specific.
52*1b3f573fSAndroid Build Coastguard Worker
53*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3SerializationHandlingDefaults {
54*1b3f573fSAndroid Build Coastguard Worker  // Proto2 covered in other tests.
55*1b3f573fSAndroid Build Coastguard Worker
56*1b3f573fSAndroid Build Coastguard Worker  Message3 *msg = [[Message3 alloc] init];
57*1b3f573fSAndroid Build Coastguard Worker
58*1b3f573fSAndroid Build Coastguard Worker  // Add defaults, no output.
59*1b3f573fSAndroid Build Coastguard Worker
60*1b3f573fSAndroid Build Coastguard Worker  NSData *data = [msg data];
61*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([data length], 0U);
62*1b3f573fSAndroid Build Coastguard Worker
63*1b3f573fSAndroid Build Coastguard Worker  // All zeros, still nothing.
64*1b3f573fSAndroid Build Coastguard Worker
65*1b3f573fSAndroid Build Coastguard Worker  msg.optionalInt32 = 0;
66*1b3f573fSAndroid Build Coastguard Worker  msg.optionalInt64 = 0;
67*1b3f573fSAndroid Build Coastguard Worker  msg.optionalUint32 = 0;
68*1b3f573fSAndroid Build Coastguard Worker  msg.optionalUint64 = 0;
69*1b3f573fSAndroid Build Coastguard Worker  msg.optionalSint32 = 0;
70*1b3f573fSAndroid Build Coastguard Worker  msg.optionalSint64 = 0;
71*1b3f573fSAndroid Build Coastguard Worker  msg.optionalFixed32 = 0;
72*1b3f573fSAndroid Build Coastguard Worker  msg.optionalFixed64 = 0;
73*1b3f573fSAndroid Build Coastguard Worker  msg.optionalSfixed32 = 0;
74*1b3f573fSAndroid Build Coastguard Worker  msg.optionalSfixed64 = 0;
75*1b3f573fSAndroid Build Coastguard Worker  msg.optionalFloat = 0.0f;
76*1b3f573fSAndroid Build Coastguard Worker  msg.optionalDouble = 0.0;
77*1b3f573fSAndroid Build Coastguard Worker  msg.optionalBool = NO;
78*1b3f573fSAndroid Build Coastguard Worker  msg.optionalString = @"";
79*1b3f573fSAndroid Build Coastguard Worker  msg.optionalBytes = [NSData data];
80*1b3f573fSAndroid Build Coastguard Worker  msg.optionalEnum = Message3_Enum_Foo;  // first value
81*1b3f573fSAndroid Build Coastguard Worker
82*1b3f573fSAndroid Build Coastguard Worker  data = [msg data];
83*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([data length], 0U);
84*1b3f573fSAndroid Build Coastguard Worker
85*1b3f573fSAndroid Build Coastguard Worker  // The two that also take nil as nothing.
86*1b3f573fSAndroid Build Coastguard Worker
87*1b3f573fSAndroid Build Coastguard Worker  msg.optionalString = nil;
88*1b3f573fSAndroid Build Coastguard Worker  msg.optionalBytes = nil;
89*1b3f573fSAndroid Build Coastguard Worker
90*1b3f573fSAndroid Build Coastguard Worker  data = [msg data];
91*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([data length], 0U);
92*1b3f573fSAndroid Build Coastguard Worker
93*1b3f573fSAndroid Build Coastguard Worker  // Set one field...
94*1b3f573fSAndroid Build Coastguard Worker
95*1b3f573fSAndroid Build Coastguard Worker  msg.optionalInt32 = 1;
96*1b3f573fSAndroid Build Coastguard Worker
97*1b3f573fSAndroid Build Coastguard Worker  data = [msg data];
98*1b3f573fSAndroid Build Coastguard Worker  const uint8_t expectedBytes[] = {0x08, 0x01};
99*1b3f573fSAndroid Build Coastguard Worker  NSData *expected = [NSData dataWithBytes:expectedBytes length:2];
100*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(data, expected);
101*1b3f573fSAndroid Build Coastguard Worker
102*1b3f573fSAndroid Build Coastguard Worker  // Back to zero...
103*1b3f573fSAndroid Build Coastguard Worker
104*1b3f573fSAndroid Build Coastguard Worker  msg.optionalInt32 = 0;
105*1b3f573fSAndroid Build Coastguard Worker
106*1b3f573fSAndroid Build Coastguard Worker  data = [msg data];
107*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([data length], 0U);
108*1b3f573fSAndroid Build Coastguard Worker
109*1b3f573fSAndroid Build Coastguard Worker  [msg release];
110*1b3f573fSAndroid Build Coastguard Worker}
111*1b3f573fSAndroid Build Coastguard Worker
112*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3SerializationHandlingOptionals {
113*1b3f573fSAndroid Build Coastguard Worker  //
114*1b3f573fSAndroid Build Coastguard Worker  // Proto3 optionals should be just like proto2, zero values also get serialized.
115*1b3f573fSAndroid Build Coastguard Worker  //
116*1b3f573fSAndroid Build Coastguard Worker
117*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(FIELD, ZERO_VALUE, EXPECTED_LEN)
118*1b3f573fSAndroid Build Coastguard Worker//%  {  // optional##FIELD
119*1b3f573fSAndroid Build Coastguard Worker//%    Message3Optional *msg = [[Message3Optional alloc] init];
120*1b3f573fSAndroid Build Coastguard Worker//%    NSData *data = [msg data];
121*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertEqual([data length], 0U);
122*1b3f573fSAndroid Build Coastguard Worker//%    msg.optional##FIELD = ZERO_VALUE;
123*1b3f573fSAndroid Build Coastguard Worker//%    data = [msg data];
124*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertEqual(data.length, EXPECTED_LEN);
125*1b3f573fSAndroid Build Coastguard Worker//%    NSError *err = nil;
126*1b3f573fSAndroid Build Coastguard Worker//%    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
127*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertNotNil(msg2);
128*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertNil(err);
129*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertTrue(msg2.hasOptional##FIELD);
130*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertEqualObjects(msg, msg2);
131*1b3f573fSAndroid Build Coastguard Worker//%    [msg release];
132*1b3f573fSAndroid Build Coastguard Worker//%  }
133*1b3f573fSAndroid Build Coastguard Worker//%
134*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE PROTO3_TEST_SERIALIZE_OPTIONAL_FIELDS()
135*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Int32, 0, 2)
136*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Int64, 0, 2)
137*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Uint32, 0, 2)
138*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Uint64, 0, 2)
139*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Sint32, 0, 2)
140*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Sint64, 0, 2)
141*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Fixed32, 0, 5)
142*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Fixed64, 0, 9)
143*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Sfixed32, 0, 5)
144*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Sfixed64, 0, 9)
145*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Float, 0.0f, 5)
146*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Double, 0.0, 9)
147*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Bool, NO, 2)
148*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(String, @"", 2)
149*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Bytes, [NSData data], 2)
150*1b3f573fSAndroid Build Coastguard Worker//%  //
151*1b3f573fSAndroid Build Coastguard Worker//%  // Test doesn't apply to optionalMessage (no groups in proto3).
152*1b3f573fSAndroid Build Coastguard Worker//%  //
153*1b3f573fSAndroid Build Coastguard Worker//%
154*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Enum, Message3Optional_Enum_Foo, 3)
155*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND PROTO3_TEST_SERIALIZE_OPTIONAL_FIELDS()
156*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
157*1b3f573fSAndroid Build Coastguard Worker// clang-format off
158*1b3f573fSAndroid Build Coastguard Worker
159*1b3f573fSAndroid Build Coastguard Worker  {  // optionalInt32
160*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
161*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
162*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
163*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt32 = 0;
164*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
165*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 2);
166*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
167*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
168*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
169*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
170*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalInt32);
171*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
172*1b3f573fSAndroid Build Coastguard Worker    [msg release];
173*1b3f573fSAndroid Build Coastguard Worker  }
174*1b3f573fSAndroid Build Coastguard Worker
175*1b3f573fSAndroid Build Coastguard Worker  {  // optionalInt64
176*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
177*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
178*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
179*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt64 = 0;
180*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
181*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 2);
182*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
183*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
184*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
185*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
186*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalInt64);
187*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
188*1b3f573fSAndroid Build Coastguard Worker    [msg release];
189*1b3f573fSAndroid Build Coastguard Worker  }
190*1b3f573fSAndroid Build Coastguard Worker
191*1b3f573fSAndroid Build Coastguard Worker  {  // optionalUint32
192*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
193*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
194*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
195*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint32 = 0;
196*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
197*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 2);
198*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
199*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
200*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
201*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
202*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalUint32);
203*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
204*1b3f573fSAndroid Build Coastguard Worker    [msg release];
205*1b3f573fSAndroid Build Coastguard Worker  }
206*1b3f573fSAndroid Build Coastguard Worker
207*1b3f573fSAndroid Build Coastguard Worker  {  // optionalUint64
208*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
209*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
210*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
211*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint64 = 0;
212*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
213*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 2);
214*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
215*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
216*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
217*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
218*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalUint64);
219*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
220*1b3f573fSAndroid Build Coastguard Worker    [msg release];
221*1b3f573fSAndroid Build Coastguard Worker  }
222*1b3f573fSAndroid Build Coastguard Worker
223*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSint32
224*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
225*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
226*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
227*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint32 = 0;
228*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
229*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 2);
230*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
231*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
232*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
233*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
234*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalSint32);
235*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
236*1b3f573fSAndroid Build Coastguard Worker    [msg release];
237*1b3f573fSAndroid Build Coastguard Worker  }
238*1b3f573fSAndroid Build Coastguard Worker
239*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSint64
240*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
241*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
242*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
243*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint64 = 0;
244*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
245*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 2);
246*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
247*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
248*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
249*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
250*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalSint64);
251*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
252*1b3f573fSAndroid Build Coastguard Worker    [msg release];
253*1b3f573fSAndroid Build Coastguard Worker  }
254*1b3f573fSAndroid Build Coastguard Worker
255*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFixed32
256*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
257*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
258*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
259*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed32 = 0;
260*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
261*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 5);
262*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
263*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
264*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
265*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
266*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalFixed32);
267*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
268*1b3f573fSAndroid Build Coastguard Worker    [msg release];
269*1b3f573fSAndroid Build Coastguard Worker  }
270*1b3f573fSAndroid Build Coastguard Worker
271*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFixed64
272*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
273*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
274*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
275*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed64 = 0;
276*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
277*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 9);
278*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
279*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
280*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
281*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
282*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalFixed64);
283*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
284*1b3f573fSAndroid Build Coastguard Worker    [msg release];
285*1b3f573fSAndroid Build Coastguard Worker  }
286*1b3f573fSAndroid Build Coastguard Worker
287*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSfixed32
288*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
289*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
290*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
291*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed32 = 0;
292*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
293*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 5);
294*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
295*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
296*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
297*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
298*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalSfixed32);
299*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
300*1b3f573fSAndroid Build Coastguard Worker    [msg release];
301*1b3f573fSAndroid Build Coastguard Worker  }
302*1b3f573fSAndroid Build Coastguard Worker
303*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSfixed64
304*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
305*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
306*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
307*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed64 = 0;
308*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
309*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 9);
310*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
311*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
312*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
313*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
314*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalSfixed64);
315*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
316*1b3f573fSAndroid Build Coastguard Worker    [msg release];
317*1b3f573fSAndroid Build Coastguard Worker  }
318*1b3f573fSAndroid Build Coastguard Worker
319*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFloat
320*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
321*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
322*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
323*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFloat = 0.0f;
324*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
325*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 5);
326*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
327*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
328*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
329*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
330*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalFloat);
331*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
332*1b3f573fSAndroid Build Coastguard Worker    [msg release];
333*1b3f573fSAndroid Build Coastguard Worker  }
334*1b3f573fSAndroid Build Coastguard Worker
335*1b3f573fSAndroid Build Coastguard Worker  {  // optionalDouble
336*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
337*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
338*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
339*1b3f573fSAndroid Build Coastguard Worker    msg.optionalDouble = 0.0;
340*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
341*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 9);
342*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
343*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
344*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
345*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
346*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalDouble);
347*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
348*1b3f573fSAndroid Build Coastguard Worker    [msg release];
349*1b3f573fSAndroid Build Coastguard Worker  }
350*1b3f573fSAndroid Build Coastguard Worker
351*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBool
352*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
353*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
354*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
355*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBool = NO;
356*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
357*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 2);
358*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
359*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
360*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
361*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
362*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalBool);
363*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
364*1b3f573fSAndroid Build Coastguard Worker    [msg release];
365*1b3f573fSAndroid Build Coastguard Worker  }
366*1b3f573fSAndroid Build Coastguard Worker
367*1b3f573fSAndroid Build Coastguard Worker  {  // optionalString
368*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
369*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
370*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
371*1b3f573fSAndroid Build Coastguard Worker    msg.optionalString = @"";
372*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
373*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 2);
374*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
375*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
376*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
377*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
378*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalString);
379*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
380*1b3f573fSAndroid Build Coastguard Worker    [msg release];
381*1b3f573fSAndroid Build Coastguard Worker  }
382*1b3f573fSAndroid Build Coastguard Worker
383*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBytes
384*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
385*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
386*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
387*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBytes = [NSData data];
388*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
389*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 2);
390*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
391*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
392*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
393*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
394*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalBytes);
395*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
396*1b3f573fSAndroid Build Coastguard Worker    [msg release];
397*1b3f573fSAndroid Build Coastguard Worker  }
398*1b3f573fSAndroid Build Coastguard Worker
399*1b3f573fSAndroid Build Coastguard Worker  //
400*1b3f573fSAndroid Build Coastguard Worker  // Test doesn't apply to optionalMessage (no groups in proto3).
401*1b3f573fSAndroid Build Coastguard Worker  //
402*1b3f573fSAndroid Build Coastguard Worker
403*1b3f573fSAndroid Build Coastguard Worker  {  // optionalEnum
404*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
405*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [msg data];
406*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual([data length], 0U);
407*1b3f573fSAndroid Build Coastguard Worker    msg.optionalEnum = Message3Optional_Enum_Foo;
408*1b3f573fSAndroid Build Coastguard Worker    data = [msg data];
409*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(data.length, 3);
410*1b3f573fSAndroid Build Coastguard Worker    NSError *err = nil;
411*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
412*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg2);
413*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNil(err);
414*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg2.hasOptionalEnum);
415*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg, msg2);
416*1b3f573fSAndroid Build Coastguard Worker    [msg release];
417*1b3f573fSAndroid Build Coastguard Worker  }
418*1b3f573fSAndroid Build Coastguard Worker
419*1b3f573fSAndroid Build Coastguard Worker// clang-format on
420*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END PROTO3_TEST_SERIALIZE_OPTIONAL_FIELDS()
421*1b3f573fSAndroid Build Coastguard Worker}
422*1b3f573fSAndroid Build Coastguard Worker
423*1b3f573fSAndroid Build Coastguard Worker- (void)testProto2UnknownEnumToUnknownField {
424*1b3f573fSAndroid Build Coastguard Worker  Message3 *orig = [[Message3 alloc] init];
425*1b3f573fSAndroid Build Coastguard Worker
426*1b3f573fSAndroid Build Coastguard Worker  orig.optionalEnum = Message3_Enum_Extra3;
427*1b3f573fSAndroid Build Coastguard Worker  orig.repeatedEnumArray =
428*1b3f573fSAndroid Build Coastguard Worker      [GPBEnumArray arrayWithValidationFunction:Message3_Enum_IsValidValue
429*1b3f573fSAndroid Build Coastguard Worker                                       rawValue:Message3_Enum_Extra3];
430*1b3f573fSAndroid Build Coastguard Worker  orig.oneofEnum = Message3_Enum_Extra3;
431*1b3f573fSAndroid Build Coastguard Worker
432*1b3f573fSAndroid Build Coastguard Worker  NSData *data = [orig data];
433*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(data);
434*1b3f573fSAndroid Build Coastguard Worker  Message2 *msg = [[Message2 alloc] initWithData:data error:NULL];
435*1b3f573fSAndroid Build Coastguard Worker
436*1b3f573fSAndroid Build Coastguard Worker  // None of the fields should be set.
437*1b3f573fSAndroid Build Coastguard Worker
438*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse(msg.hasOptionalEnum);
439*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.repeatedEnumArray.count, 0U);
440*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
441*1b3f573fSAndroid Build Coastguard Worker
442*1b3f573fSAndroid Build Coastguard Worker  // All the values should be in unknown fields.
443*1b3f573fSAndroid Build Coastguard Worker
444*1b3f573fSAndroid Build Coastguard Worker  GPBUnknownFieldSet *unknownFields = msg.unknownFields;
445*1b3f573fSAndroid Build Coastguard Worker
446*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([unknownFields countOfFields], 3U);
447*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OptionalEnum]);
448*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(
449*1b3f573fSAndroid Build Coastguard Worker      [unknownFields hasField:Message2_FieldNumber_RepeatedEnumArray]);
450*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OneofEnum]);
451*1b3f573fSAndroid Build Coastguard Worker
452*1b3f573fSAndroid Build Coastguard Worker  GPBUnknownField *field =
453*1b3f573fSAndroid Build Coastguard Worker      [unknownFields getField:Message2_FieldNumber_OptionalEnum];
454*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(field.varintList.count, 1U);
455*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([field.varintList valueAtIndex:0],
456*1b3f573fSAndroid Build Coastguard Worker                 (uint64_t)Message3_Enum_Extra3);
457*1b3f573fSAndroid Build Coastguard Worker
458*1b3f573fSAndroid Build Coastguard Worker  field = [unknownFields getField:Message2_FieldNumber_RepeatedEnumArray];
459*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(field.varintList.count, 1U);
460*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([field.varintList valueAtIndex:0], (uint64_t)Message3_Enum_Extra3);
461*1b3f573fSAndroid Build Coastguard Worker
462*1b3f573fSAndroid Build Coastguard Worker  field = [unknownFields getField:Message2_FieldNumber_OneofEnum];
463*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(field.varintList.count, 1U);
464*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([field.varintList valueAtIndex:0],
465*1b3f573fSAndroid Build Coastguard Worker                 (uint64_t)Message3_Enum_Extra3);
466*1b3f573fSAndroid Build Coastguard Worker
467*1b3f573fSAndroid Build Coastguard Worker  [msg release];
468*1b3f573fSAndroid Build Coastguard Worker  [orig release];
469*1b3f573fSAndroid Build Coastguard Worker}
470*1b3f573fSAndroid Build Coastguard Worker
471*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3UnknownEnumPreserving {
472*1b3f573fSAndroid Build Coastguard Worker  UnknownEnumsMyMessagePlusExtra *orig =
473*1b3f573fSAndroid Build Coastguard Worker      [UnknownEnumsMyMessagePlusExtra message];
474*1b3f573fSAndroid Build Coastguard Worker
475*1b3f573fSAndroid Build Coastguard Worker  orig.e = UnknownEnumsMyEnumPlusExtra_EExtra;
476*1b3f573fSAndroid Build Coastguard Worker  orig.repeatedEArray = [GPBEnumArray
477*1b3f573fSAndroid Build Coastguard Worker      arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
478*1b3f573fSAndroid Build Coastguard Worker                         rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
479*1b3f573fSAndroid Build Coastguard Worker  orig.repeatedPackedEArray = [GPBEnumArray
480*1b3f573fSAndroid Build Coastguard Worker      arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
481*1b3f573fSAndroid Build Coastguard Worker                         rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
482*1b3f573fSAndroid Build Coastguard Worker  orig.oneofE1 = UnknownEnumsMyEnumPlusExtra_EExtra;
483*1b3f573fSAndroid Build Coastguard Worker
484*1b3f573fSAndroid Build Coastguard Worker  // Everything should be there via raw values.
485*1b3f573fSAndroid Build Coastguard Worker
486*1b3f573fSAndroid Build Coastguard Worker  NSData *data = [orig data];
487*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(data);
488*1b3f573fSAndroid Build Coastguard Worker  UnknownEnumsMyMessage *msg =
489*1b3f573fSAndroid Build Coastguard Worker      [UnknownEnumsMyMessage parseFromData:data error:NULL];
490*1b3f573fSAndroid Build Coastguard Worker
491*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.e, UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
492*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(UnknownEnumsMyMessage_E_RawValue(msg),
493*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnumPlusExtra_EExtra);
494*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.repeatedEArray.count, 1U);
495*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([msg.repeatedEArray valueAtIndex:0],
496*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
497*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([msg.repeatedEArray rawValueAtIndex:0],
498*1b3f573fSAndroid Build Coastguard Worker                 (UnknownEnumsMyEnum)UnknownEnumsMyEnumPlusExtra_EExtra);
499*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.repeatedPackedEArray.count, 1U);
500*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([msg.repeatedPackedEArray valueAtIndex:0],
501*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
502*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([msg.repeatedPackedEArray rawValueAtIndex:0],
503*1b3f573fSAndroid Build Coastguard Worker                 (UnknownEnumsMyEnum)UnknownEnumsMyEnumPlusExtra_EExtra);
504*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofE1,
505*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
506*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(UnknownEnumsMyMessage_OneofE1_RawValue(msg),
507*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnumPlusExtra_EExtra);
508*1b3f573fSAndroid Build Coastguard Worker
509*1b3f573fSAndroid Build Coastguard Worker  // Everything should go out and come back.
510*1b3f573fSAndroid Build Coastguard Worker
511*1b3f573fSAndroid Build Coastguard Worker  data = [msg data];
512*1b3f573fSAndroid Build Coastguard Worker  orig = [UnknownEnumsMyMessagePlusExtra parseFromData:data error:NULL];
513*1b3f573fSAndroid Build Coastguard Worker
514*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(orig.e, UnknownEnumsMyEnumPlusExtra_EExtra);
515*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(orig.repeatedEArray.count, 1U);
516*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([orig.repeatedEArray valueAtIndex:0],
517*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnumPlusExtra_EExtra);
518*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(orig.repeatedPackedEArray.count, 1U);
519*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([orig.repeatedPackedEArray valueAtIndex:0],
520*1b3f573fSAndroid Build Coastguard Worker                 UnknownEnumsMyEnumPlusExtra_EExtra);
521*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(orig.oneofE1, UnknownEnumsMyEnumPlusExtra_EExtra);
522*1b3f573fSAndroid Build Coastguard Worker}
523*1b3f573fSAndroid Build Coastguard Worker
524*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF(MESSAGE, FIELD, VALUE)
525*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, )
526*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, EQ_SUFFIX)
527*1b3f573fSAndroid Build Coastguard Worker//%  {  // oneof##FIELD
528*1b3f573fSAndroid Build Coastguard Worker//%    MESSAGE *orig = [[MESSAGE alloc] init];
529*1b3f573fSAndroid Build Coastguard Worker//%    orig.oneof##FIELD = VALUE;
530*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertEqual(orig.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD);
531*1b3f573fSAndroid Build Coastguard Worker//%    NSData *data = [orig data];
532*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertNotNil(data);
533*1b3f573fSAndroid Build Coastguard Worker//%    MESSAGE *msg = [MESSAGE parseFromData:data error:NULL];
534*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertEqual(msg.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD);
535*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertEqual##EQ_SUFFIX(msg.oneof##FIELD, VALUE);
536*1b3f573fSAndroid Build Coastguard Worker//%    [orig release];
537*1b3f573fSAndroid Build Coastguard Worker//%  }
538*1b3f573fSAndroid Build Coastguard Worker//%
539*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE TEST_ROUNDTRIP_ONEOFS(SYNTAX, BOOL_NON_DEFAULT)
540*1b3f573fSAndroid Build Coastguard Worker//%- (void)testProto##SYNTAX##RoundTripOneof {
541*1b3f573fSAndroid Build Coastguard Worker//%
542*1b3f573fSAndroid Build Coastguard Worker//%GROUP_INIT##SYNTAX()  Message##SYNTAX *subMessage = [[Message##SYNTAX alloc] init];
543*1b3f573fSAndroid Build Coastguard Worker//%  XCTAssertNotNil(subMessage);
544*1b3f573fSAndroid Build Coastguard Worker//%  subMessage.optionalInt32 = 666;
545*1b3f573fSAndroid Build Coastguard Worker//%
546*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Int32, 1)
547*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Int64, 2)
548*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Uint32, 3U)
549*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Uint64, 4U)
550*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sint32, 5)
551*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sint64, 6)
552*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Fixed32, 7U)
553*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Fixed64, 8U)
554*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sfixed32, 9)
555*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sfixed64, 10)
556*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Float, 11.0f)
557*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Double, 12.0)
558*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Bool, BOOL_NON_DEFAULT)
559*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, String, @"foo", Objects)
560*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, Bytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding], Objects)
561*1b3f573fSAndroid Build Coastguard Worker//%GROUP_TEST##SYNTAX()TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, Message, subMessage, Objects)
562*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Enum, Message##SYNTAX##_Enum_Bar)
563*1b3f573fSAndroid Build Coastguard Worker//%GROUP_CLEANUP##SYNTAX()  [subMessage release];
564*1b3f573fSAndroid Build Coastguard Worker//%}
565*1b3f573fSAndroid Build Coastguard Worker//%
566*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE GROUP_INIT2()
567*1b3f573fSAndroid Build Coastguard Worker//%  Message2_OneofGroup *group = [[Message2_OneofGroup alloc] init];
568*1b3f573fSAndroid Build Coastguard Worker//%  XCTAssertNotNil(group);
569*1b3f573fSAndroid Build Coastguard Worker//%  group.a = 777;
570*1b3f573fSAndroid Build Coastguard Worker//%
571*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE GROUP_CLEANUP2()
572*1b3f573fSAndroid Build Coastguard Worker//%  [group release];
573*1b3f573fSAndroid Build Coastguard Worker//%
574*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE GROUP_TEST2()
575*1b3f573fSAndroid Build Coastguard Worker//%TEST_ROUNDTRIP_ONEOF_ADV(Message2, Group, group, Objects)
576*1b3f573fSAndroid Build Coastguard Worker//%
577*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE GROUP_INIT3()
578*1b3f573fSAndroid Build Coastguard Worker// Empty
579*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE GROUP_CLEANUP3()
580*1b3f573fSAndroid Build Coastguard Worker// Empty
581*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE GROUP_TEST3()
582*1b3f573fSAndroid Build Coastguard Worker//%  // Not "group" in proto3.
583*1b3f573fSAndroid Build Coastguard Worker//%
584*1b3f573fSAndroid Build Coastguard Worker//%
585*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(2, NO)
586*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
587*1b3f573fSAndroid Build Coastguard Worker// clang-format off
588*1b3f573fSAndroid Build Coastguard Worker
589*1b3f573fSAndroid Build Coastguard Worker- (void)testProto2RoundTripOneof {
590*1b3f573fSAndroid Build Coastguard Worker
591*1b3f573fSAndroid Build Coastguard Worker  Message2_OneofGroup *group = [[Message2_OneofGroup alloc] init];
592*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(group);
593*1b3f573fSAndroid Build Coastguard Worker  group.a = 777;
594*1b3f573fSAndroid Build Coastguard Worker  Message2 *subMessage = [[Message2 alloc] init];
595*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(subMessage);
596*1b3f573fSAndroid Build Coastguard Worker  subMessage.optionalInt32 = 666;
597*1b3f573fSAndroid Build Coastguard Worker
598*1b3f573fSAndroid Build Coastguard Worker  {  // oneofInt32
599*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
600*1b3f573fSAndroid Build Coastguard Worker    orig.oneofInt32 = 1;
601*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
602*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
603*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
604*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
605*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
606*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt32, 1);
607*1b3f573fSAndroid Build Coastguard Worker    [orig release];
608*1b3f573fSAndroid Build Coastguard Worker  }
609*1b3f573fSAndroid Build Coastguard Worker
610*1b3f573fSAndroid Build Coastguard Worker  {  // oneofInt64
611*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
612*1b3f573fSAndroid Build Coastguard Worker    orig.oneofInt64 = 2;
613*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
614*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
615*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
616*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
617*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
618*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt64, 2);
619*1b3f573fSAndroid Build Coastguard Worker    [orig release];
620*1b3f573fSAndroid Build Coastguard Worker  }
621*1b3f573fSAndroid Build Coastguard Worker
622*1b3f573fSAndroid Build Coastguard Worker  {  // oneofUint32
623*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
624*1b3f573fSAndroid Build Coastguard Worker    orig.oneofUint32 = 3U;
625*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
626*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
627*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
628*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
629*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
630*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint32, 3U);
631*1b3f573fSAndroid Build Coastguard Worker    [orig release];
632*1b3f573fSAndroid Build Coastguard Worker  }
633*1b3f573fSAndroid Build Coastguard Worker
634*1b3f573fSAndroid Build Coastguard Worker  {  // oneofUint64
635*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
636*1b3f573fSAndroid Build Coastguard Worker    orig.oneofUint64 = 4U;
637*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
638*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
639*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
640*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
641*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
642*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint64, 4U);
643*1b3f573fSAndroid Build Coastguard Worker    [orig release];
644*1b3f573fSAndroid Build Coastguard Worker  }
645*1b3f573fSAndroid Build Coastguard Worker
646*1b3f573fSAndroid Build Coastguard Worker  {  // oneofSint32
647*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
648*1b3f573fSAndroid Build Coastguard Worker    orig.oneofSint32 = 5;
649*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
650*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
651*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
652*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
653*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
654*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint32, 5);
655*1b3f573fSAndroid Build Coastguard Worker    [orig release];
656*1b3f573fSAndroid Build Coastguard Worker  }
657*1b3f573fSAndroid Build Coastguard Worker
658*1b3f573fSAndroid Build Coastguard Worker  {  // oneofSint64
659*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
660*1b3f573fSAndroid Build Coastguard Worker    orig.oneofSint64 = 6;
661*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
662*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
663*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
664*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
665*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
666*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint64, 6);
667*1b3f573fSAndroid Build Coastguard Worker    [orig release];
668*1b3f573fSAndroid Build Coastguard Worker  }
669*1b3f573fSAndroid Build Coastguard Worker
670*1b3f573fSAndroid Build Coastguard Worker  {  // oneofFixed32
671*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
672*1b3f573fSAndroid Build Coastguard Worker    orig.oneofFixed32 = 7U;
673*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
674*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
675*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
676*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
677*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
678*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed32, 7U);
679*1b3f573fSAndroid Build Coastguard Worker    [orig release];
680*1b3f573fSAndroid Build Coastguard Worker  }
681*1b3f573fSAndroid Build Coastguard Worker
682*1b3f573fSAndroid Build Coastguard Worker  {  // oneofFixed64
683*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
684*1b3f573fSAndroid Build Coastguard Worker    orig.oneofFixed64 = 8U;
685*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
686*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
687*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
688*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
689*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
690*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed64, 8U);
691*1b3f573fSAndroid Build Coastguard Worker    [orig release];
692*1b3f573fSAndroid Build Coastguard Worker  }
693*1b3f573fSAndroid Build Coastguard Worker
694*1b3f573fSAndroid Build Coastguard Worker  {  // oneofSfixed32
695*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
696*1b3f573fSAndroid Build Coastguard Worker    orig.oneofSfixed32 = 9;
697*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
698*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
699*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
700*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
701*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
702*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed32, 9);
703*1b3f573fSAndroid Build Coastguard Worker    [orig release];
704*1b3f573fSAndroid Build Coastguard Worker  }
705*1b3f573fSAndroid Build Coastguard Worker
706*1b3f573fSAndroid Build Coastguard Worker  {  // oneofSfixed64
707*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
708*1b3f573fSAndroid Build Coastguard Worker    orig.oneofSfixed64 = 10;
709*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
710*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
711*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
712*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
713*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
714*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed64, 10);
715*1b3f573fSAndroid Build Coastguard Worker    [orig release];
716*1b3f573fSAndroid Build Coastguard Worker  }
717*1b3f573fSAndroid Build Coastguard Worker
718*1b3f573fSAndroid Build Coastguard Worker  {  // oneofFloat
719*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
720*1b3f573fSAndroid Build Coastguard Worker    orig.oneofFloat = 11.0f;
721*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
722*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
723*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
724*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
725*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
726*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFloat, 11.0f);
727*1b3f573fSAndroid Build Coastguard Worker    [orig release];
728*1b3f573fSAndroid Build Coastguard Worker  }
729*1b3f573fSAndroid Build Coastguard Worker
730*1b3f573fSAndroid Build Coastguard Worker  {  // oneofDouble
731*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
732*1b3f573fSAndroid Build Coastguard Worker    orig.oneofDouble = 12.0;
733*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
734*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
735*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
736*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
737*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
738*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofDouble, 12.0);
739*1b3f573fSAndroid Build Coastguard Worker    [orig release];
740*1b3f573fSAndroid Build Coastguard Worker  }
741*1b3f573fSAndroid Build Coastguard Worker
742*1b3f573fSAndroid Build Coastguard Worker  {  // oneofBool
743*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
744*1b3f573fSAndroid Build Coastguard Worker    orig.oneofBool = NO;
745*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBool);
746*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
747*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
748*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
749*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBool);
750*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofBool, NO);
751*1b3f573fSAndroid Build Coastguard Worker    [orig release];
752*1b3f573fSAndroid Build Coastguard Worker  }
753*1b3f573fSAndroid Build Coastguard Worker
754*1b3f573fSAndroid Build Coastguard Worker  {  // oneofString
755*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
756*1b3f573fSAndroid Build Coastguard Worker    orig.oneofString = @"foo";
757*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofString);
758*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
759*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
760*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
761*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofString);
762*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofString, @"foo");
763*1b3f573fSAndroid Build Coastguard Worker    [orig release];
764*1b3f573fSAndroid Build Coastguard Worker  }
765*1b3f573fSAndroid Build Coastguard Worker
766*1b3f573fSAndroid Build Coastguard Worker  {  // oneofBytes
767*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
768*1b3f573fSAndroid Build Coastguard Worker    orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
769*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
770*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
771*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
772*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
773*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
774*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
775*1b3f573fSAndroid Build Coastguard Worker    [orig release];
776*1b3f573fSAndroid Build Coastguard Worker  }
777*1b3f573fSAndroid Build Coastguard Worker
778*1b3f573fSAndroid Build Coastguard Worker  {  // oneofGroup
779*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
780*1b3f573fSAndroid Build Coastguard Worker    orig.oneofGroup = group;
781*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
782*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
783*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
784*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
785*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
786*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofGroup, group);
787*1b3f573fSAndroid Build Coastguard Worker    [orig release];
788*1b3f573fSAndroid Build Coastguard Worker  }
789*1b3f573fSAndroid Build Coastguard Worker
790*1b3f573fSAndroid Build Coastguard Worker  {  // oneofMessage
791*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
792*1b3f573fSAndroid Build Coastguard Worker    orig.oneofMessage = subMessage;
793*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
794*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
795*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
796*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
797*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
798*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofMessage, subMessage);
799*1b3f573fSAndroid Build Coastguard Worker    [orig release];
800*1b3f573fSAndroid Build Coastguard Worker  }
801*1b3f573fSAndroid Build Coastguard Worker
802*1b3f573fSAndroid Build Coastguard Worker  {  // oneofEnum
803*1b3f573fSAndroid Build Coastguard Worker    Message2 *orig = [[Message2 alloc] init];
804*1b3f573fSAndroid Build Coastguard Worker    orig.oneofEnum = Message2_Enum_Bar;
805*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
806*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
807*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
808*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [Message2 parseFromData:data error:NULL];
809*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
810*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar);
811*1b3f573fSAndroid Build Coastguard Worker    [orig release];
812*1b3f573fSAndroid Build Coastguard Worker  }
813*1b3f573fSAndroid Build Coastguard Worker
814*1b3f573fSAndroid Build Coastguard Worker  [group release];
815*1b3f573fSAndroid Build Coastguard Worker  [subMessage release];
816*1b3f573fSAndroid Build Coastguard Worker}
817*1b3f573fSAndroid Build Coastguard Worker
818*1b3f573fSAndroid Build Coastguard Worker// clang-format on
819*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(3, YES)
820*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
821*1b3f573fSAndroid Build Coastguard Worker// clang-format off
822*1b3f573fSAndroid Build Coastguard Worker
823*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3RoundTripOneof {
824*1b3f573fSAndroid Build Coastguard Worker
825*1b3f573fSAndroid Build Coastguard Worker  Message3 *subMessage = [[Message3 alloc] init];
826*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(subMessage);
827*1b3f573fSAndroid Build Coastguard Worker  subMessage.optionalInt32 = 666;
828*1b3f573fSAndroid Build Coastguard Worker
829*1b3f573fSAndroid Build Coastguard Worker  {  // oneofInt32
830*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
831*1b3f573fSAndroid Build Coastguard Worker    orig.oneofInt32 = 1;
832*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
833*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
834*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
835*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
836*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
837*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt32, 1);
838*1b3f573fSAndroid Build Coastguard Worker    [orig release];
839*1b3f573fSAndroid Build Coastguard Worker  }
840*1b3f573fSAndroid Build Coastguard Worker
841*1b3f573fSAndroid Build Coastguard Worker  {  // oneofInt64
842*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
843*1b3f573fSAndroid Build Coastguard Worker    orig.oneofInt64 = 2;
844*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
845*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
846*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
847*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
848*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
849*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt64, 2);
850*1b3f573fSAndroid Build Coastguard Worker    [orig release];
851*1b3f573fSAndroid Build Coastguard Worker  }
852*1b3f573fSAndroid Build Coastguard Worker
853*1b3f573fSAndroid Build Coastguard Worker  {  // oneofUint32
854*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
855*1b3f573fSAndroid Build Coastguard Worker    orig.oneofUint32 = 3U;
856*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
857*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
858*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
859*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
860*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
861*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint32, 3U);
862*1b3f573fSAndroid Build Coastguard Worker    [orig release];
863*1b3f573fSAndroid Build Coastguard Worker  }
864*1b3f573fSAndroid Build Coastguard Worker
865*1b3f573fSAndroid Build Coastguard Worker  {  // oneofUint64
866*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
867*1b3f573fSAndroid Build Coastguard Worker    orig.oneofUint64 = 4U;
868*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
869*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
870*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
871*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
872*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
873*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint64, 4U);
874*1b3f573fSAndroid Build Coastguard Worker    [orig release];
875*1b3f573fSAndroid Build Coastguard Worker  }
876*1b3f573fSAndroid Build Coastguard Worker
877*1b3f573fSAndroid Build Coastguard Worker  {  // oneofSint32
878*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
879*1b3f573fSAndroid Build Coastguard Worker    orig.oneofSint32 = 5;
880*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
881*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
882*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
883*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
884*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
885*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint32, 5);
886*1b3f573fSAndroid Build Coastguard Worker    [orig release];
887*1b3f573fSAndroid Build Coastguard Worker  }
888*1b3f573fSAndroid Build Coastguard Worker
889*1b3f573fSAndroid Build Coastguard Worker  {  // oneofSint64
890*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
891*1b3f573fSAndroid Build Coastguard Worker    orig.oneofSint64 = 6;
892*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
893*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
894*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
895*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
896*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
897*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint64, 6);
898*1b3f573fSAndroid Build Coastguard Worker    [orig release];
899*1b3f573fSAndroid Build Coastguard Worker  }
900*1b3f573fSAndroid Build Coastguard Worker
901*1b3f573fSAndroid Build Coastguard Worker  {  // oneofFixed32
902*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
903*1b3f573fSAndroid Build Coastguard Worker    orig.oneofFixed32 = 7U;
904*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
905*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
906*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
907*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
908*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
909*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed32, 7U);
910*1b3f573fSAndroid Build Coastguard Worker    [orig release];
911*1b3f573fSAndroid Build Coastguard Worker  }
912*1b3f573fSAndroid Build Coastguard Worker
913*1b3f573fSAndroid Build Coastguard Worker  {  // oneofFixed64
914*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
915*1b3f573fSAndroid Build Coastguard Worker    orig.oneofFixed64 = 8U;
916*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
917*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
918*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
919*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
920*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
921*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed64, 8U);
922*1b3f573fSAndroid Build Coastguard Worker    [orig release];
923*1b3f573fSAndroid Build Coastguard Worker  }
924*1b3f573fSAndroid Build Coastguard Worker
925*1b3f573fSAndroid Build Coastguard Worker  {  // oneofSfixed32
926*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
927*1b3f573fSAndroid Build Coastguard Worker    orig.oneofSfixed32 = 9;
928*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
929*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
930*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
931*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
932*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
933*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed32, 9);
934*1b3f573fSAndroid Build Coastguard Worker    [orig release];
935*1b3f573fSAndroid Build Coastguard Worker  }
936*1b3f573fSAndroid Build Coastguard Worker
937*1b3f573fSAndroid Build Coastguard Worker  {  // oneofSfixed64
938*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
939*1b3f573fSAndroid Build Coastguard Worker    orig.oneofSfixed64 = 10;
940*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
941*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
942*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
943*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
944*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
945*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed64, 10);
946*1b3f573fSAndroid Build Coastguard Worker    [orig release];
947*1b3f573fSAndroid Build Coastguard Worker  }
948*1b3f573fSAndroid Build Coastguard Worker
949*1b3f573fSAndroid Build Coastguard Worker  {  // oneofFloat
950*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
951*1b3f573fSAndroid Build Coastguard Worker    orig.oneofFloat = 11.0f;
952*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
953*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
954*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
955*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
956*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
957*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFloat, 11.0f);
958*1b3f573fSAndroid Build Coastguard Worker    [orig release];
959*1b3f573fSAndroid Build Coastguard Worker  }
960*1b3f573fSAndroid Build Coastguard Worker
961*1b3f573fSAndroid Build Coastguard Worker  {  // oneofDouble
962*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
963*1b3f573fSAndroid Build Coastguard Worker    orig.oneofDouble = 12.0;
964*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
965*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
966*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
967*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
968*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
969*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofDouble, 12.0);
970*1b3f573fSAndroid Build Coastguard Worker    [orig release];
971*1b3f573fSAndroid Build Coastguard Worker  }
972*1b3f573fSAndroid Build Coastguard Worker
973*1b3f573fSAndroid Build Coastguard Worker  {  // oneofBool
974*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
975*1b3f573fSAndroid Build Coastguard Worker    orig.oneofBool = YES;
976*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBool);
977*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
978*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
979*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
980*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBool);
981*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofBool, YES);
982*1b3f573fSAndroid Build Coastguard Worker    [orig release];
983*1b3f573fSAndroid Build Coastguard Worker  }
984*1b3f573fSAndroid Build Coastguard Worker
985*1b3f573fSAndroid Build Coastguard Worker  {  // oneofString
986*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
987*1b3f573fSAndroid Build Coastguard Worker    orig.oneofString = @"foo";
988*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofString);
989*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
990*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
991*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
992*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofString);
993*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofString, @"foo");
994*1b3f573fSAndroid Build Coastguard Worker    [orig release];
995*1b3f573fSAndroid Build Coastguard Worker  }
996*1b3f573fSAndroid Build Coastguard Worker
997*1b3f573fSAndroid Build Coastguard Worker  {  // oneofBytes
998*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
999*1b3f573fSAndroid Build Coastguard Worker    orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
1000*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
1001*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
1002*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
1003*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
1004*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
1005*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
1006*1b3f573fSAndroid Build Coastguard Worker    [orig release];
1007*1b3f573fSAndroid Build Coastguard Worker  }
1008*1b3f573fSAndroid Build Coastguard Worker
1009*1b3f573fSAndroid Build Coastguard Worker  // Not "group" in proto3.
1010*1b3f573fSAndroid Build Coastguard Worker
1011*1b3f573fSAndroid Build Coastguard Worker  {  // oneofMessage
1012*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
1013*1b3f573fSAndroid Build Coastguard Worker    orig.oneofMessage = subMessage;
1014*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
1015*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
1016*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
1017*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
1018*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
1019*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofMessage, subMessage);
1020*1b3f573fSAndroid Build Coastguard Worker    [orig release];
1021*1b3f573fSAndroid Build Coastguard Worker  }
1022*1b3f573fSAndroid Build Coastguard Worker
1023*1b3f573fSAndroid Build Coastguard Worker  {  // oneofEnum
1024*1b3f573fSAndroid Build Coastguard Worker    Message3 *orig = [[Message3 alloc] init];
1025*1b3f573fSAndroid Build Coastguard Worker    orig.oneofEnum = Message3_Enum_Bar;
1026*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
1027*1b3f573fSAndroid Build Coastguard Worker    NSData *data = [orig data];
1028*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(data);
1029*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [Message3 parseFromData:data error:NULL];
1030*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
1031*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofEnum, Message3_Enum_Bar);
1032*1b3f573fSAndroid Build Coastguard Worker    [orig release];
1033*1b3f573fSAndroid Build Coastguard Worker  }
1034*1b3f573fSAndroid Build Coastguard Worker
1035*1b3f573fSAndroid Build Coastguard Worker  [subMessage release];
1036*1b3f573fSAndroid Build Coastguard Worker}
1037*1b3f573fSAndroid Build Coastguard Worker
1038*1b3f573fSAndroid Build Coastguard Worker// clang-format on
1039*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END (2 expansions)
1040*1b3f573fSAndroid Build Coastguard Worker
1041*1b3f573fSAndroid Build Coastguard Worker- (void)testPackedUnpackedMessageParsing {
1042*1b3f573fSAndroid Build Coastguard Worker  // packed is optional, a repeated field should parse when packed or unpacked.
1043*1b3f573fSAndroid Build Coastguard Worker
1044*1b3f573fSAndroid Build Coastguard Worker  TestPackedTypes *packedOrig = [TestPackedTypes message];
1045*1b3f573fSAndroid Build Coastguard Worker  TestUnpackedTypes *unpackedOrig = [TestUnpackedTypes message];
1046*1b3f573fSAndroid Build Coastguard Worker  [self setPackedFields:packedOrig repeatedCount:4];
1047*1b3f573fSAndroid Build Coastguard Worker  [self setUnpackedFields:unpackedOrig repeatedCount:4];
1048*1b3f573fSAndroid Build Coastguard Worker
1049*1b3f573fSAndroid Build Coastguard Worker  NSData *packedData = [packedOrig data];
1050*1b3f573fSAndroid Build Coastguard Worker  NSData *unpackedData = [unpackedOrig data];
1051*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(packedData);
1052*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(unpackedData);
1053*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqualObjects(packedData, unpackedData,
1054*1b3f573fSAndroid Build Coastguard Worker                           @"Data should differ (packed vs unpacked) use");
1055*1b3f573fSAndroid Build Coastguard Worker
1056*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1057*1b3f573fSAndroid Build Coastguard Worker  TestPackedTypes *packedParse =
1058*1b3f573fSAndroid Build Coastguard Worker      [TestPackedTypes parseFromData:unpackedData error:&error];
1059*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(packedParse);
1060*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(error);
1061*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(packedParse, packedOrig);
1062*1b3f573fSAndroid Build Coastguard Worker
1063*1b3f573fSAndroid Build Coastguard Worker  error = nil;
1064*1b3f573fSAndroid Build Coastguard Worker  TestUnpackedTypes *unpackedParsed =
1065*1b3f573fSAndroid Build Coastguard Worker      [TestUnpackedTypes parseFromData:packedData error:&error];
1066*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(unpackedParsed);
1067*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(error);
1068*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(unpackedParsed, unpackedOrig);
1069*1b3f573fSAndroid Build Coastguard Worker}
1070*1b3f573fSAndroid Build Coastguard Worker
1071*1b3f573fSAndroid Build Coastguard Worker- (void)testPackedUnpackedExtensionParsing {
1072*1b3f573fSAndroid Build Coastguard Worker  // packed is optional, a repeated extension should parse when packed or
1073*1b3f573fSAndroid Build Coastguard Worker  // unpacked.
1074*1b3f573fSAndroid Build Coastguard Worker
1075*1b3f573fSAndroid Build Coastguard Worker  TestPackedExtensions *packedOrig = [TestPackedExtensions message];
1076*1b3f573fSAndroid Build Coastguard Worker  TestUnpackedExtensions *unpackedOrig = [TestUnpackedExtensions message];
1077*1b3f573fSAndroid Build Coastguard Worker  [self setPackedExtensions:packedOrig repeatedCount:kGPBDefaultRepeatCount];
1078*1b3f573fSAndroid Build Coastguard Worker  [self setUnpackedExtensions:unpackedOrig repeatedCount:kGPBDefaultRepeatCount];
1079*1b3f573fSAndroid Build Coastguard Worker
1080*1b3f573fSAndroid Build Coastguard Worker  NSData *packedData = [packedOrig data];
1081*1b3f573fSAndroid Build Coastguard Worker  NSData *unpackedData = [unpackedOrig data];
1082*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(packedData);
1083*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(unpackedData);
1084*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqualObjects(packedData, unpackedData,
1085*1b3f573fSAndroid Build Coastguard Worker                           @"Data should differ (packed vs unpacked) use");
1086*1b3f573fSAndroid Build Coastguard Worker
1087*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1088*1b3f573fSAndroid Build Coastguard Worker  TestPackedExtensions *packedParse =
1089*1b3f573fSAndroid Build Coastguard Worker      [TestPackedExtensions parseFromData:unpackedData
1090*1b3f573fSAndroid Build Coastguard Worker                        extensionRegistry:[UnittestRoot extensionRegistry]
1091*1b3f573fSAndroid Build Coastguard Worker                                    error:&error];
1092*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(packedParse);
1093*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(error);
1094*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(packedParse, packedOrig);
1095*1b3f573fSAndroid Build Coastguard Worker
1096*1b3f573fSAndroid Build Coastguard Worker  error = nil;
1097*1b3f573fSAndroid Build Coastguard Worker  TestUnpackedExtensions *unpackedParsed =
1098*1b3f573fSAndroid Build Coastguard Worker      [TestUnpackedExtensions parseFromData:packedData
1099*1b3f573fSAndroid Build Coastguard Worker                          extensionRegistry:[UnittestRoot extensionRegistry]
1100*1b3f573fSAndroid Build Coastguard Worker                                      error:&error];
1101*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(unpackedParsed);
1102*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(error);
1103*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(unpackedParsed, unpackedOrig);
1104*1b3f573fSAndroid Build Coastguard Worker}
1105*1b3f573fSAndroid Build Coastguard Worker
1106*1b3f573fSAndroid Build Coastguard Worker- (void)testPackedExtensionVsFieldParsing {
1107*1b3f573fSAndroid Build Coastguard Worker  // Extensions and fields end up on the wire the same way, so they can parse
1108*1b3f573fSAndroid Build Coastguard Worker  // each other.
1109*1b3f573fSAndroid Build Coastguard Worker
1110*1b3f573fSAndroid Build Coastguard Worker  TestPackedTypes *fieldsOrig = [TestPackedTypes message];
1111*1b3f573fSAndroid Build Coastguard Worker  TestPackedExtensions *extsOrig = [TestPackedExtensions message];
1112*1b3f573fSAndroid Build Coastguard Worker  [self setPackedFields:fieldsOrig repeatedCount:kGPBDefaultRepeatCount];
1113*1b3f573fSAndroid Build Coastguard Worker  [self setPackedExtensions:extsOrig repeatedCount:kGPBDefaultRepeatCount];
1114*1b3f573fSAndroid Build Coastguard Worker
1115*1b3f573fSAndroid Build Coastguard Worker  NSData *fieldsData = [fieldsOrig data];
1116*1b3f573fSAndroid Build Coastguard Worker  NSData *extsData = [extsOrig data];
1117*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldsData);
1118*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(extsData);
1119*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(fieldsData, extsData);
1120*1b3f573fSAndroid Build Coastguard Worker
1121*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1122*1b3f573fSAndroid Build Coastguard Worker  TestPackedTypes *fieldsParse =
1123*1b3f573fSAndroid Build Coastguard Worker      [TestPackedTypes parseFromData:extsData error:&error];
1124*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldsParse);
1125*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(error);
1126*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(fieldsParse, fieldsOrig);
1127*1b3f573fSAndroid Build Coastguard Worker
1128*1b3f573fSAndroid Build Coastguard Worker  error = nil;
1129*1b3f573fSAndroid Build Coastguard Worker  TestPackedExtensions *extsParse =
1130*1b3f573fSAndroid Build Coastguard Worker      [TestPackedExtensions parseFromData:fieldsData
1131*1b3f573fSAndroid Build Coastguard Worker                        extensionRegistry:[UnittestRoot extensionRegistry]
1132*1b3f573fSAndroid Build Coastguard Worker                                    error:&error];
1133*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(extsParse);
1134*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(error);
1135*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(extsParse, extsOrig);
1136*1b3f573fSAndroid Build Coastguard Worker}
1137*1b3f573fSAndroid Build Coastguard Worker
1138*1b3f573fSAndroid Build Coastguard Worker- (void)testUnpackedExtensionVsFieldParsing {
1139*1b3f573fSAndroid Build Coastguard Worker  // Extensions and fields end up on the wire the same way, so they can parse
1140*1b3f573fSAndroid Build Coastguard Worker  // each other.
1141*1b3f573fSAndroid Build Coastguard Worker
1142*1b3f573fSAndroid Build Coastguard Worker  TestUnpackedTypes *fieldsOrig = [TestUnpackedTypes message];
1143*1b3f573fSAndroid Build Coastguard Worker  TestUnpackedExtensions *extsOrig = [TestUnpackedExtensions message];
1144*1b3f573fSAndroid Build Coastguard Worker  [self setUnpackedFields:fieldsOrig repeatedCount:3];
1145*1b3f573fSAndroid Build Coastguard Worker  [self setUnpackedExtensions:extsOrig repeatedCount:3];
1146*1b3f573fSAndroid Build Coastguard Worker
1147*1b3f573fSAndroid Build Coastguard Worker  NSData *fieldsData = [fieldsOrig data];
1148*1b3f573fSAndroid Build Coastguard Worker  NSData *extsData = [extsOrig data];
1149*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldsData);
1150*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(extsData);
1151*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(fieldsData, extsData);
1152*1b3f573fSAndroid Build Coastguard Worker
1153*1b3f573fSAndroid Build Coastguard Worker  TestUnpackedTypes *fieldsParse =
1154*1b3f573fSAndroid Build Coastguard Worker      [TestUnpackedTypes parseFromData:extsData error:NULL];
1155*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldsParse);
1156*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(fieldsParse, fieldsOrig);
1157*1b3f573fSAndroid Build Coastguard Worker
1158*1b3f573fSAndroid Build Coastguard Worker  TestUnpackedExtensions *extsParse =
1159*1b3f573fSAndroid Build Coastguard Worker      [TestUnpackedExtensions parseFromData:fieldsData
1160*1b3f573fSAndroid Build Coastguard Worker                          extensionRegistry:[UnittestRoot extensionRegistry]
1161*1b3f573fSAndroid Build Coastguard Worker                                      error:NULL];
1162*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(extsParse);
1163*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(extsParse, extsOrig);
1164*1b3f573fSAndroid Build Coastguard Worker}
1165*1b3f573fSAndroid Build Coastguard Worker
1166*1b3f573fSAndroid Build Coastguard Worker- (void)testErrorSubsectionInvalidLimit {
1167*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr(
1168*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x08\x0A\x07\x12\x04\x72\x02\x4B\x50\x12\x04\x72\x02\x4B\x50");
1169*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1170*1b3f573fSAndroid Build Coastguard Worker  NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
1171*1b3f573fSAndroid Build Coastguard Worker                                                        error:&error];
1172*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(msg);
1173*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(error);
1174*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
1175*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSubsectionLimit);
1176*1b3f573fSAndroid Build Coastguard Worker}
1177*1b3f573fSAndroid Build Coastguard Worker
1178*1b3f573fSAndroid Build Coastguard Worker- (void)testErrorSubsectionLimitReached {
1179*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x0A\x06\x12\x03\x72\x02\x4B\x50");
1180*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1181*1b3f573fSAndroid Build Coastguard Worker  NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
1182*1b3f573fSAndroid Build Coastguard Worker                                                        error:&error];
1183*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(msg);
1184*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(error);
1185*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
1186*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(error.code, GPBCodedInputStreamErrorSubsectionLimitReached);
1187*1b3f573fSAndroid Build Coastguard Worker}
1188*1b3f573fSAndroid Build Coastguard Worker
1189*1b3f573fSAndroid Build Coastguard Worker- (void)testErrorInvalidVarint {
1190*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x72\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF");
1191*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1192*1b3f573fSAndroid Build Coastguard Worker  TestAllTypes *msg = [TestAllTypes parseFromData:data error:&error];
1193*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(msg);
1194*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(error);
1195*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
1196*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidVarInt);
1197*1b3f573fSAndroid Build Coastguard Worker}
1198*1b3f573fSAndroid Build Coastguard Worker
1199*1b3f573fSAndroid Build Coastguard Worker- (void)testErrorInvalidUTF8 {
1200*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x72\x04\xF4\xFF\xFF\xFF");
1201*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1202*1b3f573fSAndroid Build Coastguard Worker  TestAllTypes *msg = [TestAllTypes parseFromData:data error:&error];
1203*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(msg);
1204*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(error);
1205*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
1206*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidUTF8);
1207*1b3f573fSAndroid Build Coastguard Worker}
1208*1b3f573fSAndroid Build Coastguard Worker
1209*1b3f573fSAndroid Build Coastguard Worker- (void)testErrorInvalidSize {
1210*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x72\x03\x4B\x50");
1211*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1212*1b3f573fSAndroid Build Coastguard Worker  NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
1213*1b3f573fSAndroid Build Coastguard Worker                                                        error:&error];
1214*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(msg);
1215*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(error);
1216*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
1217*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSize);
1218*1b3f573fSAndroid Build Coastguard Worker}
1219*1b3f573fSAndroid Build Coastguard Worker
1220*1b3f573fSAndroid Build Coastguard Worker- (void)testErrorInvalidTag {
1221*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x0F");
1222*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1223*1b3f573fSAndroid Build Coastguard Worker  NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
1224*1b3f573fSAndroid Build Coastguard Worker                                                        error:&error];
1225*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(msg);
1226*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(error);
1227*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
1228*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidTag);
1229*1b3f573fSAndroid Build Coastguard Worker}
1230*1b3f573fSAndroid Build Coastguard Worker
1231*1b3f573fSAndroid Build Coastguard Worker- (void)testZeroFieldNum {
1232*1b3f573fSAndroid Build Coastguard Worker  // These are ConformanceTestSuite::TestIllegalTags.
1233*1b3f573fSAndroid Build Coastguard Worker
1234*1b3f573fSAndroid Build Coastguard Worker  const char *tests[] = {
1235*1b3f573fSAndroid Build Coastguard Worker    "\1DEADBEEF",
1236*1b3f573fSAndroid Build Coastguard Worker    "\2\1\1",
1237*1b3f573fSAndroid Build Coastguard Worker    "\3\4",
1238*1b3f573fSAndroid Build Coastguard Worker    "\5DEAD"
1239*1b3f573fSAndroid Build Coastguard Worker  };
1240*1b3f573fSAndroid Build Coastguard Worker
1241*1b3f573fSAndroid Build Coastguard Worker  for (size_t i = 0; i < GPBARRAYSIZE(tests); ++i) {
1242*1b3f573fSAndroid Build Coastguard Worker    NSData *data = DataFromCStr(tests[i]);
1243*1b3f573fSAndroid Build Coastguard Worker
1244*1b3f573fSAndroid Build Coastguard Worker    {
1245*1b3f573fSAndroid Build Coastguard Worker      // Message from proto2 syntax file
1246*1b3f573fSAndroid Build Coastguard Worker      NSError *error = nil;
1247*1b3f573fSAndroid Build Coastguard Worker      Message2 *msg = [Message2 parseFromData:data error:&error];
1248*1b3f573fSAndroid Build Coastguard Worker      XCTAssertNil(msg, @"i = %zd", i);
1249*1b3f573fSAndroid Build Coastguard Worker      XCTAssertNotNil(error, @"i = %zd", i);
1250*1b3f573fSAndroid Build Coastguard Worker      XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain, @"i = %zd", i);
1251*1b3f573fSAndroid Build Coastguard Worker      XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidTag, @"i = %zd", i);
1252*1b3f573fSAndroid Build Coastguard Worker    }
1253*1b3f573fSAndroid Build Coastguard Worker
1254*1b3f573fSAndroid Build Coastguard Worker    {
1255*1b3f573fSAndroid Build Coastguard Worker      // Message from proto3 syntax file
1256*1b3f573fSAndroid Build Coastguard Worker      NSError *error = nil;
1257*1b3f573fSAndroid Build Coastguard Worker      Message3 *msg = [Message3 parseFromData:data error:&error];
1258*1b3f573fSAndroid Build Coastguard Worker      XCTAssertNil(msg, @"i = %zd", i);
1259*1b3f573fSAndroid Build Coastguard Worker      XCTAssertNotNil(error, @"i = %zd", i);
1260*1b3f573fSAndroid Build Coastguard Worker      XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain, @"i = %zd", i);
1261*1b3f573fSAndroid Build Coastguard Worker      XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidTag, @"i = %zd", i);
1262*1b3f573fSAndroid Build Coastguard Worker    }
1263*1b3f573fSAndroid Build Coastguard Worker  }
1264*1b3f573fSAndroid Build Coastguard Worker}
1265*1b3f573fSAndroid Build Coastguard Worker
1266*1b3f573fSAndroid Build Coastguard Worker- (void)testErrorRecursionDepthReached {
1267*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr(
1268*1b3f573fSAndroid Build Coastguard Worker      "\x0A\xF2\x01\x0A\xEF\x01\x0A\xEC\x01\x0A\xE9\x01\x0A\xE6\x01"
1269*1b3f573fSAndroid Build Coastguard Worker      "\x0A\xE3\x01\x0A\xE0\x01\x0A\xDD\x01\x0A\xDA\x01\x0A\xD7\x01"
1270*1b3f573fSAndroid Build Coastguard Worker      "\x0A\xD4\x01\x0A\xD1\x01\x0A\xCE\x01\x0A\xCB\x01\x0A\xC8\x01"
1271*1b3f573fSAndroid Build Coastguard Worker      "\x0A\xC5\x01\x0A\xC2\x01\x0A\xBF\x01\x0A\xBC\x01\x0A\xB9\x01"
1272*1b3f573fSAndroid Build Coastguard Worker      "\x0A\xB6\x01\x0A\xB3\x01\x0A\xB0\x01\x0A\xAD\x01\x0A\xAA\x01"
1273*1b3f573fSAndroid Build Coastguard Worker      "\x0A\xA7\x01\x0A\xA4\x01\x0A\xA1\x01\x0A\x9E\x01\x0A\x9B\x01"
1274*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x98\x01\x0A\x95\x01\x0A\x92\x01\x0A\x8F\x01\x0A\x8C\x01"
1275*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x89\x01\x0A\x86\x01\x0A\x83\x01\x0A\x80\x01\x0A\x7E"
1276*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x7C\x0A\x7A\x0A\x78\x0A\x76\x0A\x74\x0A\x72\x0A\x70"
1277*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x6E\x0A\x6C\x0A\x6A\x0A\x68\x0A\x66\x0A\x64\x0A\x62"
1278*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x60\x0A\x5E\x0A\x5C\x0A\x5A\x0A\x58\x0A\x56\x0A\x54"
1279*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x52\x0A\x50\x0A\x4E\x0A\x4C\x0A\x4A\x0A\x48\x0A\x46"
1280*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x44\x0A\x42\x0A\x40\x0A\x3E\x0A\x3C\x0A\x3A\x0A\x38"
1281*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x36\x0A\x34\x0A\x32\x0A\x30\x0A\x2E\x0A\x2C\x0A\x2A"
1282*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x28\x0A\x26\x0A\x24\x0A\x22\x0A\x20\x0A\x1E\x0A\x1C"
1283*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x1A\x0A\x18\x0A\x16\x0A\x14\x0A\x12\x0A\x10\x0A\x0E"
1284*1b3f573fSAndroid Build Coastguard Worker      "\x0A\x0C\x0A\x0A\x0A\x08\x0A\x06\x12\x04\x72\x02\x4B\x50");
1285*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1286*1b3f573fSAndroid Build Coastguard Worker  NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
1287*1b3f573fSAndroid Build Coastguard Worker                                                        error:&error];
1288*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(msg);
1289*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(error);
1290*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
1291*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(error.code, GPBCodedInputStreamErrorRecursionDepthExceeded);
1292*1b3f573fSAndroid Build Coastguard Worker}
1293*1b3f573fSAndroid Build Coastguard Worker
1294*1b3f573fSAndroid Build Coastguard Worker- (void)testParseDelimitedDataWithNegativeSize {
1295*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\xFF\xFF\xFF\xFF\x0F");
1296*1b3f573fSAndroid Build Coastguard Worker  GPBCodedInputStream *input = [GPBCodedInputStream streamWithData:data];
1297*1b3f573fSAndroid Build Coastguard Worker  NSError *error;
1298*1b3f573fSAndroid Build Coastguard Worker  [GPBMessage parseDelimitedFromCodedInputStream:input
1299*1b3f573fSAndroid Build Coastguard Worker                               extensionRegistry:nil
1300*1b3f573fSAndroid Build Coastguard Worker                                           error:&error];
1301*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(error);
1302*1b3f573fSAndroid Build Coastguard Worker}
1303*1b3f573fSAndroid Build Coastguard Worker
1304*1b3f573fSAndroid Build Coastguard Worker#ifdef DEBUG
1305*1b3f573fSAndroid Build Coastguard Worker- (void)testErrorMissingRequiredField {
1306*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("");
1307*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1308*1b3f573fSAndroid Build Coastguard Worker  TestRequired *msg = [TestRequired parseFromData:data error:&error];
1309*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(msg);
1310*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(error);
1311*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(error.domain, GPBMessageErrorDomain);
1312*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(error.code, GPBMessageErrorCodeMissingRequiredField);
1313*1b3f573fSAndroid Build Coastguard Worker}
1314*1b3f573fSAndroid Build Coastguard Worker#endif
1315*1b3f573fSAndroid Build Coastguard Worker
1316*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Subset from from map_tests.cc
1317*1b3f573fSAndroid Build Coastguard Worker
1318*1b3f573fSAndroid Build Coastguard Worker// TEST(GeneratedMapFieldTest, StandardWireFormat)
1319*1b3f573fSAndroid Build Coastguard Worker- (void)testMap_StandardWireFormat {
1320*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x0A\x04\x08\x01\x10\x01");
1321*1b3f573fSAndroid Build Coastguard Worker
1322*1b3f573fSAndroid Build Coastguard Worker  TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
1323*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.mapInt32Int32.count, 1U);
1324*1b3f573fSAndroid Build Coastguard Worker  int32_t val = 666;
1325*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:1]);
1326*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(val, 1);
1327*1b3f573fSAndroid Build Coastguard Worker
1328*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1329*1b3f573fSAndroid Build Coastguard Worker}
1330*1b3f573fSAndroid Build Coastguard Worker
1331*1b3f573fSAndroid Build Coastguard Worker// TEST(GeneratedMapFieldTest, UnorderedWireFormat)
1332*1b3f573fSAndroid Build Coastguard Worker- (void)testMap_UnorderedWireFormat {
1333*1b3f573fSAndroid Build Coastguard Worker  // put value before key in wire format
1334*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x0A\x04\x10\x01\x08\x02");
1335*1b3f573fSAndroid Build Coastguard Worker
1336*1b3f573fSAndroid Build Coastguard Worker  TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
1337*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.mapInt32Int32.count, 1U);
1338*1b3f573fSAndroid Build Coastguard Worker  int32_t val = 666;
1339*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:2]);
1340*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(val, 1);
1341*1b3f573fSAndroid Build Coastguard Worker
1342*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1343*1b3f573fSAndroid Build Coastguard Worker}
1344*1b3f573fSAndroid Build Coastguard Worker
1345*1b3f573fSAndroid Build Coastguard Worker// TEST(GeneratedMapFieldTest, DuplicatedKeyWireFormat)
1346*1b3f573fSAndroid Build Coastguard Worker- (void)testMap_DuplicatedKeyWireFormat {
1347*1b3f573fSAndroid Build Coastguard Worker  // Two key fields in wire format
1348*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x0A\x06\x08\x01\x08\x02\x10\x01");
1349*1b3f573fSAndroid Build Coastguard Worker
1350*1b3f573fSAndroid Build Coastguard Worker  TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
1351*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.mapInt32Int32.count, 1U);
1352*1b3f573fSAndroid Build Coastguard Worker  int32_t val = 666;
1353*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:2]);
1354*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(val, 1);
1355*1b3f573fSAndroid Build Coastguard Worker
1356*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1357*1b3f573fSAndroid Build Coastguard Worker}
1358*1b3f573fSAndroid Build Coastguard Worker
1359*1b3f573fSAndroid Build Coastguard Worker// TEST(GeneratedMapFieldTest, DuplicatedValueWireFormat)
1360*1b3f573fSAndroid Build Coastguard Worker- (void)testMap_DuplicatedValueWireFormat {
1361*1b3f573fSAndroid Build Coastguard Worker  // Two value fields in wire format
1362*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x0A\x06\x08\x01\x10\x01\x10\x02");
1363*1b3f573fSAndroid Build Coastguard Worker
1364*1b3f573fSAndroid Build Coastguard Worker  TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
1365*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.mapInt32Int32.count, 1U);
1366*1b3f573fSAndroid Build Coastguard Worker  int32_t val = 666;
1367*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:1]);
1368*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(val, 2);
1369*1b3f573fSAndroid Build Coastguard Worker
1370*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1371*1b3f573fSAndroid Build Coastguard Worker}
1372*1b3f573fSAndroid Build Coastguard Worker
1373*1b3f573fSAndroid Build Coastguard Worker// TEST(GeneratedMapFieldTest, MissedKeyWireFormat)
1374*1b3f573fSAndroid Build Coastguard Worker- (void)testMap_MissedKeyWireFormat {
1375*1b3f573fSAndroid Build Coastguard Worker  // No key field in wire format
1376*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x0A\x02\x10\x01");
1377*1b3f573fSAndroid Build Coastguard Worker
1378*1b3f573fSAndroid Build Coastguard Worker  TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
1379*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.mapInt32Int32.count, 1U);
1380*1b3f573fSAndroid Build Coastguard Worker  int32_t val = 666;
1381*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:0]);
1382*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(val, 1);
1383*1b3f573fSAndroid Build Coastguard Worker
1384*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1385*1b3f573fSAndroid Build Coastguard Worker}
1386*1b3f573fSAndroid Build Coastguard Worker
1387*1b3f573fSAndroid Build Coastguard Worker// TEST(GeneratedMapFieldTest, MissedValueWireFormat)
1388*1b3f573fSAndroid Build Coastguard Worker- (void)testMap_MissedValueWireFormat {
1389*1b3f573fSAndroid Build Coastguard Worker  // No value field in wire format
1390*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x0A\x02\x08\x01");
1391*1b3f573fSAndroid Build Coastguard Worker
1392*1b3f573fSAndroid Build Coastguard Worker  TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
1393*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.mapInt32Int32.count, 1U);
1394*1b3f573fSAndroid Build Coastguard Worker  int32_t val = 666;
1395*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:1]);
1396*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(val, 0);
1397*1b3f573fSAndroid Build Coastguard Worker
1398*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1399*1b3f573fSAndroid Build Coastguard Worker}
1400*1b3f573fSAndroid Build Coastguard Worker
1401*1b3f573fSAndroid Build Coastguard Worker// TEST(GeneratedMapFieldTest, UnknownFieldWireFormat)
1402*1b3f573fSAndroid Build Coastguard Worker- (void)testMap_UnknownFieldWireFormat {
1403*1b3f573fSAndroid Build Coastguard Worker  // Unknown field in wire format
1404*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x0A\x06\x08\x02\x10\x03\x18\x01");
1405*1b3f573fSAndroid Build Coastguard Worker
1406*1b3f573fSAndroid Build Coastguard Worker  TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
1407*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.mapInt32Int32.count, 1U);
1408*1b3f573fSAndroid Build Coastguard Worker  int32_t val = 666;
1409*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:2]);
1410*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(val, 3);
1411*1b3f573fSAndroid Build Coastguard Worker
1412*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1413*1b3f573fSAndroid Build Coastguard Worker}
1414*1b3f573fSAndroid Build Coastguard Worker
1415*1b3f573fSAndroid Build Coastguard Worker// TEST(GeneratedMapFieldTest, CorruptedWireFormat)
1416*1b3f573fSAndroid Build Coastguard Worker- (void)testMap_CorruptedWireFormat {
1417*1b3f573fSAndroid Build Coastguard Worker  // corrupted data in wire format
1418*1b3f573fSAndroid Build Coastguard Worker  NSData *data = DataFromCStr("\x0A\x06\x08\x02\x11\x03");
1419*1b3f573fSAndroid Build Coastguard Worker
1420*1b3f573fSAndroid Build Coastguard Worker  NSError *error = nil;
1421*1b3f573fSAndroid Build Coastguard Worker  TestMap *msg = [TestMap parseFromData:data error:&error];
1422*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(msg);
1423*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(error);
1424*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
1425*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSubsectionLimit);
1426*1b3f573fSAndroid Build Coastguard Worker}
1427*1b3f573fSAndroid Build Coastguard Worker
1428*1b3f573fSAndroid Build Coastguard Worker// TEST(GeneratedMapFieldTest, Proto2UnknownEnum)
1429*1b3f573fSAndroid Build Coastguard Worker- (void)testMap_Proto2UnknownEnum {
1430*1b3f573fSAndroid Build Coastguard Worker  TestEnumMapPlusExtra *orig = [[TestEnumMapPlusExtra alloc] init];
1431*1b3f573fSAndroid Build Coastguard Worker
1432*1b3f573fSAndroid Build Coastguard Worker  orig.knownMapField = [[[GPBInt32EnumDictionary alloc]
1433*1b3f573fSAndroid Build Coastguard Worker      initWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue] autorelease];
1434*1b3f573fSAndroid Build Coastguard Worker  orig.unknownMapField = [[[GPBInt32EnumDictionary alloc]
1435*1b3f573fSAndroid Build Coastguard Worker      initWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue] autorelease];
1436*1b3f573fSAndroid Build Coastguard Worker  [orig.knownMapField setEnum:Proto2MapEnumPlusExtra_EProto2MapEnumFoo
1437*1b3f573fSAndroid Build Coastguard Worker                       forKey:0];
1438*1b3f573fSAndroid Build Coastguard Worker  [orig.unknownMapField setEnum:Proto2MapEnumPlusExtra_EProto2MapEnumExtra
1439*1b3f573fSAndroid Build Coastguard Worker                         forKey:0];
1440*1b3f573fSAndroid Build Coastguard Worker
1441*1b3f573fSAndroid Build Coastguard Worker  NSData *data = [orig data];
1442*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(data);
1443*1b3f573fSAndroid Build Coastguard Worker  TestEnumMap *msg1 = [TestEnumMap parseFromData:data error:NULL];
1444*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg1.knownMapField.count, 1U);
1445*1b3f573fSAndroid Build Coastguard Worker  int32_t val = -1;
1446*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([msg1.knownMapField getEnum:&val forKey:0]);
1447*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(val, Proto2MapEnum_Proto2MapEnumFoo);
1448*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg1.unknownFields.countOfFields, 1U);
1449*1b3f573fSAndroid Build Coastguard Worker
1450*1b3f573fSAndroid Build Coastguard Worker  data = [msg1 data];
1451*1b3f573fSAndroid Build Coastguard Worker  TestEnumMapPlusExtra *msg2 =
1452*1b3f573fSAndroid Build Coastguard Worker      [TestEnumMapPlusExtra parseFromData:data error:NULL];
1453*1b3f573fSAndroid Build Coastguard Worker  val = -1;
1454*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg2.knownMapField.count, 1U);
1455*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([msg2.knownMapField getEnum:&val forKey:0]);
1456*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumFoo);
1457*1b3f573fSAndroid Build Coastguard Worker  val = -1;
1458*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg2.unknownMapField.count, 1U);
1459*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([msg2.unknownMapField getEnum:&val forKey:0]);
1460*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumExtra);
1461*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg2.unknownFields.countOfFields, 0U);
1462*1b3f573fSAndroid Build Coastguard Worker
1463*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(orig, msg2);
1464*1b3f573fSAndroid Build Coastguard Worker
1465*1b3f573fSAndroid Build Coastguard Worker  [orig release];
1466*1b3f573fSAndroid Build Coastguard Worker}
1467*1b3f573fSAndroid Build Coastguard Worker
1468*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Map Round Tripping
1469*1b3f573fSAndroid Build Coastguard Worker
1470*1b3f573fSAndroid Build Coastguard Worker- (void)testProto2MapRoundTripping {
1471*1b3f573fSAndroid Build Coastguard Worker  Message2 *msg = [[Message2 alloc] init];
1472*1b3f573fSAndroid Build Coastguard Worker
1473*1b3f573fSAndroid Build Coastguard Worker  // Key/Value data should result in different byte lengths on wire to ensure
1474*1b3f573fSAndroid Build Coastguard Worker  // everything is right.
1475*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Int32 setInt32:1000 forKey:200];
1476*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Int32 setInt32:101 forKey:2001];
1477*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt64Int64 setInt64:1002 forKey:202];
1478*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt64Int64 setInt64:103 forKey:2003];
1479*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt64Int64 setInt64:4294967296 forKey:4294967297];
1480*1b3f573fSAndroid Build Coastguard Worker  [msg.mapUint32Uint32 setUInt32:1004 forKey:204];
1481*1b3f573fSAndroid Build Coastguard Worker  [msg.mapUint32Uint32 setUInt32:105 forKey:2005];
1482*1b3f573fSAndroid Build Coastguard Worker  [msg.mapUint64Uint64 setUInt64:1006 forKey:206];
1483*1b3f573fSAndroid Build Coastguard Worker  [msg.mapUint64Uint64 setUInt64:107 forKey:2007];
1484*1b3f573fSAndroid Build Coastguard Worker  [msg.mapUint64Uint64 setUInt64:4294967298 forKey:4294967299];
1485*1b3f573fSAndroid Build Coastguard Worker  [msg.mapSint32Sint32 setInt32:1008 forKey:208];
1486*1b3f573fSAndroid Build Coastguard Worker  [msg.mapSint32Sint32 setInt32:109 forKey:2009];
1487*1b3f573fSAndroid Build Coastguard Worker  [msg.mapSint64Sint64 setInt64:1010 forKey:210];
1488*1b3f573fSAndroid Build Coastguard Worker  [msg.mapSint64Sint64 setInt64:111 forKey:2011];
1489*1b3f573fSAndroid Build Coastguard Worker  [msg.mapSint64Sint64 setInt64:4294967300 forKey:4294967301];
1490*1b3f573fSAndroid Build Coastguard Worker  [msg.mapFixed32Fixed32 setUInt32:1012 forKey:212];
1491*1b3f573fSAndroid Build Coastguard Worker  [msg.mapFixed32Fixed32 setUInt32:113 forKey:2013];
1492*1b3f573fSAndroid Build Coastguard Worker  [msg.mapFixed64Fixed64 setUInt64:1014 forKey:214];
1493*1b3f573fSAndroid Build Coastguard Worker  [msg.mapFixed64Fixed64 setUInt64:115 forKey:2015];
1494*1b3f573fSAndroid Build Coastguard Worker  [msg.mapFixed64Fixed64 setUInt64:4294967302 forKey:4294967303];
1495*1b3f573fSAndroid Build Coastguard Worker  [msg.mapSfixed32Sfixed32 setInt32:1016 forKey:216];
1496*1b3f573fSAndroid Build Coastguard Worker  [msg.mapSfixed32Sfixed32 setInt32:117 forKey:2017];
1497*1b3f573fSAndroid Build Coastguard Worker  [msg.mapSfixed64Sfixed64 setInt64:1018 forKey:218];
1498*1b3f573fSAndroid Build Coastguard Worker  [msg.mapSfixed64Sfixed64 setInt64:119 forKey:2019];
1499*1b3f573fSAndroid Build Coastguard Worker  [msg.mapSfixed64Sfixed64 setInt64:4294967304 forKey:4294967305];
1500*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Float setFloat:1020.f forKey:220];
1501*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Float setFloat:121.f forKey:2021];
1502*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Double setDouble:1022. forKey:222];
1503*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Double setDouble:123. forKey:2023];
1504*1b3f573fSAndroid Build Coastguard Worker  [msg.mapBoolBool setBool:false forKey:true];
1505*1b3f573fSAndroid Build Coastguard Worker  [msg.mapBoolBool setBool:true forKey:false];
1506*1b3f573fSAndroid Build Coastguard Worker  msg.mapStringString[@"224"] = @"1024";
1507*1b3f573fSAndroid Build Coastguard Worker  msg.mapStringString[@"2025"] = @"125";
1508*1b3f573fSAndroid Build Coastguard Worker  msg.mapStringBytes[@"226"] = DataFromCStr("1026");
1509*1b3f573fSAndroid Build Coastguard Worker  msg.mapStringBytes[@"2027"] = DataFromCStr("127");
1510*1b3f573fSAndroid Build Coastguard Worker  Message2 *val1 = [[Message2 alloc] init];
1511*1b3f573fSAndroid Build Coastguard Worker  val1.optionalInt32 = 1028;
1512*1b3f573fSAndroid Build Coastguard Worker  Message2 *val2 = [[Message2 alloc] init];
1513*1b3f573fSAndroid Build Coastguard Worker  val2.optionalInt32 = 129;
1514*1b3f573fSAndroid Build Coastguard Worker  [msg.mapStringMessage setObject:val1 forKey:@"228"];
1515*1b3f573fSAndroid Build Coastguard Worker  [msg.mapStringMessage setObject:val2 forKey:@"2029"];
1516*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Bytes setObject:DataFromCStr("1030 bytes") forKey:230];
1517*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Bytes setObject:DataFromCStr("131") forKey:2031];
1518*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Enum setEnum:Message2_Enum_Bar forKey:232];
1519*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Enum setEnum:Message2_Enum_Baz forKey:2033];
1520*1b3f573fSAndroid Build Coastguard Worker  Message2 *val3 = [[Message2 alloc] init];
1521*1b3f573fSAndroid Build Coastguard Worker  val3.optionalInt32 = 1034;
1522*1b3f573fSAndroid Build Coastguard Worker  Message2 *val4 = [[Message2 alloc] init];
1523*1b3f573fSAndroid Build Coastguard Worker  val4.optionalInt32 = 135;
1524*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Message setObject:val3 forKey:234];
1525*1b3f573fSAndroid Build Coastguard Worker  [msg.mapInt32Message setObject:val4 forKey:2035];
1526*1b3f573fSAndroid Build Coastguard Worker
1527*1b3f573fSAndroid Build Coastguard Worker  NSData *data = [msg data];
1528*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(data);
1529*1b3f573fSAndroid Build Coastguard Worker  Message2 *msg2 = [[Message2 alloc] initWithData:data error:NULL];
1530*1b3f573fSAndroid Build Coastguard Worker
1531*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg2, msg);  // Pointer comparison
1532*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg2, msg);
1533*1b3f573fSAndroid Build Coastguard Worker
1534*1b3f573fSAndroid Build Coastguard Worker  [val4 release];
1535*1b3f573fSAndroid Build Coastguard Worker  [val3 release];
1536*1b3f573fSAndroid Build Coastguard Worker  [val2 release];
1537*1b3f573fSAndroid Build Coastguard Worker  [val1 release];
1538*1b3f573fSAndroid Build Coastguard Worker  [msg2 release];
1539*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1540*1b3f573fSAndroid Build Coastguard Worker}
1541*1b3f573fSAndroid Build Coastguard Worker
1542*1b3f573fSAndroid Build Coastguard Worker@end
1543