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