xref: /aosp_15_r20/external/protobuf/objectivec/Tests/GPBMessageTests+Runtime.m (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format
2*1b3f573fSAndroid Build Coastguard Worker// Copyright 2015 Google Inc.  All rights reserved.
3*1b3f573fSAndroid Build Coastguard Worker// https://developers.google.com/protocol-buffers/
4*1b3f573fSAndroid Build Coastguard Worker//
5*1b3f573fSAndroid Build Coastguard Worker// Redistribution and use in source and binary forms, with or without
6*1b3f573fSAndroid Build Coastguard Worker// modification, are permitted provided that the following conditions are
7*1b3f573fSAndroid Build Coastguard Worker// met:
8*1b3f573fSAndroid Build Coastguard Worker//
9*1b3f573fSAndroid Build Coastguard Worker//     * Redistributions of source code must retain the above copyright
10*1b3f573fSAndroid Build Coastguard Worker// notice, this list of conditions and the following disclaimer.
11*1b3f573fSAndroid Build Coastguard Worker//     * Redistributions in binary form must reproduce the above
12*1b3f573fSAndroid Build Coastguard Worker// copyright notice, this list of conditions and the following disclaimer
13*1b3f573fSAndroid Build Coastguard Worker// in the documentation and/or other materials provided with the
14*1b3f573fSAndroid Build Coastguard Worker// distribution.
15*1b3f573fSAndroid Build Coastguard Worker//     * Neither the name of Google Inc. nor the names of its
16*1b3f573fSAndroid Build Coastguard Worker// contributors may be used to endorse or promote products derived from
17*1b3f573fSAndroid Build Coastguard Worker// this software without specific prior written permission.
18*1b3f573fSAndroid Build Coastguard Worker//
19*1b3f573fSAndroid Build Coastguard Worker// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*1b3f573fSAndroid Build Coastguard Worker// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*1b3f573fSAndroid Build Coastguard Worker// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23*1b3f573fSAndroid Build Coastguard Worker// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*1b3f573fSAndroid Build Coastguard Worker// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*1b3f573fSAndroid Build Coastguard Worker// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*1b3f573fSAndroid Build Coastguard Worker// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*1b3f573fSAndroid Build Coastguard Worker// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29*1b3f573fSAndroid Build Coastguard Worker// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*1b3f573fSAndroid Build Coastguard Worker
31*1b3f573fSAndroid Build Coastguard Worker#import "GPBTestUtilities.h"
32*1b3f573fSAndroid Build Coastguard Worker
33*1b3f573fSAndroid Build Coastguard Worker#import <objc/runtime.h>
34*1b3f573fSAndroid Build Coastguard Worker
35*1b3f573fSAndroid Build Coastguard Worker#import "GPBMessage.h"
36*1b3f573fSAndroid Build Coastguard Worker
37*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/MapUnittest.pbobjc.h"
38*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/Unittest.pbobjc.h"
39*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestCycle.pbobjc.h"
40*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestObjcStartup.pbobjc.h"
41*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
42*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
43*1b3f573fSAndroid Build Coastguard Worker
44*1b3f573fSAndroid Build Coastguard Worker@interface MessageRuntimeTests : GPBTestCase
45*1b3f573fSAndroid Build Coastguard Worker@end
46*1b3f573fSAndroid Build Coastguard Worker
47*1b3f573fSAndroid Build Coastguard Worker@implementation MessageRuntimeTests
48*1b3f573fSAndroid Build Coastguard Worker
49*1b3f573fSAndroid Build Coastguard Worker// TODO(thomasvl): Pull tests over from GPBMessageTests that are runtime
50*1b3f573fSAndroid Build Coastguard Worker// specific.
51*1b3f573fSAndroid Build Coastguard Worker
52*1b3f573fSAndroid Build Coastguard Worker- (void)testStartupOrdering {
53*1b3f573fSAndroid Build Coastguard Worker  // Message class/Root class initialization is a little tricky, so these just
54*1b3f573fSAndroid Build Coastguard Worker  // create some possible patterns that can be a problem. The messages don't
55*1b3f573fSAndroid Build Coastguard Worker  // have to be exercised, just creating them is enough to test.  If there
56*1b3f573fSAndroid Build Coastguard Worker  // is a problem, the runtime should assert or hang.
57*1b3f573fSAndroid Build Coastguard Worker  //
58*1b3f573fSAndroid Build Coastguard Worker  // Note: the messages from these proto files should not be used in any other
59*1b3f573fSAndroid Build Coastguard Worker  // tests, that way when they are referenced here it will be the first use and
60*1b3f573fSAndroid Build Coastguard Worker  // initialization will take place now.
61*1b3f573fSAndroid Build Coastguard Worker
62*1b3f573fSAndroid Build Coastguard Worker  TestObjCStartupMessage *message = [TestObjCStartupMessage message];
63*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(message);
64*1b3f573fSAndroid Build Coastguard Worker
65*1b3f573fSAndroid Build Coastguard Worker  CycleBaz *baz = [CycleBaz message];
66*1b3f573fSAndroid Build Coastguard Worker  CycleBar *bar = [CycleBar message];
67*1b3f573fSAndroid Build Coastguard Worker  CycleFoo *foo = [CycleFoo message];
68*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(baz);
69*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(bar);
70*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(foo);
71*1b3f573fSAndroid Build Coastguard Worker}
72*1b3f573fSAndroid Build Coastguard Worker
73*1b3f573fSAndroid Build Coastguard Worker- (void)testProto2HasMethodSupport {
74*1b3f573fSAndroid Build Coastguard Worker  NSArray *names = @[
75*1b3f573fSAndroid Build Coastguard Worker    @"Int32",
76*1b3f573fSAndroid Build Coastguard Worker    @"Int64",
77*1b3f573fSAndroid Build Coastguard Worker    @"Uint32",
78*1b3f573fSAndroid Build Coastguard Worker    @"Uint64",
79*1b3f573fSAndroid Build Coastguard Worker    @"Sint32",
80*1b3f573fSAndroid Build Coastguard Worker    @"Sint64",
81*1b3f573fSAndroid Build Coastguard Worker    @"Fixed32",
82*1b3f573fSAndroid Build Coastguard Worker    @"Fixed64",
83*1b3f573fSAndroid Build Coastguard Worker    @"Sfixed32",
84*1b3f573fSAndroid Build Coastguard Worker    @"Sfixed64",
85*1b3f573fSAndroid Build Coastguard Worker    @"Float",
86*1b3f573fSAndroid Build Coastguard Worker    @"Double",
87*1b3f573fSAndroid Build Coastguard Worker    @"Bool",
88*1b3f573fSAndroid Build Coastguard Worker    @"String",
89*1b3f573fSAndroid Build Coastguard Worker    @"Bytes",
90*1b3f573fSAndroid Build Coastguard Worker    @"Group",
91*1b3f573fSAndroid Build Coastguard Worker    @"Message",
92*1b3f573fSAndroid Build Coastguard Worker    @"Enum",
93*1b3f573fSAndroid Build Coastguard Worker  ];
94*1b3f573fSAndroid Build Coastguard Worker
95*1b3f573fSAndroid Build Coastguard Worker  // Proto2 gets:
96*1b3f573fSAndroid Build Coastguard Worker
97*1b3f573fSAndroid Build Coastguard Worker  // Single fields - has*/setHas* is valid.
98*1b3f573fSAndroid Build Coastguard Worker
99*1b3f573fSAndroid Build Coastguard Worker  for (NSString *name in names) {
100*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - hasOptionalInt32/setHasOptionalInt32:
101*1b3f573fSAndroid Build Coastguard Worker    SEL hasSel = NSSelectorFromString(
102*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"hasOptional%@", name]);
103*1b3f573fSAndroid Build Coastguard Worker    SEL setHasSel = NSSelectorFromString(
104*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"setHasOptional%@:", name]);
105*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue([Message2 instancesRespondToSelector:hasSel], @"field: %@",
106*1b3f573fSAndroid Build Coastguard Worker                  name);
107*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue([Message2 instancesRespondToSelector:setHasSel], @"field: %@",
108*1b3f573fSAndroid Build Coastguard Worker                  name);
109*1b3f573fSAndroid Build Coastguard Worker  }
110*1b3f573fSAndroid Build Coastguard Worker
111*1b3f573fSAndroid Build Coastguard Worker  // Repeated fields
112*1b3f573fSAndroid Build Coastguard Worker  //  - no has*/setHas*
113*1b3f573fSAndroid Build Coastguard Worker  //  - *Count
114*1b3f573fSAndroid Build Coastguard Worker
115*1b3f573fSAndroid Build Coastguard Worker  for (NSString *name in names) {
116*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - hasRepeatedInt32Array/setHasRepeatedInt32Array:
117*1b3f573fSAndroid Build Coastguard Worker    SEL hasSel = NSSelectorFromString(
118*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"hasRepeated%@Array", name]);
119*1b3f573fSAndroid Build Coastguard Worker    SEL setHasSel = NSSelectorFromString(
120*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"setHasRepeated%@Array:", name]);
121*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message2 instancesRespondToSelector:hasSel], @"field: %@",
122*1b3f573fSAndroid Build Coastguard Worker                   name);
123*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message2 instancesRespondToSelector:setHasSel],
124*1b3f573fSAndroid Build Coastguard Worker                   @"field: %@", name);
125*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - repeatedInt32Array_Count
126*1b3f573fSAndroid Build Coastguard Worker    SEL countSel = NSSelectorFromString(
127*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"repeated%@Array_Count", name]);
128*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue([Message2 instancesRespondToSelector:countSel], @"field: %@",
129*1b3f573fSAndroid Build Coastguard Worker                   name);
130*1b3f573fSAndroid Build Coastguard Worker  }
131*1b3f573fSAndroid Build Coastguard Worker
132*1b3f573fSAndroid Build Coastguard Worker  // OneOf fields - no has*/setHas*
133*1b3f573fSAndroid Build Coastguard Worker
134*1b3f573fSAndroid Build Coastguard Worker  for (NSString *name in names) {
135*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - hasOneofInt32/setHasOneofInt32:
136*1b3f573fSAndroid Build Coastguard Worker    SEL hasSel =
137*1b3f573fSAndroid Build Coastguard Worker        NSSelectorFromString([NSString stringWithFormat:@"hasOneof%@", name]);
138*1b3f573fSAndroid Build Coastguard Worker    SEL setHasSel = NSSelectorFromString(
139*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"setHasOneof%@:", name]);
140*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message2 instancesRespondToSelector:hasSel], @"field: %@",
141*1b3f573fSAndroid Build Coastguard Worker                   name);
142*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message2 instancesRespondToSelector:setHasSel],
143*1b3f573fSAndroid Build Coastguard Worker                   @"field: %@", name);
144*1b3f573fSAndroid Build Coastguard Worker  }
145*1b3f573fSAndroid Build Coastguard Worker
146*1b3f573fSAndroid Build Coastguard Worker  // map<> fields
147*1b3f573fSAndroid Build Coastguard Worker  //  - no has*/setHas*
148*1b3f573fSAndroid Build Coastguard Worker  //  - *Count
149*1b3f573fSAndroid Build Coastguard Worker
150*1b3f573fSAndroid Build Coastguard Worker  NSArray *mapNames = @[
151*1b3f573fSAndroid Build Coastguard Worker    @"Int32Int32",
152*1b3f573fSAndroid Build Coastguard Worker    @"Int64Int64",
153*1b3f573fSAndroid Build Coastguard Worker    @"Uint32Uint32",
154*1b3f573fSAndroid Build Coastguard Worker    @"Uint64Uint64",
155*1b3f573fSAndroid Build Coastguard Worker    @"Sint32Sint32",
156*1b3f573fSAndroid Build Coastguard Worker    @"Sint64Sint64",
157*1b3f573fSAndroid Build Coastguard Worker    @"Fixed32Fixed32",
158*1b3f573fSAndroid Build Coastguard Worker    @"Fixed64Fixed64",
159*1b3f573fSAndroid Build Coastguard Worker    @"Sfixed32Sfixed32",
160*1b3f573fSAndroid Build Coastguard Worker    @"Sfixed64Sfixed64",
161*1b3f573fSAndroid Build Coastguard Worker    @"Int32Float",
162*1b3f573fSAndroid Build Coastguard Worker    @"Int32Double",
163*1b3f573fSAndroid Build Coastguard Worker    @"BoolBool",
164*1b3f573fSAndroid Build Coastguard Worker    @"StringString",
165*1b3f573fSAndroid Build Coastguard Worker    @"StringBytes",
166*1b3f573fSAndroid Build Coastguard Worker    @"StringMessage",
167*1b3f573fSAndroid Build Coastguard Worker    @"Int32Bytes",
168*1b3f573fSAndroid Build Coastguard Worker    @"Int32Enum",
169*1b3f573fSAndroid Build Coastguard Worker    @"Int32Message",
170*1b3f573fSAndroid Build Coastguard Worker  ];
171*1b3f573fSAndroid Build Coastguard Worker
172*1b3f573fSAndroid Build Coastguard Worker  for (NSString *name in mapNames) {
173*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - hasMapInt32Int32/setHasMapInt32Int32:
174*1b3f573fSAndroid Build Coastguard Worker    SEL hasSel = NSSelectorFromString(
175*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"hasMap%@", name]);
176*1b3f573fSAndroid Build Coastguard Worker    SEL setHasSel = NSSelectorFromString(
177*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"setHasMap%@:", name]);
178*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message2 instancesRespondToSelector:hasSel], @"field: %@",
179*1b3f573fSAndroid Build Coastguard Worker                   name);
180*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message2 instancesRespondToSelector:setHasSel],
181*1b3f573fSAndroid Build Coastguard Worker                   @"field: %@", name);
182*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - mapInt32Int32Count
183*1b3f573fSAndroid Build Coastguard Worker    SEL countSel = NSSelectorFromString(
184*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"map%@_Count", name]);
185*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue([Message2 instancesRespondToSelector:countSel], @"field: %@",
186*1b3f573fSAndroid Build Coastguard Worker                   name);
187*1b3f573fSAndroid Build Coastguard Worker  }
188*1b3f573fSAndroid Build Coastguard Worker
189*1b3f573fSAndroid Build Coastguard Worker}
190*1b3f573fSAndroid Build Coastguard Worker
191*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3HasMethodSupport {
192*1b3f573fSAndroid Build Coastguard Worker  NSArray *names = @[
193*1b3f573fSAndroid Build Coastguard Worker    @"Int32",
194*1b3f573fSAndroid Build Coastguard Worker    @"Int64",
195*1b3f573fSAndroid Build Coastguard Worker    @"Uint32",
196*1b3f573fSAndroid Build Coastguard Worker    @"Uint64",
197*1b3f573fSAndroid Build Coastguard Worker    @"Sint32",
198*1b3f573fSAndroid Build Coastguard Worker    @"Sint64",
199*1b3f573fSAndroid Build Coastguard Worker    @"Fixed32",
200*1b3f573fSAndroid Build Coastguard Worker    @"Fixed64",
201*1b3f573fSAndroid Build Coastguard Worker    @"Sfixed32",
202*1b3f573fSAndroid Build Coastguard Worker    @"Sfixed64",
203*1b3f573fSAndroid Build Coastguard Worker    @"Float",
204*1b3f573fSAndroid Build Coastguard Worker    @"Double",
205*1b3f573fSAndroid Build Coastguard Worker    @"Bool",
206*1b3f573fSAndroid Build Coastguard Worker    @"String",
207*1b3f573fSAndroid Build Coastguard Worker    @"Bytes",
208*1b3f573fSAndroid Build Coastguard Worker    @"Message",
209*1b3f573fSAndroid Build Coastguard Worker    @"Enum",
210*1b3f573fSAndroid Build Coastguard Worker  ];
211*1b3f573fSAndroid Build Coastguard Worker
212*1b3f573fSAndroid Build Coastguard Worker  // Proto3 gets:
213*1b3f573fSAndroid Build Coastguard Worker
214*1b3f573fSAndroid Build Coastguard Worker  // Single fields
215*1b3f573fSAndroid Build Coastguard Worker  //  - has*/setHas* invalid for primitive types.
216*1b3f573fSAndroid Build Coastguard Worker  //  - has*/setHas* valid for Message.
217*1b3f573fSAndroid Build Coastguard Worker
218*1b3f573fSAndroid Build Coastguard Worker  for (NSString *name in names) {
219*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - hasOptionalInt32/setHasOptionalInt32:
220*1b3f573fSAndroid Build Coastguard Worker    SEL hasSel = NSSelectorFromString(
221*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"hasOptional%@", name]);
222*1b3f573fSAndroid Build Coastguard Worker    SEL setHasSel = NSSelectorFromString(
223*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"setHasOptional%@:", name]);
224*1b3f573fSAndroid Build Coastguard Worker    if ([name isEqual:@"Message"]) {
225*1b3f573fSAndroid Build Coastguard Worker      // Sub messages/groups are the exception.
226*1b3f573fSAndroid Build Coastguard Worker      XCTAssertTrue([Message3 instancesRespondToSelector:hasSel], @"field: %@",
227*1b3f573fSAndroid Build Coastguard Worker                    name);
228*1b3f573fSAndroid Build Coastguard Worker      XCTAssertTrue([Message3 instancesRespondToSelector:setHasSel],
229*1b3f573fSAndroid Build Coastguard Worker                    @"field: %@", name);
230*1b3f573fSAndroid Build Coastguard Worker    } else {
231*1b3f573fSAndroid Build Coastguard Worker      XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@",
232*1b3f573fSAndroid Build Coastguard Worker                     name);
233*1b3f573fSAndroid Build Coastguard Worker      XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel],
234*1b3f573fSAndroid Build Coastguard Worker                     @"field: %@", name);
235*1b3f573fSAndroid Build Coastguard Worker    }
236*1b3f573fSAndroid Build Coastguard Worker  }
237*1b3f573fSAndroid Build Coastguard Worker
238*1b3f573fSAndroid Build Coastguard Worker  // Repeated fields
239*1b3f573fSAndroid Build Coastguard Worker  //  - no has*/setHas*
240*1b3f573fSAndroid Build Coastguard Worker  //  - *Count
241*1b3f573fSAndroid Build Coastguard Worker
242*1b3f573fSAndroid Build Coastguard Worker  for (NSString *name in names) {
243*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - hasRepeatedInt32Array/setHasRepeatedInt32Array:
244*1b3f573fSAndroid Build Coastguard Worker    SEL hasSel = NSSelectorFromString(
245*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"hasRepeated%@Array", name]);
246*1b3f573fSAndroid Build Coastguard Worker    SEL setHasSel = NSSelectorFromString(
247*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"setHasRepeated%@Array:", name]);
248*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@",
249*1b3f573fSAndroid Build Coastguard Worker                   name);
250*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel],
251*1b3f573fSAndroid Build Coastguard Worker                   @"field: %@", name);
252*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - repeatedInt32Array_Count
253*1b3f573fSAndroid Build Coastguard Worker    SEL countSel = NSSelectorFromString(
254*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"repeated%@Array_Count", name]);
255*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue([Message3 instancesRespondToSelector:countSel], @"field: %@",
256*1b3f573fSAndroid Build Coastguard Worker                  name);
257*1b3f573fSAndroid Build Coastguard Worker  }
258*1b3f573fSAndroid Build Coastguard Worker
259*1b3f573fSAndroid Build Coastguard Worker  // OneOf fields - no has*/setHas*
260*1b3f573fSAndroid Build Coastguard Worker
261*1b3f573fSAndroid Build Coastguard Worker  for (NSString *name in names) {
262*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - hasOneofInt32/setHasOneofInt32:
263*1b3f573fSAndroid Build Coastguard Worker    SEL hasSel =
264*1b3f573fSAndroid Build Coastguard Worker        NSSelectorFromString([NSString stringWithFormat:@"hasOneof%@", name]);
265*1b3f573fSAndroid Build Coastguard Worker    SEL setHasSel = NSSelectorFromString(
266*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"setHasOneof%@:", name]);
267*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@",
268*1b3f573fSAndroid Build Coastguard Worker                   name);
269*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel],
270*1b3f573fSAndroid Build Coastguard Worker                   @"field: %@", name);
271*1b3f573fSAndroid Build Coastguard Worker  }
272*1b3f573fSAndroid Build Coastguard Worker
273*1b3f573fSAndroid Build Coastguard Worker  // Single Optional fields
274*1b3f573fSAndroid Build Coastguard Worker  //  - has*/setHas* thanks to the optional keyword in proto3, they exist
275*1b3f573fSAndroid Build Coastguard Worker  //    for primitive types.
276*1b3f573fSAndroid Build Coastguard Worker  //  - has*/setHas* valid for Message.
277*1b3f573fSAndroid Build Coastguard Worker
278*1b3f573fSAndroid Build Coastguard Worker  for (NSString *name in names) {
279*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - hasOptionalInt32/setHasOptionalInt32:
280*1b3f573fSAndroid Build Coastguard Worker    SEL hasSel = NSSelectorFromString(
281*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"hasOptional%@", name]);
282*1b3f573fSAndroid Build Coastguard Worker    SEL setHasSel = NSSelectorFromString(
283*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"setHasOptional%@:", name]);
284*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue([Message3Optional instancesRespondToSelector:hasSel], @"field: %@",
285*1b3f573fSAndroid Build Coastguard Worker                  name);
286*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue([Message3Optional instancesRespondToSelector:setHasSel],
287*1b3f573fSAndroid Build Coastguard Worker                  @"field: %@", name);
288*1b3f573fSAndroid Build Coastguard Worker  }
289*1b3f573fSAndroid Build Coastguard Worker
290*1b3f573fSAndroid Build Coastguard Worker  // map<> fields
291*1b3f573fSAndroid Build Coastguard Worker  //  - no has*/setHas*
292*1b3f573fSAndroid Build Coastguard Worker  //  - *Count
293*1b3f573fSAndroid Build Coastguard Worker
294*1b3f573fSAndroid Build Coastguard Worker  NSArray *mapNames = @[
295*1b3f573fSAndroid Build Coastguard Worker    @"Int32Int32",
296*1b3f573fSAndroid Build Coastguard Worker    @"Int64Int64",
297*1b3f573fSAndroid Build Coastguard Worker    @"Uint32Uint32",
298*1b3f573fSAndroid Build Coastguard Worker    @"Uint64Uint64",
299*1b3f573fSAndroid Build Coastguard Worker    @"Sint32Sint32",
300*1b3f573fSAndroid Build Coastguard Worker    @"Sint64Sint64",
301*1b3f573fSAndroid Build Coastguard Worker    @"Fixed32Fixed32",
302*1b3f573fSAndroid Build Coastguard Worker    @"Fixed64Fixed64",
303*1b3f573fSAndroid Build Coastguard Worker    @"Sfixed32Sfixed32",
304*1b3f573fSAndroid Build Coastguard Worker    @"Sfixed64Sfixed64",
305*1b3f573fSAndroid Build Coastguard Worker    @"Int32Float",
306*1b3f573fSAndroid Build Coastguard Worker    @"Int32Double",
307*1b3f573fSAndroid Build Coastguard Worker    @"BoolBool",
308*1b3f573fSAndroid Build Coastguard Worker    @"StringString",
309*1b3f573fSAndroid Build Coastguard Worker    @"StringBytes",
310*1b3f573fSAndroid Build Coastguard Worker    @"StringMessage",
311*1b3f573fSAndroid Build Coastguard Worker    @"Int32Bytes",
312*1b3f573fSAndroid Build Coastguard Worker    @"Int32Enum",
313*1b3f573fSAndroid Build Coastguard Worker    @"Int32Message",
314*1b3f573fSAndroid Build Coastguard Worker  ];
315*1b3f573fSAndroid Build Coastguard Worker
316*1b3f573fSAndroid Build Coastguard Worker  for (NSString *name in mapNames) {
317*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - hasMapInt32Int32/setHasMapInt32Int32:
318*1b3f573fSAndroid Build Coastguard Worker    SEL hasSel = NSSelectorFromString(
319*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"hasMap%@", name]);
320*1b3f573fSAndroid Build Coastguard Worker    SEL setHasSel = NSSelectorFromString(
321*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"setHasMap%@:", name]);
322*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@",
323*1b3f573fSAndroid Build Coastguard Worker                   name);
324*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel],
325*1b3f573fSAndroid Build Coastguard Worker                   @"field: %@", name);
326*1b3f573fSAndroid Build Coastguard Worker    // build the selector, i.e. - mapInt32Int32Count
327*1b3f573fSAndroid Build Coastguard Worker    SEL countSel = NSSelectorFromString(
328*1b3f573fSAndroid Build Coastguard Worker        [NSString stringWithFormat:@"map%@_Count", name]);
329*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue([Message3 instancesRespondToSelector:countSel], @"field: %@",
330*1b3f573fSAndroid Build Coastguard Worker                   name);
331*1b3f573fSAndroid Build Coastguard Worker  }
332*1b3f573fSAndroid Build Coastguard Worker}
333*1b3f573fSAndroid Build Coastguard Worker
334*1b3f573fSAndroid Build Coastguard Worker- (void)testProto2SingleFieldHasBehavior {
335*1b3f573fSAndroid Build Coastguard Worker  //
336*1b3f573fSAndroid Build Coastguard Worker  // Setting to any value including the default value (0) should result has*
337*1b3f573fSAndroid Build Coastguard Worker  // being true.
338*1b3f573fSAndroid Build Coastguard Worker  //
339*1b3f573fSAndroid Build Coastguard Worker
340*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE PROTO2_TEST_HAS_FIELD(FIELD, NON_ZERO_VALUE, ZERO_VALUE)
341*1b3f573fSAndroid Build Coastguard Worker//%  {  // optional##FIELD :: NON_ZERO_VALUE
342*1b3f573fSAndroid Build Coastguard Worker//%    Message2 *msg = [[Message2 alloc] init];
343*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(msg.hasOptional##FIELD);
344*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional##FIELD));
345*1b3f573fSAndroid Build Coastguard Worker//%    msg.optional##FIELD = NON_ZERO_VALUE;
346*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertTrue(msg.hasOptional##FIELD);
347*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional##FIELD));
348*1b3f573fSAndroid Build Coastguard Worker//%    [msg release];
349*1b3f573fSAndroid Build Coastguard Worker//%  }
350*1b3f573fSAndroid Build Coastguard Worker//%  {  // optional##FIELD :: ZERO_VALUE
351*1b3f573fSAndroid Build Coastguard Worker//%    Message2 *msg = [[Message2 alloc] init];
352*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(msg.hasOptional##FIELD);
353*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional##FIELD));
354*1b3f573fSAndroid Build Coastguard Worker//%    msg.optional##FIELD = ZERO_VALUE;
355*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertTrue(msg.hasOptional##FIELD);
356*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional##FIELD));
357*1b3f573fSAndroid Build Coastguard Worker//%    [msg release];
358*1b3f573fSAndroid Build Coastguard Worker//%  }
359*1b3f573fSAndroid Build Coastguard Worker//%
360*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE PROTO2_TEST_CLEAR_FIELD_WITH_NIL(FIELD, VALUE)
361*1b3f573fSAndroid Build Coastguard Worker//%  {  // optional##FIELD
362*1b3f573fSAndroid Build Coastguard Worker//%    Message2 *msg = [[Message2 alloc] init];
363*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional##FIELD));
364*1b3f573fSAndroid Build Coastguard Worker//%    msg.optional##FIELD = VALUE;
365*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional##FIELD));
366*1b3f573fSAndroid Build Coastguard Worker//%    msg.optional##FIELD = nil;
367*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional##FIELD));
368*1b3f573fSAndroid Build Coastguard Worker//%    [msg release];
369*1b3f573fSAndroid Build Coastguard Worker//%  }
370*1b3f573fSAndroid Build Coastguard Worker//%
371*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE PROTO2_TEST_HAS_FIELDS()
372*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Int32, 1, 0)
373*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Int64, 1, 0)
374*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Uint32, 1, 0)
375*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Uint64, 1, 0)
376*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Sint32, 1, 0)
377*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Sint64, 1, 0)
378*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Fixed32, 1, 0)
379*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Fixed64, 1, 0)
380*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Sfixed32, 1, 0)
381*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Sfixed64, 1, 0)
382*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Float, 1.0f, 0.0f)
383*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Double, 1.0, 0.0)
384*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Bool, YES, NO)
385*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(String, @"foo", @"")
386*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding], [NSData data])
387*1b3f573fSAndroid Build Coastguard Worker//%  //
388*1b3f573fSAndroid Build Coastguard Worker//%  // Test doesn't apply to optionalGroup/optionalMessage.
389*1b3f573fSAndroid Build Coastguard Worker//%  //
390*1b3f573fSAndroid Build Coastguard Worker//%
391*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_HAS_FIELD(Enum, Message2_Enum_Bar, Message2_Enum_Foo)
392*1b3f573fSAndroid Build Coastguard Worker//%  //
393*1b3f573fSAndroid Build Coastguard Worker//%  // Nil can also be used to clear strings, bytes, groups, and messages.
394*1b3f573fSAndroid Build Coastguard Worker//%  //
395*1b3f573fSAndroid Build Coastguard Worker//%
396*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(String, @"foo")
397*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding])
398*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(Group, [Message2_OptionalGroup message])
399*1b3f573fSAndroid Build Coastguard Worker//%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(Message, [Message2 message])
400*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND PROTO2_TEST_HAS_FIELDS()
401*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
402*1b3f573fSAndroid Build Coastguard Worker// clang-format off
403*1b3f573fSAndroid Build Coastguard Worker
404*1b3f573fSAndroid Build Coastguard Worker  {  // optionalInt32 :: 1
405*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
406*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalInt32);
407*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalInt32));
408*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt32 = 1;
409*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalInt32);
410*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalInt32));
411*1b3f573fSAndroid Build Coastguard Worker    [msg release];
412*1b3f573fSAndroid Build Coastguard Worker  }
413*1b3f573fSAndroid Build Coastguard Worker  {  // optionalInt32 :: 0
414*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
415*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalInt32);
416*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalInt32));
417*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt32 = 0;
418*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalInt32);
419*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalInt32));
420*1b3f573fSAndroid Build Coastguard Worker    [msg release];
421*1b3f573fSAndroid Build Coastguard Worker  }
422*1b3f573fSAndroid Build Coastguard Worker
423*1b3f573fSAndroid Build Coastguard Worker  {  // optionalInt64 :: 1
424*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
425*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalInt64);
426*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalInt64));
427*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt64 = 1;
428*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalInt64);
429*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalInt64));
430*1b3f573fSAndroid Build Coastguard Worker    [msg release];
431*1b3f573fSAndroid Build Coastguard Worker  }
432*1b3f573fSAndroid Build Coastguard Worker  {  // optionalInt64 :: 0
433*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
434*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalInt64);
435*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalInt64));
436*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt64 = 0;
437*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalInt64);
438*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalInt64));
439*1b3f573fSAndroid Build Coastguard Worker    [msg release];
440*1b3f573fSAndroid Build Coastguard Worker  }
441*1b3f573fSAndroid Build Coastguard Worker
442*1b3f573fSAndroid Build Coastguard Worker  {  // optionalUint32 :: 1
443*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
444*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalUint32);
445*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalUint32));
446*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint32 = 1;
447*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalUint32);
448*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalUint32));
449*1b3f573fSAndroid Build Coastguard Worker    [msg release];
450*1b3f573fSAndroid Build Coastguard Worker  }
451*1b3f573fSAndroid Build Coastguard Worker  {  // optionalUint32 :: 0
452*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
453*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalUint32);
454*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalUint32));
455*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint32 = 0;
456*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalUint32);
457*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalUint32));
458*1b3f573fSAndroid Build Coastguard Worker    [msg release];
459*1b3f573fSAndroid Build Coastguard Worker  }
460*1b3f573fSAndroid Build Coastguard Worker
461*1b3f573fSAndroid Build Coastguard Worker  {  // optionalUint64 :: 1
462*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
463*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalUint64);
464*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalUint64));
465*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint64 = 1;
466*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalUint64);
467*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalUint64));
468*1b3f573fSAndroid Build Coastguard Worker    [msg release];
469*1b3f573fSAndroid Build Coastguard Worker  }
470*1b3f573fSAndroid Build Coastguard Worker  {  // optionalUint64 :: 0
471*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
472*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalUint64);
473*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalUint64));
474*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint64 = 0;
475*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalUint64);
476*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalUint64));
477*1b3f573fSAndroid Build Coastguard Worker    [msg release];
478*1b3f573fSAndroid Build Coastguard Worker  }
479*1b3f573fSAndroid Build Coastguard Worker
480*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSint32 :: 1
481*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
482*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalSint32);
483*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSint32));
484*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint32 = 1;
485*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalSint32);
486*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSint32));
487*1b3f573fSAndroid Build Coastguard Worker    [msg release];
488*1b3f573fSAndroid Build Coastguard Worker  }
489*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSint32 :: 0
490*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
491*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalSint32);
492*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSint32));
493*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint32 = 0;
494*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalSint32);
495*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSint32));
496*1b3f573fSAndroid Build Coastguard Worker    [msg release];
497*1b3f573fSAndroid Build Coastguard Worker  }
498*1b3f573fSAndroid Build Coastguard Worker
499*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSint64 :: 1
500*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
501*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalSint64);
502*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSint64));
503*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint64 = 1;
504*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalSint64);
505*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSint64));
506*1b3f573fSAndroid Build Coastguard Worker    [msg release];
507*1b3f573fSAndroid Build Coastguard Worker  }
508*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSint64 :: 0
509*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
510*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalSint64);
511*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSint64));
512*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint64 = 0;
513*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalSint64);
514*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSint64));
515*1b3f573fSAndroid Build Coastguard Worker    [msg release];
516*1b3f573fSAndroid Build Coastguard Worker  }
517*1b3f573fSAndroid Build Coastguard Worker
518*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFixed32 :: 1
519*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
520*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalFixed32);
521*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFixed32));
522*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed32 = 1;
523*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalFixed32);
524*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFixed32));
525*1b3f573fSAndroid Build Coastguard Worker    [msg release];
526*1b3f573fSAndroid Build Coastguard Worker  }
527*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFixed32 :: 0
528*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
529*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalFixed32);
530*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFixed32));
531*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed32 = 0;
532*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalFixed32);
533*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFixed32));
534*1b3f573fSAndroid Build Coastguard Worker    [msg release];
535*1b3f573fSAndroid Build Coastguard Worker  }
536*1b3f573fSAndroid Build Coastguard Worker
537*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFixed64 :: 1
538*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
539*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalFixed64);
540*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFixed64));
541*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed64 = 1;
542*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalFixed64);
543*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFixed64));
544*1b3f573fSAndroid Build Coastguard Worker    [msg release];
545*1b3f573fSAndroid Build Coastguard Worker  }
546*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFixed64 :: 0
547*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
548*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalFixed64);
549*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFixed64));
550*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed64 = 0;
551*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalFixed64);
552*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFixed64));
553*1b3f573fSAndroid Build Coastguard Worker    [msg release];
554*1b3f573fSAndroid Build Coastguard Worker  }
555*1b3f573fSAndroid Build Coastguard Worker
556*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSfixed32 :: 1
557*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
558*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalSfixed32);
559*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSfixed32));
560*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed32 = 1;
561*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalSfixed32);
562*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSfixed32));
563*1b3f573fSAndroid Build Coastguard Worker    [msg release];
564*1b3f573fSAndroid Build Coastguard Worker  }
565*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSfixed32 :: 0
566*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
567*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalSfixed32);
568*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSfixed32));
569*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed32 = 0;
570*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalSfixed32);
571*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSfixed32));
572*1b3f573fSAndroid Build Coastguard Worker    [msg release];
573*1b3f573fSAndroid Build Coastguard Worker  }
574*1b3f573fSAndroid Build Coastguard Worker
575*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSfixed64 :: 1
576*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
577*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalSfixed64);
578*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSfixed64));
579*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed64 = 1;
580*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalSfixed64);
581*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSfixed64));
582*1b3f573fSAndroid Build Coastguard Worker    [msg release];
583*1b3f573fSAndroid Build Coastguard Worker  }
584*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSfixed64 :: 0
585*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
586*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalSfixed64);
587*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSfixed64));
588*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed64 = 0;
589*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalSfixed64);
590*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalSfixed64));
591*1b3f573fSAndroid Build Coastguard Worker    [msg release];
592*1b3f573fSAndroid Build Coastguard Worker  }
593*1b3f573fSAndroid Build Coastguard Worker
594*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFloat :: 1.0f
595*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
596*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalFloat);
597*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFloat));
598*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFloat = 1.0f;
599*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalFloat);
600*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFloat));
601*1b3f573fSAndroid Build Coastguard Worker    [msg release];
602*1b3f573fSAndroid Build Coastguard Worker  }
603*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFloat :: 0.0f
604*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
605*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalFloat);
606*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFloat));
607*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFloat = 0.0f;
608*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalFloat);
609*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalFloat));
610*1b3f573fSAndroid Build Coastguard Worker    [msg release];
611*1b3f573fSAndroid Build Coastguard Worker  }
612*1b3f573fSAndroid Build Coastguard Worker
613*1b3f573fSAndroid Build Coastguard Worker  {  // optionalDouble :: 1.0
614*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
615*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalDouble);
616*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalDouble));
617*1b3f573fSAndroid Build Coastguard Worker    msg.optionalDouble = 1.0;
618*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalDouble);
619*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalDouble));
620*1b3f573fSAndroid Build Coastguard Worker    [msg release];
621*1b3f573fSAndroid Build Coastguard Worker  }
622*1b3f573fSAndroid Build Coastguard Worker  {  // optionalDouble :: 0.0
623*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
624*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalDouble);
625*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalDouble));
626*1b3f573fSAndroid Build Coastguard Worker    msg.optionalDouble = 0.0;
627*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalDouble);
628*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalDouble));
629*1b3f573fSAndroid Build Coastguard Worker    [msg release];
630*1b3f573fSAndroid Build Coastguard Worker  }
631*1b3f573fSAndroid Build Coastguard Worker
632*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBool :: YES
633*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
634*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalBool);
635*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBool));
636*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBool = YES;
637*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalBool);
638*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBool));
639*1b3f573fSAndroid Build Coastguard Worker    [msg release];
640*1b3f573fSAndroid Build Coastguard Worker  }
641*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBool :: NO
642*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
643*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalBool);
644*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBool));
645*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBool = NO;
646*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalBool);
647*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBool));
648*1b3f573fSAndroid Build Coastguard Worker    [msg release];
649*1b3f573fSAndroid Build Coastguard Worker  }
650*1b3f573fSAndroid Build Coastguard Worker
651*1b3f573fSAndroid Build Coastguard Worker  {  // optionalString :: @"foo"
652*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
653*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalString);
654*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalString));
655*1b3f573fSAndroid Build Coastguard Worker    msg.optionalString = @"foo";
656*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalString);
657*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalString));
658*1b3f573fSAndroid Build Coastguard Worker    [msg release];
659*1b3f573fSAndroid Build Coastguard Worker  }
660*1b3f573fSAndroid Build Coastguard Worker  {  // optionalString :: @""
661*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
662*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalString);
663*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalString));
664*1b3f573fSAndroid Build Coastguard Worker    msg.optionalString = @"";
665*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalString);
666*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalString));
667*1b3f573fSAndroid Build Coastguard Worker    [msg release];
668*1b3f573fSAndroid Build Coastguard Worker  }
669*1b3f573fSAndroid Build Coastguard Worker
670*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBytes :: [@"foo" dataUsingEncoding:NSUTF8StringEncoding]
671*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
672*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalBytes);
673*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBytes));
674*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
675*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalBytes);
676*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBytes));
677*1b3f573fSAndroid Build Coastguard Worker    [msg release];
678*1b3f573fSAndroid Build Coastguard Worker  }
679*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBytes :: [NSData data]
680*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
681*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalBytes);
682*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBytes));
683*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBytes = [NSData data];
684*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalBytes);
685*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBytes));
686*1b3f573fSAndroid Build Coastguard Worker    [msg release];
687*1b3f573fSAndroid Build Coastguard Worker  }
688*1b3f573fSAndroid Build Coastguard Worker
689*1b3f573fSAndroid Build Coastguard Worker  //
690*1b3f573fSAndroid Build Coastguard Worker  // Test doesn't apply to optionalGroup/optionalMessage.
691*1b3f573fSAndroid Build Coastguard Worker  //
692*1b3f573fSAndroid Build Coastguard Worker
693*1b3f573fSAndroid Build Coastguard Worker  {  // optionalEnum :: Message2_Enum_Bar
694*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
695*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalEnum);
696*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalEnum));
697*1b3f573fSAndroid Build Coastguard Worker    msg.optionalEnum = Message2_Enum_Bar;
698*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalEnum);
699*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalEnum));
700*1b3f573fSAndroid Build Coastguard Worker    [msg release];
701*1b3f573fSAndroid Build Coastguard Worker  }
702*1b3f573fSAndroid Build Coastguard Worker  {  // optionalEnum :: Message2_Enum_Foo
703*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
704*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(msg.hasOptionalEnum);
705*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalEnum));
706*1b3f573fSAndroid Build Coastguard Worker    msg.optionalEnum = Message2_Enum_Foo;
707*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(msg.hasOptionalEnum);
708*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalEnum));
709*1b3f573fSAndroid Build Coastguard Worker    [msg release];
710*1b3f573fSAndroid Build Coastguard Worker  }
711*1b3f573fSAndroid Build Coastguard Worker
712*1b3f573fSAndroid Build Coastguard Worker  //
713*1b3f573fSAndroid Build Coastguard Worker  // Nil can also be used to clear strings, bytes, groups, and messages.
714*1b3f573fSAndroid Build Coastguard Worker  //
715*1b3f573fSAndroid Build Coastguard Worker
716*1b3f573fSAndroid Build Coastguard Worker  {  // optionalString
717*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
718*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalString));
719*1b3f573fSAndroid Build Coastguard Worker    msg.optionalString = @"foo";
720*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalString));
721*1b3f573fSAndroid Build Coastguard Worker    msg.optionalString = nil;
722*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalString));
723*1b3f573fSAndroid Build Coastguard Worker    [msg release];
724*1b3f573fSAndroid Build Coastguard Worker  }
725*1b3f573fSAndroid Build Coastguard Worker
726*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBytes
727*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
728*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBytes));
729*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
730*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBytes));
731*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBytes = nil;
732*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBytes));
733*1b3f573fSAndroid Build Coastguard Worker    [msg release];
734*1b3f573fSAndroid Build Coastguard Worker  }
735*1b3f573fSAndroid Build Coastguard Worker
736*1b3f573fSAndroid Build Coastguard Worker  {  // optionalGroup
737*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
738*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalGroup));
739*1b3f573fSAndroid Build Coastguard Worker    msg.optionalGroup = [Message2_OptionalGroup message];
740*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalGroup));
741*1b3f573fSAndroid Build Coastguard Worker    msg.optionalGroup = nil;
742*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalGroup));
743*1b3f573fSAndroid Build Coastguard Worker    [msg release];
744*1b3f573fSAndroid Build Coastguard Worker  }
745*1b3f573fSAndroid Build Coastguard Worker
746*1b3f573fSAndroid Build Coastguard Worker  {  // optionalMessage
747*1b3f573fSAndroid Build Coastguard Worker    Message2 *msg = [[Message2 alloc] init];
748*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalMessage));
749*1b3f573fSAndroid Build Coastguard Worker    msg.optionalMessage = [Message2 message];
750*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalMessage));
751*1b3f573fSAndroid Build Coastguard Worker    msg.optionalMessage = nil;
752*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalMessage));
753*1b3f573fSAndroid Build Coastguard Worker    [msg release];
754*1b3f573fSAndroid Build Coastguard Worker  }
755*1b3f573fSAndroid Build Coastguard Worker
756*1b3f573fSAndroid Build Coastguard Worker// clang-format on
757*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END PROTO2_TEST_HAS_FIELDS()
758*1b3f573fSAndroid Build Coastguard Worker}
759*1b3f573fSAndroid Build Coastguard Worker
760*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3SingleFieldHasBehavior {
761*1b3f573fSAndroid Build Coastguard Worker  //
762*1b3f573fSAndroid Build Coastguard Worker  // Setting to any value but the default value (0) should result has*
763*1b3f573fSAndroid Build Coastguard Worker  // being true.  When set to the default, shouldn't be true.
764*1b3f573fSAndroid Build Coastguard Worker  //
765*1b3f573fSAndroid Build Coastguard Worker
766*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE PROTO3_TEST_HAS_FIELD(FIELD, NON_ZERO_VALUE, ZERO_VALUE)
767*1b3f573fSAndroid Build Coastguard Worker//%  {  // optional##FIELD
768*1b3f573fSAndroid Build Coastguard Worker//%    Message3 *msg = [[Message3 alloc] init];
769*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional##FIELD));
770*1b3f573fSAndroid Build Coastguard Worker//%    msg.optional##FIELD = NON_ZERO_VALUE;
771*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional##FIELD));
772*1b3f573fSAndroid Build Coastguard Worker//%    msg.optional##FIELD = ZERO_VALUE;
773*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional##FIELD));
774*1b3f573fSAndroid Build Coastguard Worker//%    [msg release];
775*1b3f573fSAndroid Build Coastguard Worker//%  }
776*1b3f573fSAndroid Build Coastguard Worker//%
777*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE PROTO3_TEST_CLEAR_FIELD_WITH_NIL(FIELD, VALUE)
778*1b3f573fSAndroid Build Coastguard Worker//%  {  // optional##FIELD
779*1b3f573fSAndroid Build Coastguard Worker//%    Message3 *msg = [[Message3 alloc] init];
780*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional##FIELD));
781*1b3f573fSAndroid Build Coastguard Worker//%    msg.optional##FIELD = VALUE;
782*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional##FIELD));
783*1b3f573fSAndroid Build Coastguard Worker//%    msg.optional##FIELD = nil;
784*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional##FIELD));
785*1b3f573fSAndroid Build Coastguard Worker//%    [msg release];
786*1b3f573fSAndroid Build Coastguard Worker//%  }
787*1b3f573fSAndroid Build Coastguard Worker//%
788*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE PROTO3_TEST_HAS_FIELDS()
789*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Int32, 1, 0)
790*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Int64, 1, 0)
791*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Uint32, 1, 0)
792*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Uint64, 1, 0)
793*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Sint32, 1, 0)
794*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Sint64, 1, 0)
795*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Fixed32, 1, 0)
796*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Fixed64, 1, 0)
797*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Sfixed32, 1, 0)
798*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Sfixed64, 1, 0)
799*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Float, 1.0f, 0.0f)
800*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Double, 1.0, 0.0)
801*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Bool, YES, NO)
802*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(String, @"foo", @"")
803*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding], [NSData data])
804*1b3f573fSAndroid Build Coastguard Worker//%  //
805*1b3f573fSAndroid Build Coastguard Worker//%  // Test doesn't apply to optionalMessage (no groups in proto3).
806*1b3f573fSAndroid Build Coastguard Worker//%  //
807*1b3f573fSAndroid Build Coastguard Worker//%
808*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_HAS_FIELD(Enum, Message3_Enum_Bar, Message3_Enum_Foo)
809*1b3f573fSAndroid Build Coastguard Worker//%  //
810*1b3f573fSAndroid Build Coastguard Worker//%  // Nil can also be used to clear strings, bytes, and messages (no groups in proto3).
811*1b3f573fSAndroid Build Coastguard Worker//%  //
812*1b3f573fSAndroid Build Coastguard Worker//%
813*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_CLEAR_FIELD_WITH_NIL(String, @"foo")
814*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_CLEAR_FIELD_WITH_NIL(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding])
815*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_CLEAR_FIELD_WITH_NIL(Message, [Message3 message])
816*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND PROTO3_TEST_HAS_FIELDS()
817*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
818*1b3f573fSAndroid Build Coastguard Worker// clang-format off
819*1b3f573fSAndroid Build Coastguard Worker
820*1b3f573fSAndroid Build Coastguard Worker  {  // optionalInt32
821*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
822*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalInt32));
823*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt32 = 1;
824*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalInt32));
825*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt32 = 0;
826*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalInt32));
827*1b3f573fSAndroid Build Coastguard Worker    [msg release];
828*1b3f573fSAndroid Build Coastguard Worker  }
829*1b3f573fSAndroid Build Coastguard Worker
830*1b3f573fSAndroid Build Coastguard Worker  {  // optionalInt64
831*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
832*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalInt64));
833*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt64 = 1;
834*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalInt64));
835*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt64 = 0;
836*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalInt64));
837*1b3f573fSAndroid Build Coastguard Worker    [msg release];
838*1b3f573fSAndroid Build Coastguard Worker  }
839*1b3f573fSAndroid Build Coastguard Worker
840*1b3f573fSAndroid Build Coastguard Worker  {  // optionalUint32
841*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
842*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalUint32));
843*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint32 = 1;
844*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalUint32));
845*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint32 = 0;
846*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalUint32));
847*1b3f573fSAndroid Build Coastguard Worker    [msg release];
848*1b3f573fSAndroid Build Coastguard Worker  }
849*1b3f573fSAndroid Build Coastguard Worker
850*1b3f573fSAndroid Build Coastguard Worker  {  // optionalUint64
851*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
852*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalUint64));
853*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint64 = 1;
854*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalUint64));
855*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint64 = 0;
856*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalUint64));
857*1b3f573fSAndroid Build Coastguard Worker    [msg release];
858*1b3f573fSAndroid Build Coastguard Worker  }
859*1b3f573fSAndroid Build Coastguard Worker
860*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSint32
861*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
862*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSint32));
863*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint32 = 1;
864*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSint32));
865*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint32 = 0;
866*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSint32));
867*1b3f573fSAndroid Build Coastguard Worker    [msg release];
868*1b3f573fSAndroid Build Coastguard Worker  }
869*1b3f573fSAndroid Build Coastguard Worker
870*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSint64
871*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
872*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSint64));
873*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint64 = 1;
874*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSint64));
875*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint64 = 0;
876*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSint64));
877*1b3f573fSAndroid Build Coastguard Worker    [msg release];
878*1b3f573fSAndroid Build Coastguard Worker  }
879*1b3f573fSAndroid Build Coastguard Worker
880*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFixed32
881*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
882*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalFixed32));
883*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed32 = 1;
884*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalFixed32));
885*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed32 = 0;
886*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalFixed32));
887*1b3f573fSAndroid Build Coastguard Worker    [msg release];
888*1b3f573fSAndroid Build Coastguard Worker  }
889*1b3f573fSAndroid Build Coastguard Worker
890*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFixed64
891*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
892*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalFixed64));
893*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed64 = 1;
894*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalFixed64));
895*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed64 = 0;
896*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalFixed64));
897*1b3f573fSAndroid Build Coastguard Worker    [msg release];
898*1b3f573fSAndroid Build Coastguard Worker  }
899*1b3f573fSAndroid Build Coastguard Worker
900*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSfixed32
901*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
902*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSfixed32));
903*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed32 = 1;
904*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSfixed32));
905*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed32 = 0;
906*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSfixed32));
907*1b3f573fSAndroid Build Coastguard Worker    [msg release];
908*1b3f573fSAndroid Build Coastguard Worker  }
909*1b3f573fSAndroid Build Coastguard Worker
910*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSfixed64
911*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
912*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSfixed64));
913*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed64 = 1;
914*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSfixed64));
915*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed64 = 0;
916*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalSfixed64));
917*1b3f573fSAndroid Build Coastguard Worker    [msg release];
918*1b3f573fSAndroid Build Coastguard Worker  }
919*1b3f573fSAndroid Build Coastguard Worker
920*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFloat
921*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
922*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalFloat));
923*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFloat = 1.0f;
924*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalFloat));
925*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFloat = 0.0f;
926*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalFloat));
927*1b3f573fSAndroid Build Coastguard Worker    [msg release];
928*1b3f573fSAndroid Build Coastguard Worker  }
929*1b3f573fSAndroid Build Coastguard Worker
930*1b3f573fSAndroid Build Coastguard Worker  {  // optionalDouble
931*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
932*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalDouble));
933*1b3f573fSAndroid Build Coastguard Worker    msg.optionalDouble = 1.0;
934*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalDouble));
935*1b3f573fSAndroid Build Coastguard Worker    msg.optionalDouble = 0.0;
936*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalDouble));
937*1b3f573fSAndroid Build Coastguard Worker    [msg release];
938*1b3f573fSAndroid Build Coastguard Worker  }
939*1b3f573fSAndroid Build Coastguard Worker
940*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBool
941*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
942*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBool));
943*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBool = YES;
944*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBool));
945*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBool = NO;
946*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBool));
947*1b3f573fSAndroid Build Coastguard Worker    [msg release];
948*1b3f573fSAndroid Build Coastguard Worker  }
949*1b3f573fSAndroid Build Coastguard Worker
950*1b3f573fSAndroid Build Coastguard Worker  {  // optionalString
951*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
952*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalString));
953*1b3f573fSAndroid Build Coastguard Worker    msg.optionalString = @"foo";
954*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalString));
955*1b3f573fSAndroid Build Coastguard Worker    msg.optionalString = @"";
956*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalString));
957*1b3f573fSAndroid Build Coastguard Worker    [msg release];
958*1b3f573fSAndroid Build Coastguard Worker  }
959*1b3f573fSAndroid Build Coastguard Worker
960*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBytes
961*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
962*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBytes));
963*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
964*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBytes));
965*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBytes = [NSData data];
966*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBytes));
967*1b3f573fSAndroid Build Coastguard Worker    [msg release];
968*1b3f573fSAndroid Build Coastguard Worker  }
969*1b3f573fSAndroid Build Coastguard Worker
970*1b3f573fSAndroid Build Coastguard Worker  //
971*1b3f573fSAndroid Build Coastguard Worker  // Test doesn't apply to optionalMessage (no groups in proto3).
972*1b3f573fSAndroid Build Coastguard Worker  //
973*1b3f573fSAndroid Build Coastguard Worker
974*1b3f573fSAndroid Build Coastguard Worker  {  // optionalEnum
975*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
976*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalEnum));
977*1b3f573fSAndroid Build Coastguard Worker    msg.optionalEnum = Message3_Enum_Bar;
978*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalEnum));
979*1b3f573fSAndroid Build Coastguard Worker    msg.optionalEnum = Message3_Enum_Foo;
980*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalEnum));
981*1b3f573fSAndroid Build Coastguard Worker    [msg release];
982*1b3f573fSAndroid Build Coastguard Worker  }
983*1b3f573fSAndroid Build Coastguard Worker
984*1b3f573fSAndroid Build Coastguard Worker  //
985*1b3f573fSAndroid Build Coastguard Worker  // Nil can also be used to clear strings, bytes, and messages (no groups in proto3).
986*1b3f573fSAndroid Build Coastguard Worker  //
987*1b3f573fSAndroid Build Coastguard Worker
988*1b3f573fSAndroid Build Coastguard Worker  {  // optionalString
989*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
990*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalString));
991*1b3f573fSAndroid Build Coastguard Worker    msg.optionalString = @"foo";
992*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalString));
993*1b3f573fSAndroid Build Coastguard Worker    msg.optionalString = nil;
994*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalString));
995*1b3f573fSAndroid Build Coastguard Worker    [msg release];
996*1b3f573fSAndroid Build Coastguard Worker  }
997*1b3f573fSAndroid Build Coastguard Worker
998*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBytes
999*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
1000*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBytes));
1001*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
1002*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBytes));
1003*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBytes = nil;
1004*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBytes));
1005*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1006*1b3f573fSAndroid Build Coastguard Worker  }
1007*1b3f573fSAndroid Build Coastguard Worker
1008*1b3f573fSAndroid Build Coastguard Worker  {  // optionalMessage
1009*1b3f573fSAndroid Build Coastguard Worker    Message3 *msg = [[Message3 alloc] init];
1010*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalMessage));
1011*1b3f573fSAndroid Build Coastguard Worker    msg.optionalMessage = [Message3 message];
1012*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalMessage));
1013*1b3f573fSAndroid Build Coastguard Worker    msg.optionalMessage = nil;
1014*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalMessage));
1015*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1016*1b3f573fSAndroid Build Coastguard Worker  }
1017*1b3f573fSAndroid Build Coastguard Worker
1018*1b3f573fSAndroid Build Coastguard Worker// clang-format on
1019*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END PROTO3_TEST_HAS_FIELDS()
1020*1b3f573fSAndroid Build Coastguard Worker}
1021*1b3f573fSAndroid Build Coastguard Worker
1022*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3SingleOptionalFieldHasBehavior {
1023*1b3f573fSAndroid Build Coastguard Worker  //
1024*1b3f573fSAndroid Build Coastguard Worker  // Setting to any value including the default (0) should result in true.
1025*1b3f573fSAndroid Build Coastguard Worker  //
1026*1b3f573fSAndroid Build Coastguard Worker
1027*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE PROTO3_TEST_OPTIONAL_HAS_FIELD(FIELD, NON_ZERO_VALUE, ZERO_VALUE)
1028*1b3f573fSAndroid Build Coastguard Worker//%  {  // optional##FIELD
1029*1b3f573fSAndroid Build Coastguard Worker//%    Message3Optional *msg = [[Message3Optional alloc] init];
1030*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_Optional##FIELD));
1031*1b3f573fSAndroid Build Coastguard Worker//%    msg.optional##FIELD = NON_ZERO_VALUE;
1032*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_Optional##FIELD));
1033*1b3f573fSAndroid Build Coastguard Worker//%    msg.hasOptional##FIELD = NO;
1034*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_Optional##FIELD));
1035*1b3f573fSAndroid Build Coastguard Worker//%    msg.optional##FIELD = ZERO_VALUE;
1036*1b3f573fSAndroid Build Coastguard Worker//%    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_Optional##FIELD));
1037*1b3f573fSAndroid Build Coastguard Worker//%    [msg release];
1038*1b3f573fSAndroid Build Coastguard Worker//%  }
1039*1b3f573fSAndroid Build Coastguard Worker//%
1040*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE PROTO3_TEST_OPTIONAL_HAS_FIELDS()
1041*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Int32, 1, 0)
1042*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Int64, 1, 0)
1043*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Uint32, 1, 0)
1044*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Uint64, 1, 0)
1045*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Sint32, 1, 0)
1046*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Sint64, 1, 0)
1047*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Fixed32, 1, 0)
1048*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Fixed64, 1, 0)
1049*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Sfixed32, 1, 0)
1050*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Sfixed64, 1, 0)
1051*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Float, 1.0f, 0.0f)
1052*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Double, 1.0, 0.0)
1053*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Bool, YES, NO)
1054*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(String, @"foo", @"")
1055*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding], [NSData data])
1056*1b3f573fSAndroid Build Coastguard Worker//%  //
1057*1b3f573fSAndroid Build Coastguard Worker//%  // Test doesn't apply to optionalMessage (no groups in proto3).
1058*1b3f573fSAndroid Build Coastguard Worker//%  //
1059*1b3f573fSAndroid Build Coastguard Worker//%
1060*1b3f573fSAndroid Build Coastguard Worker//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Enum, Message3Optional_Enum_Bar, Message3Optional_Enum_Foo)
1061*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND PROTO3_TEST_OPTIONAL_HAS_FIELDS()
1062*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
1063*1b3f573fSAndroid Build Coastguard Worker// clang-format off
1064*1b3f573fSAndroid Build Coastguard Worker
1065*1b3f573fSAndroid Build Coastguard Worker  {  // optionalInt32
1066*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1067*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalInt32));
1068*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt32 = 1;
1069*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalInt32));
1070*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalInt32 = NO;
1071*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalInt32));
1072*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt32 = 0;
1073*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalInt32));
1074*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1075*1b3f573fSAndroid Build Coastguard Worker  }
1076*1b3f573fSAndroid Build Coastguard Worker
1077*1b3f573fSAndroid Build Coastguard Worker  {  // optionalInt64
1078*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1079*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalInt64));
1080*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt64 = 1;
1081*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalInt64));
1082*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalInt64 = NO;
1083*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalInt64));
1084*1b3f573fSAndroid Build Coastguard Worker    msg.optionalInt64 = 0;
1085*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalInt64));
1086*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1087*1b3f573fSAndroid Build Coastguard Worker  }
1088*1b3f573fSAndroid Build Coastguard Worker
1089*1b3f573fSAndroid Build Coastguard Worker  {  // optionalUint32
1090*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1091*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalUint32));
1092*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint32 = 1;
1093*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalUint32));
1094*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalUint32 = NO;
1095*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalUint32));
1096*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint32 = 0;
1097*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalUint32));
1098*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1099*1b3f573fSAndroid Build Coastguard Worker  }
1100*1b3f573fSAndroid Build Coastguard Worker
1101*1b3f573fSAndroid Build Coastguard Worker  {  // optionalUint64
1102*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1103*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalUint64));
1104*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint64 = 1;
1105*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalUint64));
1106*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalUint64 = NO;
1107*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalUint64));
1108*1b3f573fSAndroid Build Coastguard Worker    msg.optionalUint64 = 0;
1109*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalUint64));
1110*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1111*1b3f573fSAndroid Build Coastguard Worker  }
1112*1b3f573fSAndroid Build Coastguard Worker
1113*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSint32
1114*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1115*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSint32));
1116*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint32 = 1;
1117*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSint32));
1118*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalSint32 = NO;
1119*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSint32));
1120*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint32 = 0;
1121*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSint32));
1122*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1123*1b3f573fSAndroid Build Coastguard Worker  }
1124*1b3f573fSAndroid Build Coastguard Worker
1125*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSint64
1126*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1127*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSint64));
1128*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint64 = 1;
1129*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSint64));
1130*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalSint64 = NO;
1131*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSint64));
1132*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSint64 = 0;
1133*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSint64));
1134*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1135*1b3f573fSAndroid Build Coastguard Worker  }
1136*1b3f573fSAndroid Build Coastguard Worker
1137*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFixed32
1138*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1139*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFixed32));
1140*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed32 = 1;
1141*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFixed32));
1142*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalFixed32 = NO;
1143*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFixed32));
1144*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed32 = 0;
1145*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFixed32));
1146*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1147*1b3f573fSAndroid Build Coastguard Worker  }
1148*1b3f573fSAndroid Build Coastguard Worker
1149*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFixed64
1150*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1151*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFixed64));
1152*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed64 = 1;
1153*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFixed64));
1154*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalFixed64 = NO;
1155*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFixed64));
1156*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFixed64 = 0;
1157*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFixed64));
1158*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1159*1b3f573fSAndroid Build Coastguard Worker  }
1160*1b3f573fSAndroid Build Coastguard Worker
1161*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSfixed32
1162*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1163*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSfixed32));
1164*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed32 = 1;
1165*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSfixed32));
1166*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalSfixed32 = NO;
1167*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSfixed32));
1168*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed32 = 0;
1169*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSfixed32));
1170*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1171*1b3f573fSAndroid Build Coastguard Worker  }
1172*1b3f573fSAndroid Build Coastguard Worker
1173*1b3f573fSAndroid Build Coastguard Worker  {  // optionalSfixed64
1174*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1175*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSfixed64));
1176*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed64 = 1;
1177*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSfixed64));
1178*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalSfixed64 = NO;
1179*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSfixed64));
1180*1b3f573fSAndroid Build Coastguard Worker    msg.optionalSfixed64 = 0;
1181*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalSfixed64));
1182*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1183*1b3f573fSAndroid Build Coastguard Worker  }
1184*1b3f573fSAndroid Build Coastguard Worker
1185*1b3f573fSAndroid Build Coastguard Worker  {  // optionalFloat
1186*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1187*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFloat));
1188*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFloat = 1.0f;
1189*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFloat));
1190*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalFloat = NO;
1191*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFloat));
1192*1b3f573fSAndroid Build Coastguard Worker    msg.optionalFloat = 0.0f;
1193*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalFloat));
1194*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1195*1b3f573fSAndroid Build Coastguard Worker  }
1196*1b3f573fSAndroid Build Coastguard Worker
1197*1b3f573fSAndroid Build Coastguard Worker  {  // optionalDouble
1198*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1199*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalDouble));
1200*1b3f573fSAndroid Build Coastguard Worker    msg.optionalDouble = 1.0;
1201*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalDouble));
1202*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalDouble = NO;
1203*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalDouble));
1204*1b3f573fSAndroid Build Coastguard Worker    msg.optionalDouble = 0.0;
1205*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalDouble));
1206*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1207*1b3f573fSAndroid Build Coastguard Worker  }
1208*1b3f573fSAndroid Build Coastguard Worker
1209*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBool
1210*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1211*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalBool));
1212*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBool = YES;
1213*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalBool));
1214*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalBool = NO;
1215*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalBool));
1216*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBool = NO;
1217*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalBool));
1218*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1219*1b3f573fSAndroid Build Coastguard Worker  }
1220*1b3f573fSAndroid Build Coastguard Worker
1221*1b3f573fSAndroid Build Coastguard Worker  {  // optionalString
1222*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1223*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalString));
1224*1b3f573fSAndroid Build Coastguard Worker    msg.optionalString = @"foo";
1225*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalString));
1226*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalString = NO;
1227*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalString));
1228*1b3f573fSAndroid Build Coastguard Worker    msg.optionalString = @"";
1229*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalString));
1230*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1231*1b3f573fSAndroid Build Coastguard Worker  }
1232*1b3f573fSAndroid Build Coastguard Worker
1233*1b3f573fSAndroid Build Coastguard Worker  {  // optionalBytes
1234*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1235*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalBytes));
1236*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
1237*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalBytes));
1238*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalBytes = NO;
1239*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalBytes));
1240*1b3f573fSAndroid Build Coastguard Worker    msg.optionalBytes = [NSData data];
1241*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalBytes));
1242*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1243*1b3f573fSAndroid Build Coastguard Worker  }
1244*1b3f573fSAndroid Build Coastguard Worker
1245*1b3f573fSAndroid Build Coastguard Worker  //
1246*1b3f573fSAndroid Build Coastguard Worker  // Test doesn't apply to optionalMessage (no groups in proto3).
1247*1b3f573fSAndroid Build Coastguard Worker  //
1248*1b3f573fSAndroid Build Coastguard Worker
1249*1b3f573fSAndroid Build Coastguard Worker  {  // optionalEnum
1250*1b3f573fSAndroid Build Coastguard Worker    Message3Optional *msg = [[Message3Optional alloc] init];
1251*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalEnum));
1252*1b3f573fSAndroid Build Coastguard Worker    msg.optionalEnum = Message3Optional_Enum_Bar;
1253*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalEnum));
1254*1b3f573fSAndroid Build Coastguard Worker    msg.hasOptionalEnum = NO;
1255*1b3f573fSAndroid Build Coastguard Worker    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalEnum));
1256*1b3f573fSAndroid Build Coastguard Worker    msg.optionalEnum = Message3Optional_Enum_Foo;
1257*1b3f573fSAndroid Build Coastguard Worker    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3Optional_FieldNumber_OptionalEnum));
1258*1b3f573fSAndroid Build Coastguard Worker    [msg release];
1259*1b3f573fSAndroid Build Coastguard Worker  }
1260*1b3f573fSAndroid Build Coastguard Worker
1261*1b3f573fSAndroid Build Coastguard Worker// clang-format on
1262*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END PROTO3_TEST_OPTIONAL_HAS_FIELDS()
1263*1b3f573fSAndroid Build Coastguard Worker}
1264*1b3f573fSAndroid Build Coastguard Worker
1265*1b3f573fSAndroid Build Coastguard Worker- (void)testAccessingProto2UnknownEnumValues {
1266*1b3f573fSAndroid Build Coastguard Worker  Message2 *msg = [[Message2 alloc] init];
1267*1b3f573fSAndroid Build Coastguard Worker
1268*1b3f573fSAndroid Build Coastguard Worker  // Set it to something non zero, try and confirm it doesn't change.
1269*1b3f573fSAndroid Build Coastguard Worker
1270*1b3f573fSAndroid Build Coastguard Worker  msg.optionalEnum = Message2_Enum_Bar;
1271*1b3f573fSAndroid Build Coastguard Worker  XCTAssertThrowsSpecificNamed(msg.optionalEnum = 666, NSException,
1272*1b3f573fSAndroid Build Coastguard Worker                               NSInvalidArgumentException);
1273*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.optionalEnum, Message2_Enum_Bar);
1274*1b3f573fSAndroid Build Coastguard Worker
1275*1b3f573fSAndroid Build Coastguard Worker  msg.oneofEnum = Message2_Enum_Bar;
1276*1b3f573fSAndroid Build Coastguard Worker  XCTAssertThrowsSpecificNamed(msg.oneofEnum = 666, NSException,
1277*1b3f573fSAndroid Build Coastguard Worker                               NSInvalidArgumentException);
1278*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar);
1279*1b3f573fSAndroid Build Coastguard Worker
1280*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1281*1b3f573fSAndroid Build Coastguard Worker}
1282*1b3f573fSAndroid Build Coastguard Worker
1283*1b3f573fSAndroid Build Coastguard Worker- (void)testAccessingProto3UnknownEnumValues {
1284*1b3f573fSAndroid Build Coastguard Worker  Message3 *msg = [[Message3 alloc] init];
1285*1b3f573fSAndroid Build Coastguard Worker
1286*1b3f573fSAndroid Build Coastguard Worker  // Set it to something non zero, try and confirm it doesn't change.
1287*1b3f573fSAndroid Build Coastguard Worker
1288*1b3f573fSAndroid Build Coastguard Worker  msg.optionalEnum = Message3_Enum_Bar;
1289*1b3f573fSAndroid Build Coastguard Worker  XCTAssertThrowsSpecificNamed(msg.optionalEnum = 666, NSException,
1290*1b3f573fSAndroid Build Coastguard Worker                               NSInvalidArgumentException);
1291*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.optionalEnum, Message3_Enum_Bar);
1292*1b3f573fSAndroid Build Coastguard Worker
1293*1b3f573fSAndroid Build Coastguard Worker  msg.oneofEnum = Message3_Enum_Bar;
1294*1b3f573fSAndroid Build Coastguard Worker  XCTAssertThrowsSpecificNamed(msg.oneofEnum = 666, NSException,
1295*1b3f573fSAndroid Build Coastguard Worker                               NSInvalidArgumentException);
1296*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Bar);
1297*1b3f573fSAndroid Build Coastguard Worker
1298*1b3f573fSAndroid Build Coastguard Worker  // Set via raw api to confirm it works.
1299*1b3f573fSAndroid Build Coastguard Worker
1300*1b3f573fSAndroid Build Coastguard Worker  SetMessage3_OptionalEnum_RawValue(msg, 666);
1301*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.optionalEnum,
1302*1b3f573fSAndroid Build Coastguard Worker                 Message3_Enum_GPBUnrecognizedEnumeratorValue);
1303*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(Message3_OptionalEnum_RawValue(msg), 666);
1304*1b3f573fSAndroid Build Coastguard Worker
1305*1b3f573fSAndroid Build Coastguard Worker  SetMessage3_OneofEnum_RawValue(msg, 666);
1306*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_GPBUnrecognizedEnumeratorValue);
1307*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(Message3_OneofEnum_RawValue(msg), 666);
1308*1b3f573fSAndroid Build Coastguard Worker
1309*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1310*1b3f573fSAndroid Build Coastguard Worker}
1311*1b3f573fSAndroid Build Coastguard Worker
1312*1b3f573fSAndroid Build Coastguard Worker- (void)testProto2OneofBasicBehaviors {
1313*1b3f573fSAndroid Build Coastguard Worker  Message2 *msg = [[Message2 alloc] init];
1314*1b3f573fSAndroid Build Coastguard Worker
1315*1b3f573fSAndroid Build Coastguard Worker  NSString *oneofStringDefault = @"string";
1316*1b3f573fSAndroid Build Coastguard Worker  NSData *oneofBytesDefault = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
1317*1b3f573fSAndroid Build Coastguard Worker
1318*1b3f573fSAndroid Build Coastguard Worker  // Nothing set.
1319*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
1320*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1321*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1322*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1323*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1324*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1325*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1326*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1327*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1328*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1329*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1330*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1331*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1332*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1333*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1334*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1335*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1336*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1337*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1338*1b3f573fSAndroid Build Coastguard Worker
1339*1b3f573fSAndroid Build Coastguard Worker  // Set, check the case, check everyone has default but the one, confirm case
1340*1b3f573fSAndroid Build Coastguard Worker  // didn't change.
1341*1b3f573fSAndroid Build Coastguard Worker
1342*1b3f573fSAndroid Build Coastguard Worker  msg.oneofInt32 = 1;
1343*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
1344*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 1);
1345*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1346*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1347*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1348*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1349*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1350*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1351*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1352*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1353*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1354*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1355*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1356*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1357*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1358*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1359*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1360*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1361*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1362*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
1363*1b3f573fSAndroid Build Coastguard Worker
1364*1b3f573fSAndroid Build Coastguard Worker  msg.oneofInt64 = 2;
1365*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
1366*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1367*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 2);
1368*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1369*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1370*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1371*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1372*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1373*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1374*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1375*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1376*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1377*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1378*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1379*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1380*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1381*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1382*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1383*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1384*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
1385*1b3f573fSAndroid Build Coastguard Worker
1386*1b3f573fSAndroid Build Coastguard Worker  msg.oneofUint32 = 3;
1387*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
1388*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1389*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1390*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 3U);
1391*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1392*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1393*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1394*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1395*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1396*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1397*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1398*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1399*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1400*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1401*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1402*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1403*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1404*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1405*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1406*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
1407*1b3f573fSAndroid Build Coastguard Worker
1408*1b3f573fSAndroid Build Coastguard Worker  msg.oneofUint64 = 4;
1409*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
1410*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1411*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1412*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1413*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 4U);
1414*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1415*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1416*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1417*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1418*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1419*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1420*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1421*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1422*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1423*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1424*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1425*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1426*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1427*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1428*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
1429*1b3f573fSAndroid Build Coastguard Worker
1430*1b3f573fSAndroid Build Coastguard Worker  msg.oneofSint32 = 5;
1431*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
1432*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1433*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1434*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1435*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1436*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 5);
1437*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1438*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1439*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1440*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1441*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1442*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1443*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1444*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1445*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1446*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1447*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1448*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1449*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1450*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
1451*1b3f573fSAndroid Build Coastguard Worker
1452*1b3f573fSAndroid Build Coastguard Worker  msg.oneofSint64 = 6;
1453*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
1454*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1455*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1456*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1457*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1458*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1459*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 6);
1460*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1461*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1462*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1463*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1464*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1465*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1466*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1467*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1468*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1469*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1470*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1471*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1472*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
1473*1b3f573fSAndroid Build Coastguard Worker
1474*1b3f573fSAndroid Build Coastguard Worker  msg.oneofFixed32 = 7;
1475*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
1476*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1477*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1478*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1479*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1480*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1481*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1482*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 7U);
1483*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1484*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1485*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1486*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1487*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1488*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1489*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1490*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1491*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1492*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1493*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1494*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
1495*1b3f573fSAndroid Build Coastguard Worker
1496*1b3f573fSAndroid Build Coastguard Worker  msg.oneofFixed64 = 8;
1497*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
1498*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1499*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1500*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1501*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1502*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1503*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1504*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1505*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 8U);
1506*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1507*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1508*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1509*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1510*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1511*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1512*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1513*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1514*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1515*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1516*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
1517*1b3f573fSAndroid Build Coastguard Worker
1518*1b3f573fSAndroid Build Coastguard Worker  msg.oneofSfixed32 = 9;
1519*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
1520*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1521*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1522*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1523*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1524*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1525*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1526*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1527*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1528*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 9);
1529*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1530*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1531*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1532*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1533*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1534*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1535*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1536*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1537*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1538*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
1539*1b3f573fSAndroid Build Coastguard Worker
1540*1b3f573fSAndroid Build Coastguard Worker  msg.oneofSfixed64 = 10;
1541*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
1542*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1543*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1544*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1545*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1546*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1547*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1548*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1549*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1550*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1551*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 10);
1552*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1553*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1554*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1555*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1556*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1557*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1558*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1559*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1560*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
1561*1b3f573fSAndroid Build Coastguard Worker
1562*1b3f573fSAndroid Build Coastguard Worker  msg.oneofFloat = 11.0f;
1563*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
1564*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1565*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1566*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1567*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1568*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1569*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1570*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1571*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1572*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1573*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1574*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 11.0f);
1575*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1576*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1577*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1578*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1579*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1580*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1581*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1582*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
1583*1b3f573fSAndroid Build Coastguard Worker
1584*1b3f573fSAndroid Build Coastguard Worker  msg.oneofDouble = 12.0;
1585*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
1586*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1587*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1588*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1589*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1590*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1591*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1592*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1593*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1594*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1595*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1596*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1597*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 12.0);
1598*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1599*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1600*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1601*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1602*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1603*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1604*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
1605*1b3f573fSAndroid Build Coastguard Worker
1606*1b3f573fSAndroid Build Coastguard Worker  msg.oneofBool = NO;
1607*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBool);
1608*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1609*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1610*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1611*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1612*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1613*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1614*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1615*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1616*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1617*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1618*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1619*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1620*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
1621*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1622*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1623*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1624*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1625*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1626*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBool);
1627*1b3f573fSAndroid Build Coastguard Worker
1628*1b3f573fSAndroid Build Coastguard Worker  msg.oneofString = @"foo";
1629*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofString);
1630*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1631*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1632*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1633*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1634*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1635*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1636*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1637*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1638*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1639*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1640*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1641*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1642*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1643*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, @"foo");
1644*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1645*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1646*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1647*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1648*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofString);
1649*1b3f573fSAndroid Build Coastguard Worker
1650*1b3f573fSAndroid Build Coastguard Worker  msg.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
1651*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
1652*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1653*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1654*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1655*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1656*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1657*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1658*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1659*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1660*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1661*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1662*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1663*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1664*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1665*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1666*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes,
1667*1b3f573fSAndroid Build Coastguard Worker                        [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
1668*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1669*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1670*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1671*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
1672*1b3f573fSAndroid Build Coastguard Worker
1673*1b3f573fSAndroid Build Coastguard Worker  Message2_OneofGroup *group = [Message2_OneofGroup message];
1674*1b3f573fSAndroid Build Coastguard Worker  msg.oneofGroup = group;
1675*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
1676*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1677*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1678*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1679*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1680*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1681*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1682*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1683*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1684*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1685*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1686*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1687*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1688*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1689*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1690*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1691*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofGroup, group);  // Pointer compare.
1692*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1693*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1694*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
1695*1b3f573fSAndroid Build Coastguard Worker
1696*1b3f573fSAndroid Build Coastguard Worker  Message2 *subMessage = [Message2 message];
1697*1b3f573fSAndroid Build Coastguard Worker  msg.oneofMessage = subMessage;
1698*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
1699*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1700*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1701*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1702*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1703*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1704*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1705*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1706*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1707*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1708*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1709*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1710*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1711*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1712*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1713*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1714*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1715*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg.oneofGroup, group);      // Pointer compare.
1716*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofMessage, subMessage);  // Pointer compare.
1717*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
1718*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
1719*1b3f573fSAndroid Build Coastguard Worker
1720*1b3f573fSAndroid Build Coastguard Worker  msg.oneofEnum = Message2_Enum_Bar;
1721*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
1722*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 100);
1723*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 101);
1724*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 102U);
1725*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 103U);
1726*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 104);
1727*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 105);
1728*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 106U);
1729*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 107U);
1730*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 108);
1731*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 109);
1732*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 110.0f);
1733*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 111.0);
1734*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
1735*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1736*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1737*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
1738*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg.oneofGroup, group);  // Pointer compare.
1739*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1740*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg.oneofMessage, subMessage);  // Pointer compare.
1741*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar);
1742*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
1743*1b3f573fSAndroid Build Coastguard Worker
1744*1b3f573fSAndroid Build Coastguard Worker  // Test setting/calling clear clearing.
1745*1b3f573fSAndroid Build Coastguard Worker
1746*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1747*1b3f573fSAndroid Build Coastguard Worker  msg = [[Message2 alloc] init];
1748*1b3f573fSAndroid Build Coastguard Worker
1749*1b3f573fSAndroid Build Coastguard Worker  int32_t values[] = {
1750*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofInt32,
1751*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofInt64,
1752*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofUint32,
1753*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofUint64,
1754*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofSint32,
1755*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofSint64,
1756*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofFixed32,
1757*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofFixed64,
1758*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofSfixed32,
1759*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofSfixed64,
1760*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofFloat,
1761*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofDouble,
1762*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofBool,
1763*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofString,
1764*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofBytes,
1765*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofGroup,
1766*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofMessage,
1767*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofEnum,
1768*1b3f573fSAndroid Build Coastguard Worker  };
1769*1b3f573fSAndroid Build Coastguard Worker
1770*1b3f573fSAndroid Build Coastguard Worker  for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
1771*1b3f573fSAndroid Build Coastguard Worker    switch (values[i]) {
1772*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofInt32:
1773*1b3f573fSAndroid Build Coastguard Worker        msg.oneofInt32 = 1;
1774*1b3f573fSAndroid Build Coastguard Worker        break;
1775*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofInt64:
1776*1b3f573fSAndroid Build Coastguard Worker        msg.oneofInt64 = 2;
1777*1b3f573fSAndroid Build Coastguard Worker        break;
1778*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofUint32:
1779*1b3f573fSAndroid Build Coastguard Worker        msg.oneofUint32 = 3;
1780*1b3f573fSAndroid Build Coastguard Worker        break;
1781*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofUint64:
1782*1b3f573fSAndroid Build Coastguard Worker        msg.oneofUint64 = 4;
1783*1b3f573fSAndroid Build Coastguard Worker        break;
1784*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofSint32:
1785*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSint32 = 5;
1786*1b3f573fSAndroid Build Coastguard Worker        break;
1787*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofSint64:
1788*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSint64 = 6;
1789*1b3f573fSAndroid Build Coastguard Worker        break;
1790*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofFixed32:
1791*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFixed32 = 7;
1792*1b3f573fSAndroid Build Coastguard Worker        break;
1793*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofFixed64:
1794*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFixed64 = 8;
1795*1b3f573fSAndroid Build Coastguard Worker        break;
1796*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofSfixed32:
1797*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSfixed32 = 9;
1798*1b3f573fSAndroid Build Coastguard Worker        break;
1799*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofSfixed64:
1800*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSfixed64 = 10;
1801*1b3f573fSAndroid Build Coastguard Worker        break;
1802*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofFloat:
1803*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFloat = 11.0f;
1804*1b3f573fSAndroid Build Coastguard Worker        break;
1805*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofDouble:
1806*1b3f573fSAndroid Build Coastguard Worker        msg.oneofDouble = 12.0;
1807*1b3f573fSAndroid Build Coastguard Worker        break;
1808*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofBool:
1809*1b3f573fSAndroid Build Coastguard Worker        msg.oneofBool = YES;
1810*1b3f573fSAndroid Build Coastguard Worker        break;
1811*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofString:
1812*1b3f573fSAndroid Build Coastguard Worker        msg.oneofString = @"foo";
1813*1b3f573fSAndroid Build Coastguard Worker        break;
1814*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofBytes:
1815*1b3f573fSAndroid Build Coastguard Worker        msg.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
1816*1b3f573fSAndroid Build Coastguard Worker        break;
1817*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofGroup:
1818*1b3f573fSAndroid Build Coastguard Worker        msg.oneofGroup = group;
1819*1b3f573fSAndroid Build Coastguard Worker        break;
1820*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofMessage:
1821*1b3f573fSAndroid Build Coastguard Worker        msg.oneofMessage = subMessage;
1822*1b3f573fSAndroid Build Coastguard Worker        break;
1823*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofEnum:
1824*1b3f573fSAndroid Build Coastguard Worker        msg.oneofEnum = Message2_Enum_Bar;
1825*1b3f573fSAndroid Build Coastguard Worker        break;
1826*1b3f573fSAndroid Build Coastguard Worker      default:
1827*1b3f573fSAndroid Build Coastguard Worker        XCTFail(@"shouldn't happen, loop: %zd, value: %d", i, values[i]);
1828*1b3f573fSAndroid Build Coastguard Worker        break;
1829*1b3f573fSAndroid Build Coastguard Worker    }
1830*1b3f573fSAndroid Build Coastguard Worker
1831*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, values[i], "Loop: %zd", i);
1832*1b3f573fSAndroid Build Coastguard Worker    // No need to check the value was set, the above tests did that.
1833*1b3f573fSAndroid Build Coastguard Worker    Message2_ClearOOneOfCase(msg);
1834*1b3f573fSAndroid Build Coastguard Worker    // Nothing in the case.
1835*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase,
1836*1b3f573fSAndroid Build Coastguard Worker                   "Loop: %zd", i);
1837*1b3f573fSAndroid Build Coastguard Worker    // Confirm everything is back to defaults after a clear.
1838*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt32, 100, "Loop: %zd", i);
1839*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt64, 101, "Loop: %zd", i);
1840*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint32, 102U, "Loop: %zd", i);
1841*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint64, 103U, "Loop: %zd", i);
1842*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint32, 104, "Loop: %zd", i);
1843*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint64, 105, "Loop: %zd", i);
1844*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed32, 106U, "Loop: %zd", i);
1845*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed64, 107U, "Loop: %zd", i);
1846*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed32, 108, "Loop: %zd", i);
1847*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed64, 109, "Loop: %zd", i);
1848*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFloat, 110.0f, "Loop: %zd", i);
1849*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofDouble, 111.0, "Loop: %zd", i);
1850*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofBool, YES, "Loop: %zd", i);
1851*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofString, oneofStringDefault, "Loop: %zd", i);
1852*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i);
1853*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg.oneofGroup, "Loop: %zd", i);
1854*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotEqual(msg.oneofGroup, group, "Loop: %zd",
1855*1b3f573fSAndroid Build Coastguard Worker                      i);  // Pointer compare.
1856*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg.oneofMessage, "Loop: %zd", i);
1857*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotEqual(msg.oneofMessage, subMessage, "Loop: %zd",
1858*1b3f573fSAndroid Build Coastguard Worker                      i);  // Pointer compare.
1859*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz, "Loop: %zd", i);
1860*1b3f573fSAndroid Build Coastguard Worker  }
1861*1b3f573fSAndroid Build Coastguard Worker
1862*1b3f573fSAndroid Build Coastguard Worker  [msg release];
1863*1b3f573fSAndroid Build Coastguard Worker}
1864*1b3f573fSAndroid Build Coastguard Worker
1865*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3OneofBasicBehaviors {
1866*1b3f573fSAndroid Build Coastguard Worker  Message3 *msg = [[Message3 alloc] init];
1867*1b3f573fSAndroid Build Coastguard Worker
1868*1b3f573fSAndroid Build Coastguard Worker  NSString *oneofStringDefault = @"";
1869*1b3f573fSAndroid Build Coastguard Worker  NSData *oneofBytesDefault = [NSData data];
1870*1b3f573fSAndroid Build Coastguard Worker
1871*1b3f573fSAndroid Build Coastguard Worker  // Nothing set.
1872*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
1873*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
1874*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
1875*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
1876*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
1877*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
1878*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
1879*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
1880*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
1881*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
1882*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
1883*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
1884*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
1885*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
1886*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1887*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1888*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1889*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
1890*1b3f573fSAndroid Build Coastguard Worker
1891*1b3f573fSAndroid Build Coastguard Worker  // Set, check the case, check everyone has default but the one, confirm case
1892*1b3f573fSAndroid Build Coastguard Worker  // didn't change.
1893*1b3f573fSAndroid Build Coastguard Worker
1894*1b3f573fSAndroid Build Coastguard Worker  msg.oneofInt32 = 1;
1895*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
1896*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 1);
1897*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
1898*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
1899*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
1900*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
1901*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
1902*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
1903*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
1904*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
1905*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
1906*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
1907*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
1908*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
1909*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1910*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1911*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1912*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
1913*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
1914*1b3f573fSAndroid Build Coastguard Worker
1915*1b3f573fSAndroid Build Coastguard Worker  msg.oneofInt64 = 2;
1916*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
1917*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
1918*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 2);
1919*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
1920*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
1921*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
1922*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
1923*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
1924*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
1925*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
1926*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
1927*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
1928*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
1929*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
1930*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1931*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1932*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1933*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
1934*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
1935*1b3f573fSAndroid Build Coastguard Worker
1936*1b3f573fSAndroid Build Coastguard Worker  msg.oneofUint32 = 3;
1937*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
1938*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
1939*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
1940*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 3U);
1941*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
1942*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
1943*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
1944*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
1945*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
1946*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
1947*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
1948*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
1949*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
1950*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
1951*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1952*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1953*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1954*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
1955*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
1956*1b3f573fSAndroid Build Coastguard Worker
1957*1b3f573fSAndroid Build Coastguard Worker  msg.oneofUint64 = 4;
1958*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
1959*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
1960*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
1961*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
1962*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 4U);
1963*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
1964*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
1965*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
1966*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
1967*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
1968*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
1969*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
1970*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
1971*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
1972*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1973*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1974*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1975*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
1976*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
1977*1b3f573fSAndroid Build Coastguard Worker
1978*1b3f573fSAndroid Build Coastguard Worker  msg.oneofSint32 = 5;
1979*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
1980*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
1981*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
1982*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
1983*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
1984*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 5);
1985*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
1986*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
1987*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
1988*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
1989*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
1990*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
1991*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
1992*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
1993*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
1994*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
1995*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
1996*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
1997*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
1998*1b3f573fSAndroid Build Coastguard Worker
1999*1b3f573fSAndroid Build Coastguard Worker  msg.oneofSint64 = 6;
2000*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
2001*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2002*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2003*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2004*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2005*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2006*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 6);
2007*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
2008*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
2009*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
2010*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
2011*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
2012*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
2013*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
2014*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2015*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2016*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2017*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
2018*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
2019*1b3f573fSAndroid Build Coastguard Worker
2020*1b3f573fSAndroid Build Coastguard Worker  msg.oneofFixed32 = 7;
2021*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
2022*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2023*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2024*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2025*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2026*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2027*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
2028*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 7U);
2029*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
2030*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
2031*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
2032*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
2033*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
2034*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
2035*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2036*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2037*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2038*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
2039*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
2040*1b3f573fSAndroid Build Coastguard Worker
2041*1b3f573fSAndroid Build Coastguard Worker  msg.oneofFixed64 = 8;
2042*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
2043*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2044*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2045*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2046*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2047*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2048*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
2049*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
2050*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 8U);
2051*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
2052*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
2053*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
2054*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
2055*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
2056*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2057*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2058*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2059*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
2060*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
2061*1b3f573fSAndroid Build Coastguard Worker
2062*1b3f573fSAndroid Build Coastguard Worker  msg.oneofSfixed32 = 9;
2063*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
2064*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2065*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2066*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2067*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2068*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2069*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
2070*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
2071*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
2072*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 9);
2073*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
2074*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
2075*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
2076*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
2077*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2078*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2079*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2080*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
2081*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
2082*1b3f573fSAndroid Build Coastguard Worker
2083*1b3f573fSAndroid Build Coastguard Worker  msg.oneofSfixed64 = 10;
2084*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
2085*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2086*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2087*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2088*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2089*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2090*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
2091*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
2092*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
2093*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
2094*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 10);
2095*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
2096*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
2097*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
2098*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2099*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2100*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2101*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
2102*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
2103*1b3f573fSAndroid Build Coastguard Worker
2104*1b3f573fSAndroid Build Coastguard Worker  msg.oneofFloat = 11.0f;
2105*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
2106*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2107*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2108*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2109*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2110*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2111*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
2112*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
2113*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
2114*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
2115*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
2116*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 11.0f);
2117*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
2118*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
2119*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2120*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2121*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2122*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
2123*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
2124*1b3f573fSAndroid Build Coastguard Worker
2125*1b3f573fSAndroid Build Coastguard Worker  msg.oneofDouble = 12.0;
2126*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
2127*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2128*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2129*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2130*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2131*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2132*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
2133*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
2134*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
2135*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
2136*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
2137*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
2138*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 12.0);
2139*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
2140*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2141*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2142*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2143*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
2144*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
2145*1b3f573fSAndroid Build Coastguard Worker
2146*1b3f573fSAndroid Build Coastguard Worker  msg.oneofBool = YES;
2147*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBool);
2148*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2149*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2150*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2151*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2152*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2153*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
2154*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
2155*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
2156*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
2157*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
2158*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
2159*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
2160*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, YES);
2161*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2162*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2163*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2164*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
2165*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBool);
2166*1b3f573fSAndroid Build Coastguard Worker
2167*1b3f573fSAndroid Build Coastguard Worker  msg.oneofString = @"foo";
2168*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofString);
2169*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2170*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2171*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2172*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2173*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2174*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
2175*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
2176*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
2177*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
2178*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
2179*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
2180*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
2181*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
2182*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, @"foo");
2183*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2184*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2185*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
2186*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofString);
2187*1b3f573fSAndroid Build Coastguard Worker
2188*1b3f573fSAndroid Build Coastguard Worker  msg.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
2189*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
2190*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2191*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2192*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2193*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2194*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2195*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
2196*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
2197*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
2198*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
2199*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
2200*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
2201*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
2202*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
2203*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2204*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes,
2205*1b3f573fSAndroid Build Coastguard Worker                        [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
2206*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2207*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
2208*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
2209*1b3f573fSAndroid Build Coastguard Worker
2210*1b3f573fSAndroid Build Coastguard Worker  Message3 *subMessage = [Message3 message];
2211*1b3f573fSAndroid Build Coastguard Worker  msg.oneofMessage = subMessage;
2212*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
2213*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2214*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2215*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2216*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2217*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2218*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
2219*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
2220*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
2221*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
2222*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
2223*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
2224*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
2225*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
2226*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2227*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2228*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofMessage, subMessage);  // Pointer compare.
2229*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
2230*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
2231*1b3f573fSAndroid Build Coastguard Worker
2232*1b3f573fSAndroid Build Coastguard Worker  msg.oneofEnum = Message3_Enum_Bar;
2233*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
2234*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt32, 0);
2235*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofInt64, 0);
2236*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint32, 0U);
2237*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofUint64, 0U);
2238*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint32, 0);
2239*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSint64, 0);
2240*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed32, 0U);
2241*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFixed64, 0U);
2242*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed32, 0);
2243*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofSfixed64, 0);
2244*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofFloat, 0.0f);
2245*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofDouble, 0.0);
2246*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofBool, NO);
2247*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2248*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2249*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2250*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg.oneofMessage, subMessage);  // Pointer compare.
2251*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oneofEnum, Message3_Enum_Bar);
2252*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
2253*1b3f573fSAndroid Build Coastguard Worker
2254*1b3f573fSAndroid Build Coastguard Worker  // Test setting/calling clear clearing.
2255*1b3f573fSAndroid Build Coastguard Worker
2256*1b3f573fSAndroid Build Coastguard Worker  [msg release];
2257*1b3f573fSAndroid Build Coastguard Worker  msg = [[Message3 alloc] init];
2258*1b3f573fSAndroid Build Coastguard Worker
2259*1b3f573fSAndroid Build Coastguard Worker  int32_t values[] = {
2260*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofInt32,
2261*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofInt64,
2262*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofUint32,
2263*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofUint64,
2264*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofSint32,
2265*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofSint64,
2266*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofFixed32,
2267*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofFixed64,
2268*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofSfixed32,
2269*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofSfixed64,
2270*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofFloat,
2271*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofDouble,
2272*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofBool,
2273*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofString,
2274*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofBytes,
2275*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofMessage,
2276*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofEnum,
2277*1b3f573fSAndroid Build Coastguard Worker  };
2278*1b3f573fSAndroid Build Coastguard Worker
2279*1b3f573fSAndroid Build Coastguard Worker  for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
2280*1b3f573fSAndroid Build Coastguard Worker    switch (values[i]) {
2281*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofInt32:
2282*1b3f573fSAndroid Build Coastguard Worker        msg.oneofInt32 = 1;
2283*1b3f573fSAndroid Build Coastguard Worker        break;
2284*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofInt64:
2285*1b3f573fSAndroid Build Coastguard Worker        msg.oneofInt64 = 2;
2286*1b3f573fSAndroid Build Coastguard Worker        break;
2287*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofUint32:
2288*1b3f573fSAndroid Build Coastguard Worker        msg.oneofUint32 = 3;
2289*1b3f573fSAndroid Build Coastguard Worker        break;
2290*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofUint64:
2291*1b3f573fSAndroid Build Coastguard Worker        msg.oneofUint64 = 4;
2292*1b3f573fSAndroid Build Coastguard Worker        break;
2293*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofSint32:
2294*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSint32 = 5;
2295*1b3f573fSAndroid Build Coastguard Worker        break;
2296*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofSint64:
2297*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSint64 = 6;
2298*1b3f573fSAndroid Build Coastguard Worker        break;
2299*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofFixed32:
2300*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFixed32 = 7;
2301*1b3f573fSAndroid Build Coastguard Worker        break;
2302*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofFixed64:
2303*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFixed64 = 8;
2304*1b3f573fSAndroid Build Coastguard Worker        break;
2305*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofSfixed32:
2306*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSfixed32 = 9;
2307*1b3f573fSAndroid Build Coastguard Worker        break;
2308*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofSfixed64:
2309*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSfixed64 = 10;
2310*1b3f573fSAndroid Build Coastguard Worker        break;
2311*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofFloat:
2312*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFloat = 11.0f;
2313*1b3f573fSAndroid Build Coastguard Worker        break;
2314*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofDouble:
2315*1b3f573fSAndroid Build Coastguard Worker        msg.oneofDouble = 12.0;
2316*1b3f573fSAndroid Build Coastguard Worker        break;
2317*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofBool:
2318*1b3f573fSAndroid Build Coastguard Worker        msg.oneofBool = YES;
2319*1b3f573fSAndroid Build Coastguard Worker        break;
2320*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofString:
2321*1b3f573fSAndroid Build Coastguard Worker        msg.oneofString = @"foo";
2322*1b3f573fSAndroid Build Coastguard Worker        break;
2323*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofBytes:
2324*1b3f573fSAndroid Build Coastguard Worker        msg.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
2325*1b3f573fSAndroid Build Coastguard Worker        break;
2326*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofMessage:
2327*1b3f573fSAndroid Build Coastguard Worker        msg.oneofMessage = subMessage;
2328*1b3f573fSAndroid Build Coastguard Worker        break;
2329*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofEnum:
2330*1b3f573fSAndroid Build Coastguard Worker        msg.oneofEnum = Message3_Enum_Baz;
2331*1b3f573fSAndroid Build Coastguard Worker        break;
2332*1b3f573fSAndroid Build Coastguard Worker      default:
2333*1b3f573fSAndroid Build Coastguard Worker        XCTFail(@"shouldn't happen, loop: %zd, value: %d", i, values[i]);
2334*1b3f573fSAndroid Build Coastguard Worker        break;
2335*1b3f573fSAndroid Build Coastguard Worker    }
2336*1b3f573fSAndroid Build Coastguard Worker
2337*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, values[i], "Loop: %zd", i);
2338*1b3f573fSAndroid Build Coastguard Worker    // No need to check the value was set, the above tests did that.
2339*1b3f573fSAndroid Build Coastguard Worker    Message3_ClearOOneOfCase(msg);
2340*1b3f573fSAndroid Build Coastguard Worker    // Nothing in the case.
2341*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase,
2342*1b3f573fSAndroid Build Coastguard Worker                   "Loop: %zd", i);
2343*1b3f573fSAndroid Build Coastguard Worker    // Confirm everything is back to defaults after a clear.
2344*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt32, 0, "Loop: %zd", i);
2345*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt64, 0, "Loop: %zd", i);
2346*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint32, 0U, "Loop: %zd", i);
2347*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint64, 0U, "Loop: %zd", i);
2348*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint32, 0, "Loop: %zd", i);
2349*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint64, 0, "Loop: %zd", i);
2350*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed32, 0U, "Loop: %zd", i);
2351*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed64, 0U, "Loop: %zd", i);
2352*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed32, 0, "Loop: %zd", i);
2353*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed64, 0, "Loop: %zd", i);
2354*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFloat, 0.0f, "Loop: %zd", i);
2355*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofDouble, 0.0, "Loop: %zd", i);
2356*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofBool, NO, "Loop: %zd", i);
2357*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofString, oneofStringDefault, "Loop: %zd", i);
2358*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i);
2359*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg.oneofMessage, "Loop: %zd", i);
2360*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotEqual(msg.oneofMessage, subMessage, "Loop: %zd",
2361*1b3f573fSAndroid Build Coastguard Worker                      i);  // Pointer compare.
2362*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo, "Loop: %zd", i);
2363*1b3f573fSAndroid Build Coastguard Worker  }
2364*1b3f573fSAndroid Build Coastguard Worker
2365*1b3f573fSAndroid Build Coastguard Worker  [msg release];
2366*1b3f573fSAndroid Build Coastguard Worker}
2367*1b3f573fSAndroid Build Coastguard Worker
2368*1b3f573fSAndroid Build Coastguard Worker- (void)testProto2OneofSetToDefault {
2369*1b3f573fSAndroid Build Coastguard Worker
2370*1b3f573fSAndroid Build Coastguard Worker  // proto3 doesn't normally write out zero (default) fields, but if they are
2371*1b3f573fSAndroid Build Coastguard Worker  // in a oneof it does.  proto2 doesn't have this special behavior, but we
2372*1b3f573fSAndroid Build Coastguard Worker  // still confirm setting to the explicit default does set the case to be
2373*1b3f573fSAndroid Build Coastguard Worker  // sure the runtime is working correctly.
2374*1b3f573fSAndroid Build Coastguard Worker
2375*1b3f573fSAndroid Build Coastguard Worker  NSString *oneofStringDefault = @"string";
2376*1b3f573fSAndroid Build Coastguard Worker  NSData *oneofBytesDefault = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
2377*1b3f573fSAndroid Build Coastguard Worker
2378*1b3f573fSAndroid Build Coastguard Worker  Message2 *msg = [[Message2 alloc] init];
2379*1b3f573fSAndroid Build Coastguard Worker
2380*1b3f573fSAndroid Build Coastguard Worker  int32_t values[] = {
2381*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofInt32,
2382*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofInt64,
2383*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofUint32,
2384*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofUint64,
2385*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofSint32,
2386*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofSint64,
2387*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofFixed32,
2388*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofFixed64,
2389*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofSfixed32,
2390*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofSfixed64,
2391*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofFloat,
2392*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofDouble,
2393*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofBool,
2394*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofString,
2395*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofBytes,
2396*1b3f573fSAndroid Build Coastguard Worker    // Skip group
2397*1b3f573fSAndroid Build Coastguard Worker    // Skip message
2398*1b3f573fSAndroid Build Coastguard Worker    Message2_O_OneOfCase_OneofEnum,
2399*1b3f573fSAndroid Build Coastguard Worker  };
2400*1b3f573fSAndroid Build Coastguard Worker
2401*1b3f573fSAndroid Build Coastguard Worker  for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
2402*1b3f573fSAndroid Build Coastguard Worker    switch (values[i]) {
2403*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofInt32:
2404*1b3f573fSAndroid Build Coastguard Worker        msg.oneofInt32 = 100;
2405*1b3f573fSAndroid Build Coastguard Worker        break;
2406*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofInt64:
2407*1b3f573fSAndroid Build Coastguard Worker        msg.oneofInt64 = 101;
2408*1b3f573fSAndroid Build Coastguard Worker        break;
2409*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofUint32:
2410*1b3f573fSAndroid Build Coastguard Worker        msg.oneofUint32 = 102;
2411*1b3f573fSAndroid Build Coastguard Worker        break;
2412*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofUint64:
2413*1b3f573fSAndroid Build Coastguard Worker        msg.oneofUint64 = 103;
2414*1b3f573fSAndroid Build Coastguard Worker        break;
2415*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofSint32:
2416*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSint32 = 104;
2417*1b3f573fSAndroid Build Coastguard Worker        break;
2418*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofSint64:
2419*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSint64 = 105;
2420*1b3f573fSAndroid Build Coastguard Worker        break;
2421*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofFixed32:
2422*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFixed32 = 106;
2423*1b3f573fSAndroid Build Coastguard Worker        break;
2424*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofFixed64:
2425*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFixed64 = 107;
2426*1b3f573fSAndroid Build Coastguard Worker        break;
2427*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofSfixed32:
2428*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSfixed32 = 108;
2429*1b3f573fSAndroid Build Coastguard Worker        break;
2430*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofSfixed64:
2431*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSfixed64 = 109;
2432*1b3f573fSAndroid Build Coastguard Worker        break;
2433*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofFloat:
2434*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFloat = 110.0f;
2435*1b3f573fSAndroid Build Coastguard Worker        break;
2436*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofDouble:
2437*1b3f573fSAndroid Build Coastguard Worker        msg.oneofDouble = 111.0;
2438*1b3f573fSAndroid Build Coastguard Worker        break;
2439*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofBool:
2440*1b3f573fSAndroid Build Coastguard Worker        msg.oneofBool = YES;
2441*1b3f573fSAndroid Build Coastguard Worker        break;
2442*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofString:
2443*1b3f573fSAndroid Build Coastguard Worker        msg.oneofString = oneofStringDefault;
2444*1b3f573fSAndroid Build Coastguard Worker        break;
2445*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofBytes:
2446*1b3f573fSAndroid Build Coastguard Worker        msg.oneofBytes = oneofBytesDefault;
2447*1b3f573fSAndroid Build Coastguard Worker        break;
2448*1b3f573fSAndroid Build Coastguard Worker      case Message2_O_OneOfCase_OneofEnum:
2449*1b3f573fSAndroid Build Coastguard Worker        msg.oneofEnum = Message2_Enum_Baz;
2450*1b3f573fSAndroid Build Coastguard Worker        break;
2451*1b3f573fSAndroid Build Coastguard Worker      default:
2452*1b3f573fSAndroid Build Coastguard Worker        XCTFail(@"shouldn't happen, loop: %zd, value: %d", i, values[i]);
2453*1b3f573fSAndroid Build Coastguard Worker        break;
2454*1b3f573fSAndroid Build Coastguard Worker    }
2455*1b3f573fSAndroid Build Coastguard Worker
2456*1b3f573fSAndroid Build Coastguard Worker    // Should be set to the correct case.
2457*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, values[i], "Loop: %zd", i);
2458*1b3f573fSAndroid Build Coastguard Worker
2459*1b3f573fSAndroid Build Coastguard Worker    // Confirm everything is the defaults.
2460*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt32, 100, "Loop: %zd", i);
2461*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt64, 101, "Loop: %zd", i);
2462*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint32, 102U, "Loop: %zd", i);
2463*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint64, 103U, "Loop: %zd", i);
2464*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint32, 104, "Loop: %zd", i);
2465*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint64, 105, "Loop: %zd", i);
2466*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed32, 106U, "Loop: %zd", i);
2467*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed64, 107U, "Loop: %zd", i);
2468*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed32, 108, "Loop: %zd", i);
2469*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed64, 109, "Loop: %zd", i);
2470*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFloat, 110.0f, "Loop: %zd", i);
2471*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofDouble, 111.0, "Loop: %zd", i);
2472*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofBool, YES, "Loop: %zd", i);
2473*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofString, oneofStringDefault, "Loop: %zd", i);
2474*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i);
2475*1b3f573fSAndroid Build Coastguard Worker    // Skip group, no default to consider.
2476*1b3f573fSAndroid Build Coastguard Worker    // Skip message, no default to consider.
2477*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz, "Loop: %zd", i);
2478*1b3f573fSAndroid Build Coastguard Worker  }
2479*1b3f573fSAndroid Build Coastguard Worker
2480*1b3f573fSAndroid Build Coastguard Worker  // We special case nil on string, data, group, and message, ensure they work
2481*1b3f573fSAndroid Build Coastguard Worker  // as expected. i.e. - it clears the case.
2482*1b3f573fSAndroid Build Coastguard Worker  msg.oneofString = nil;
2483*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2484*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
2485*1b3f573fSAndroid Build Coastguard Worker  msg.oneofBytes = nil;
2486*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
2487*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2488*1b3f573fSAndroid Build Coastguard Worker  msg.oneofGroup = nil;
2489*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
2490*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofGroup);
2491*1b3f573fSAndroid Build Coastguard Worker  msg.oneofMessage = nil;
2492*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
2493*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2494*1b3f573fSAndroid Build Coastguard Worker
2495*1b3f573fSAndroid Build Coastguard Worker  [msg release];
2496*1b3f573fSAndroid Build Coastguard Worker}
2497*1b3f573fSAndroid Build Coastguard Worker
2498*1b3f573fSAndroid Build Coastguard Worker- (void)testProto3OneofSetToZero {
2499*1b3f573fSAndroid Build Coastguard Worker
2500*1b3f573fSAndroid Build Coastguard Worker  // Normally setting a proto3 field to the zero value should result in it being
2501*1b3f573fSAndroid Build Coastguard Worker  // reset/cleared.  But in a oneof, it still gets recorded so it can go out
2502*1b3f573fSAndroid Build Coastguard Worker  // over the wire and the other side can see what was set in the oneof.
2503*1b3f573fSAndroid Build Coastguard Worker
2504*1b3f573fSAndroid Build Coastguard Worker  NSString *oneofStringDefault = @"";
2505*1b3f573fSAndroid Build Coastguard Worker  NSData *oneofBytesDefault = [NSData data];
2506*1b3f573fSAndroid Build Coastguard Worker
2507*1b3f573fSAndroid Build Coastguard Worker  Message3 *msg = [[Message3 alloc] init];
2508*1b3f573fSAndroid Build Coastguard Worker
2509*1b3f573fSAndroid Build Coastguard Worker  int32_t values[] = {
2510*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofInt32,
2511*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofInt64,
2512*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofUint32,
2513*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofUint64,
2514*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofSint32,
2515*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofSint64,
2516*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofFixed32,
2517*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofFixed64,
2518*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofSfixed32,
2519*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofSfixed64,
2520*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofFloat,
2521*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofDouble,
2522*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofBool,
2523*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofString,
2524*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofBytes,
2525*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofMessage,
2526*1b3f573fSAndroid Build Coastguard Worker    Message3_O_OneOfCase_OneofEnum,
2527*1b3f573fSAndroid Build Coastguard Worker  };
2528*1b3f573fSAndroid Build Coastguard Worker
2529*1b3f573fSAndroid Build Coastguard Worker  for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
2530*1b3f573fSAndroid Build Coastguard Worker    switch (values[i]) {
2531*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofInt32:
2532*1b3f573fSAndroid Build Coastguard Worker        msg.oneofInt32 = 0;
2533*1b3f573fSAndroid Build Coastguard Worker        break;
2534*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofInt64:
2535*1b3f573fSAndroid Build Coastguard Worker        msg.oneofInt64 = 0;
2536*1b3f573fSAndroid Build Coastguard Worker        break;
2537*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofUint32:
2538*1b3f573fSAndroid Build Coastguard Worker        msg.oneofUint32 = 0;
2539*1b3f573fSAndroid Build Coastguard Worker        break;
2540*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofUint64:
2541*1b3f573fSAndroid Build Coastguard Worker        msg.oneofUint64 = 0;
2542*1b3f573fSAndroid Build Coastguard Worker        break;
2543*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofSint32:
2544*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSint32 = 0;
2545*1b3f573fSAndroid Build Coastguard Worker        break;
2546*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofSint64:
2547*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSint64 = 0;
2548*1b3f573fSAndroid Build Coastguard Worker        break;
2549*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofFixed32:
2550*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFixed32 = 0;
2551*1b3f573fSAndroid Build Coastguard Worker        break;
2552*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofFixed64:
2553*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFixed64 = 0;
2554*1b3f573fSAndroid Build Coastguard Worker        break;
2555*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofSfixed32:
2556*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSfixed32 = 0;
2557*1b3f573fSAndroid Build Coastguard Worker        break;
2558*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofSfixed64:
2559*1b3f573fSAndroid Build Coastguard Worker        msg.oneofSfixed64 = 0;
2560*1b3f573fSAndroid Build Coastguard Worker        break;
2561*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofFloat:
2562*1b3f573fSAndroid Build Coastguard Worker        msg.oneofFloat = 0.0f;
2563*1b3f573fSAndroid Build Coastguard Worker        break;
2564*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofDouble:
2565*1b3f573fSAndroid Build Coastguard Worker        msg.oneofDouble = 0.0;
2566*1b3f573fSAndroid Build Coastguard Worker        break;
2567*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofBool:
2568*1b3f573fSAndroid Build Coastguard Worker        msg.oneofBool = NO;
2569*1b3f573fSAndroid Build Coastguard Worker        break;
2570*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofString:
2571*1b3f573fSAndroid Build Coastguard Worker        msg.oneofString = oneofStringDefault;
2572*1b3f573fSAndroid Build Coastguard Worker        break;
2573*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofBytes:
2574*1b3f573fSAndroid Build Coastguard Worker        msg.oneofBytes = oneofBytesDefault;
2575*1b3f573fSAndroid Build Coastguard Worker        break;
2576*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofMessage:
2577*1b3f573fSAndroid Build Coastguard Worker        msg.oneofMessage.optionalInt32 = 0;
2578*1b3f573fSAndroid Build Coastguard Worker        break;
2579*1b3f573fSAndroid Build Coastguard Worker      case Message3_O_OneOfCase_OneofEnum:
2580*1b3f573fSAndroid Build Coastguard Worker        msg.oneofEnum = Message3_Enum_Foo;
2581*1b3f573fSAndroid Build Coastguard Worker        break;
2582*1b3f573fSAndroid Build Coastguard Worker      default:
2583*1b3f573fSAndroid Build Coastguard Worker        XCTFail(@"shouldn't happen, loop: %zd, value: %d", i, values[i]);
2584*1b3f573fSAndroid Build Coastguard Worker        break;
2585*1b3f573fSAndroid Build Coastguard Worker    }
2586*1b3f573fSAndroid Build Coastguard Worker
2587*1b3f573fSAndroid Build Coastguard Worker    // Should be set to the correct case.
2588*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oOneOfCase, values[i], "Loop: %zd", i);
2589*1b3f573fSAndroid Build Coastguard Worker
2590*1b3f573fSAndroid Build Coastguard Worker    // Confirm everything is still zeros.
2591*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt32, 0, "Loop: %zd", i);
2592*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofInt64, 0, "Loop: %zd", i);
2593*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint32, 0U, "Loop: %zd", i);
2594*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofUint64, 0U, "Loop: %zd", i);
2595*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint32, 0, "Loop: %zd", i);
2596*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSint64, 0, "Loop: %zd", i);
2597*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed32, 0U, "Loop: %zd", i);
2598*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFixed64, 0U, "Loop: %zd", i);
2599*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed32, 0, "Loop: %zd", i);
2600*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofSfixed64, 0, "Loop: %zd", i);
2601*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofFloat, 0.0f, "Loop: %zd", i);
2602*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofDouble, 0.0, "Loop: %zd", i);
2603*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofBool, NO, "Loop: %zd", i);
2604*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofString, oneofStringDefault, "Loop: %zd", i);
2605*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i);
2606*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotNil(msg.oneofMessage, "Loop: %zd", i);
2607*1b3f573fSAndroid Build Coastguard Worker    XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo, "Loop: %zd", i);
2608*1b3f573fSAndroid Build Coastguard Worker  }
2609*1b3f573fSAndroid Build Coastguard Worker
2610*1b3f573fSAndroid Build Coastguard Worker  // We special case nil on string, data, message, ensure they work as expected.
2611*1b3f573fSAndroid Build Coastguard Worker  msg.oneofString = nil;
2612*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
2613*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2614*1b3f573fSAndroid Build Coastguard Worker  msg.oneofBytes = nil;
2615*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
2616*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2617*1b3f573fSAndroid Build Coastguard Worker  msg.oneofMessage = nil;
2618*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
2619*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(msg.oneofMessage);
2620*1b3f573fSAndroid Build Coastguard Worker
2621*1b3f573fSAndroid Build Coastguard Worker  [msg release];
2622*1b3f573fSAndroid Build Coastguard Worker}
2623*1b3f573fSAndroid Build Coastguard Worker
2624*1b3f573fSAndroid Build Coastguard Worker- (void)testCopyingMakesUniqueObjects {
2625*1b3f573fSAndroid Build Coastguard Worker  const int repeatCount = 5;
2626*1b3f573fSAndroid Build Coastguard Worker  TestAllTypes *msg1 = [TestAllTypes message];
2627*1b3f573fSAndroid Build Coastguard Worker  [self setAllFields:msg1 repeatedCount:repeatCount];
2628*1b3f573fSAndroid Build Coastguard Worker
2629*1b3f573fSAndroid Build Coastguard Worker  TestAllTypes *msg2 = [[msg1 copy] autorelease];
2630*1b3f573fSAndroid Build Coastguard Worker
2631*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1, msg2);      // Ptr compare, new object.
2632*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg1, msg2);  // Equal values.
2633*1b3f573fSAndroid Build Coastguard Worker
2634*1b3f573fSAndroid Build Coastguard Worker  // Pointer comparisons, different objects.
2635*1b3f573fSAndroid Build Coastguard Worker
2636*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.optionalGroup, msg2.optionalGroup);
2637*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.optionalNestedMessage, msg2.optionalNestedMessage);
2638*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.optionalForeignMessage, msg2.optionalForeignMessage);
2639*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.optionalImportMessage, msg2.optionalImportMessage);
2640*1b3f573fSAndroid Build Coastguard Worker
2641*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedInt32Array, msg2.repeatedInt32Array);
2642*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedInt64Array, msg2.repeatedInt64Array);
2643*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedUint32Array, msg2.repeatedUint32Array);
2644*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedUint64Array, msg2.repeatedUint64Array);
2645*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedSint32Array, msg2.repeatedSint32Array);
2646*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedSint64Array, msg2.repeatedSint64Array);
2647*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedFixed32Array, msg2.repeatedFixed32Array);
2648*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedFixed64Array, msg2.repeatedFixed64Array);
2649*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedSfixed32Array, msg2.repeatedSfixed32Array);
2650*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedSfixed64Array, msg2.repeatedSfixed64Array);
2651*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedFloatArray, msg2.repeatedFloatArray);
2652*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedDoubleArray, msg2.repeatedDoubleArray);
2653*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedBoolArray, msg2.repeatedBoolArray);
2654*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedStringArray, msg2.repeatedStringArray);
2655*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedBytesArray, msg2.repeatedBytesArray);
2656*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedGroupArray, msg2.repeatedGroupArray);
2657*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedNestedMessageArray,
2658*1b3f573fSAndroid Build Coastguard Worker                    msg2.repeatedNestedMessageArray);
2659*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedForeignMessageArray,
2660*1b3f573fSAndroid Build Coastguard Worker                    msg2.repeatedForeignMessageArray);
2661*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedImportMessageArray,
2662*1b3f573fSAndroid Build Coastguard Worker                    msg2.repeatedImportMessageArray);
2663*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedNestedEnumArray, msg2.repeatedNestedEnumArray);
2664*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedForeignEnumArray,
2665*1b3f573fSAndroid Build Coastguard Worker                    msg2.repeatedForeignEnumArray);
2666*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedImportEnumArray, msg2.repeatedImportEnumArray);
2667*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedStringPieceArray,
2668*1b3f573fSAndroid Build Coastguard Worker                    msg2.repeatedStringPieceArray);
2669*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.repeatedCordArray, msg2.repeatedCordArray);
2670*1b3f573fSAndroid Build Coastguard Worker
2671*1b3f573fSAndroid Build Coastguard Worker  for (int i = 0; i < repeatCount; i++) {
2672*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotEqual(msg1.repeatedNestedMessageArray[i],
2673*1b3f573fSAndroid Build Coastguard Worker                      msg2.repeatedNestedMessageArray[i]);
2674*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotEqual(msg1.repeatedForeignMessageArray[i],
2675*1b3f573fSAndroid Build Coastguard Worker                      msg2.repeatedForeignMessageArray[i]);
2676*1b3f573fSAndroid Build Coastguard Worker    XCTAssertNotEqual(msg1.repeatedImportMessageArray[i],
2677*1b3f573fSAndroid Build Coastguard Worker                      msg2.repeatedImportMessageArray[i]);
2678*1b3f573fSAndroid Build Coastguard Worker  }
2679*1b3f573fSAndroid Build Coastguard Worker}
2680*1b3f573fSAndroid Build Coastguard Worker
2681*1b3f573fSAndroid Build Coastguard Worker- (void)testCopyingMapsMakesUniqueObjects {
2682*1b3f573fSAndroid Build Coastguard Worker  TestMap *msg1 = [TestMap message];
2683*1b3f573fSAndroid Build Coastguard Worker  [self setAllMapFields:msg1 numEntries:5];
2684*1b3f573fSAndroid Build Coastguard Worker
2685*1b3f573fSAndroid Build Coastguard Worker  TestMap *msg2 = [[msg1 copy] autorelease];
2686*1b3f573fSAndroid Build Coastguard Worker
2687*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1, msg2);      // Ptr compare, new object.
2688*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg1, msg2);  // Equal values.
2689*1b3f573fSAndroid Build Coastguard Worker
2690*1b3f573fSAndroid Build Coastguard Worker  // Pointer comparisons, different objects.
2691*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapInt32Int32, msg2.mapInt32Int32);
2692*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapInt64Int64, msg2.mapInt64Int64);
2693*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapUint32Uint32, msg2.mapUint32Uint32);
2694*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapUint64Uint64, msg2.mapUint64Uint64);
2695*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapSint32Sint32, msg2.mapSint32Sint32);
2696*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapSint64Sint64, msg2.mapSint64Sint64);
2697*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapFixed32Fixed32, msg2.mapFixed32Fixed32);
2698*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapFixed64Fixed64, msg2.mapFixed64Fixed64);
2699*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapSfixed32Sfixed32, msg2.mapSfixed32Sfixed32);
2700*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapSfixed64Sfixed64, msg2.mapSfixed64Sfixed64);
2701*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapInt32Float, msg2.mapInt32Float);
2702*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapInt32Double, msg2.mapInt32Double);
2703*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapBoolBool, msg2.mapBoolBool);
2704*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapStringString, msg2.mapStringString);
2705*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapInt32Bytes, msg2.mapInt32Bytes);
2706*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapInt32Enum, msg2.mapInt32Enum);
2707*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqual(msg1.mapInt32ForeignMessage, msg2.mapInt32ForeignMessage);
2708*1b3f573fSAndroid Build Coastguard Worker
2709*1b3f573fSAndroid Build Coastguard Worker  // Ensure the messages are unique per map.
2710*1b3f573fSAndroid Build Coastguard Worker  [msg1.mapInt32ForeignMessage
2711*1b3f573fSAndroid Build Coastguard Worker      enumerateKeysAndObjectsUsingBlock:^(int32_t key, id value, BOOL *stop) {
2712*1b3f573fSAndroid Build Coastguard Worker#pragma unused(stop)
2713*1b3f573fSAndroid Build Coastguard Worker        ForeignMessage *subMsg2 = [msg2.mapInt32ForeignMessage objectForKey:key];
2714*1b3f573fSAndroid Build Coastguard Worker        XCTAssertNotEqual(value, subMsg2);  // Ptr compare, new object.
2715*1b3f573fSAndroid Build Coastguard Worker      }];
2716*1b3f573fSAndroid Build Coastguard Worker}
2717*1b3f573fSAndroid Build Coastguard Worker
2718*1b3f573fSAndroid Build Coastguard Worker- (void)test_GPBGetMessageRepeatedField {
2719*1b3f573fSAndroid Build Coastguard Worker  TestAllTypes *message = [TestAllTypes message];
2720*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"repeatedStringArray"];
2721*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptor);
2722*1b3f573fSAndroid Build Coastguard Worker  NSMutableArray *fieldArray = GPBGetMessageRepeatedField(message, fieldDescriptor);
2723*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldArray);  // Should have autocreated.
2724*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(fieldArray == message.repeatedStringArray);  // Same pointer
2725*1b3f573fSAndroid Build Coastguard Worker}
2726*1b3f573fSAndroid Build Coastguard Worker
2727*1b3f573fSAndroid Build Coastguard Worker- (void)test_GPBSetMessageRepeatedField {
2728*1b3f573fSAndroid Build Coastguard Worker  TestAllTypes *message = [TestAllTypes message];
2729*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"repeatedStringArray"];
2730*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptor);
2731*1b3f573fSAndroid Build Coastguard Worker
2732*1b3f573fSAndroid Build Coastguard Worker  NSMutableArray *fieldArray = [NSMutableArray arrayWithObject:@"foo"];
2733*1b3f573fSAndroid Build Coastguard Worker  GPBSetMessageRepeatedField(message, fieldDescriptor, fieldArray);
2734*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(fieldArray == message.repeatedStringArray);  // Same pointer
2735*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(@"foo", message.repeatedStringArray.firstObject);
2736*1b3f573fSAndroid Build Coastguard Worker}
2737*1b3f573fSAndroid Build Coastguard Worker
2738*1b3f573fSAndroid Build Coastguard Worker- (void)test_GPBGetMessageMapField {
2739*1b3f573fSAndroid Build Coastguard Worker  TestMap *message = [TestMap message];
2740*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"mapStringString"];
2741*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptor);
2742*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *fieldMap = GPBGetMessageMapField(message, fieldDescriptor);
2743*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldMap);  // Should have autocreated.
2744*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(fieldMap == message.mapStringString);  // Same pointer
2745*1b3f573fSAndroid Build Coastguard Worker}
2746*1b3f573fSAndroid Build Coastguard Worker
2747*1b3f573fSAndroid Build Coastguard Worker- (void)test_GPBSetMessageMapField {
2748*1b3f573fSAndroid Build Coastguard Worker  TestMap *message = [TestMap message];
2749*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"mapStringString"];
2750*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptor);
2751*1b3f573fSAndroid Build Coastguard Worker
2752*1b3f573fSAndroid Build Coastguard Worker  NSMutableDictionary *fieldMap = [NSMutableDictionary dictionaryWithObject:@"bar" forKey:@"foo"];
2753*1b3f573fSAndroid Build Coastguard Worker  GPBSetMessageMapField(message, fieldDescriptor, fieldMap);
2754*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(fieldMap == message.mapStringString);  // Same pointer
2755*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(@"bar", message.mapStringString[@"foo"]);
2756*1b3f573fSAndroid Build Coastguard Worker}
2757*1b3f573fSAndroid Build Coastguard Worker
2758*1b3f573fSAndroid Build Coastguard Worker- (void)test_StringFieldsCopy {
2759*1b3f573fSAndroid Build Coastguard Worker  // ObjC conventions call for NSString properties to be copy, ensure
2760*1b3f573fSAndroid Build Coastguard Worker  // that is done correctly and the string isn't simply retained.
2761*1b3f573fSAndroid Build Coastguard Worker
2762*1b3f573fSAndroid Build Coastguard Worker  Message2 *msg1 = [Message2 message];
2763*1b3f573fSAndroid Build Coastguard Worker  Message2 *msg2 = [Message2 message];
2764*1b3f573fSAndroid Build Coastguard Worker
2765*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *fieldDesc =
2766*1b3f573fSAndroid Build Coastguard Worker      [[Message2 descriptor] fieldWithNumber:Message2_FieldNumber_OptionalString];
2767*1b3f573fSAndroid Build Coastguard Worker  NSMutableString *mutableStr = [NSMutableString stringWithString:@"foo"];
2768*1b3f573fSAndroid Build Coastguard Worker
2769*1b3f573fSAndroid Build Coastguard Worker  msg1.optionalString = mutableStr;
2770*1b3f573fSAndroid Build Coastguard Worker  GPBSetMessageStringField(msg2, fieldDesc, mutableStr);
2771*1b3f573fSAndroid Build Coastguard Worker
2772*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg1.optionalString, mutableStr);
2773*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg1.optionalString, @"foo");
2774*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(msg1.optionalString != mutableStr);  // Ptr comparison.
2775*1b3f573fSAndroid Build Coastguard Worker
2776*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg2.optionalString, mutableStr);
2777*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg2.optionalString, @"foo");
2778*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(msg2.optionalString != mutableStr);  // Ptr comparison.
2779*1b3f573fSAndroid Build Coastguard Worker
2780*1b3f573fSAndroid Build Coastguard Worker  [mutableStr appendString:@"bar"];
2781*1b3f573fSAndroid Build Coastguard Worker
2782*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqualObjects(msg1.optionalString, mutableStr);
2783*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg1.optionalString, @"foo");
2784*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(msg1.optionalString != mutableStr);  // Ptr comparison.
2785*1b3f573fSAndroid Build Coastguard Worker
2786*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqualObjects(msg2.optionalString, mutableStr);
2787*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg2.optionalString, @"foo");
2788*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(msg2.optionalString != mutableStr);  // Ptr comparison.
2789*1b3f573fSAndroid Build Coastguard Worker}
2790*1b3f573fSAndroid Build Coastguard Worker
2791*1b3f573fSAndroid Build Coastguard Worker- (void)test_BytesFieldsCopy {
2792*1b3f573fSAndroid Build Coastguard Worker  // ObjC conventions call for NSData properties to be copy, ensure
2793*1b3f573fSAndroid Build Coastguard Worker  // that is done correctly and the data isn't simply retained.
2794*1b3f573fSAndroid Build Coastguard Worker
2795*1b3f573fSAndroid Build Coastguard Worker  Message2 *msg1 = [Message2 message];
2796*1b3f573fSAndroid Build Coastguard Worker  Message2 *msg2 = [Message2 message];
2797*1b3f573fSAndroid Build Coastguard Worker
2798*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *fieldDesc =
2799*1b3f573fSAndroid Build Coastguard Worker      [[Message2 descriptor] fieldWithNumber:Message2_FieldNumber_OptionalBytes];
2800*1b3f573fSAndroid Build Coastguard Worker  NSMutableData *mutableData = [NSMutableData dataWithData:DataFromCStr("abc")];
2801*1b3f573fSAndroid Build Coastguard Worker
2802*1b3f573fSAndroid Build Coastguard Worker  msg1.optionalBytes = mutableData;
2803*1b3f573fSAndroid Build Coastguard Worker  GPBSetMessageBytesField(msg2, fieldDesc, mutableData);
2804*1b3f573fSAndroid Build Coastguard Worker
2805*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg1.optionalBytes, mutableData);
2806*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg1.optionalBytes, DataFromCStr("abc"));
2807*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(msg1.optionalBytes != mutableData);  // Ptr comparison.
2808*1b3f573fSAndroid Build Coastguard Worker
2809*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg2.optionalBytes, mutableData);
2810*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg2.optionalBytes, DataFromCStr("abc"));
2811*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(msg2.optionalBytes != mutableData);  // Ptr comparison.
2812*1b3f573fSAndroid Build Coastguard Worker
2813*1b3f573fSAndroid Build Coastguard Worker  [mutableData appendData:DataFromCStr("123")];
2814*1b3f573fSAndroid Build Coastguard Worker
2815*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqualObjects(msg1.optionalBytes, mutableData);
2816*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg1.optionalBytes, DataFromCStr("abc"));
2817*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(msg1.optionalBytes != mutableData);  // Ptr comparison.
2818*1b3f573fSAndroid Build Coastguard Worker
2819*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotEqualObjects(msg2.optionalBytes, mutableData);
2820*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(msg2.optionalBytes, DataFromCStr("abc"));
2821*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(msg2.optionalBytes != mutableData);  // Ptr comparison.
2822*1b3f573fSAndroid Build Coastguard Worker}
2823*1b3f573fSAndroid Build Coastguard Worker
2824*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Subset from from map_tests.cc
2825*1b3f573fSAndroid Build Coastguard Worker
2826*1b3f573fSAndroid Build Coastguard Worker// TEST(GeneratedMapFieldTest, IsInitialized)
2827*1b3f573fSAndroid Build Coastguard Worker- (void)testMap_IsInitialized {
2828*1b3f573fSAndroid Build Coastguard Worker  TestRequiredMessageMap *msg = [[TestRequiredMessageMap alloc] init];
2829*1b3f573fSAndroid Build Coastguard Worker
2830*1b3f573fSAndroid Build Coastguard Worker  // Add an uninitialized message.
2831*1b3f573fSAndroid Build Coastguard Worker  TestRequired *subMsg = [[TestRequired alloc] init];
2832*1b3f573fSAndroid Build Coastguard Worker  [msg.mapField setObject:subMsg forKey:0];
2833*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse(msg.initialized);
2834*1b3f573fSAndroid Build Coastguard Worker
2835*1b3f573fSAndroid Build Coastguard Worker  // Initialize uninitialized message
2836*1b3f573fSAndroid Build Coastguard Worker  subMsg.a = 0;
2837*1b3f573fSAndroid Build Coastguard Worker  subMsg.b = 0;
2838*1b3f573fSAndroid Build Coastguard Worker  subMsg.c = 0;
2839*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(msg.initialized);
2840*1b3f573fSAndroid Build Coastguard Worker
2841*1b3f573fSAndroid Build Coastguard Worker  [subMsg release];
2842*1b3f573fSAndroid Build Coastguard Worker  [msg release];
2843*1b3f573fSAndroid Build Coastguard Worker}
2844*1b3f573fSAndroid Build Coastguard Worker
2845*1b3f573fSAndroid Build Coastguard Worker@end
2846