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