1// Protocol Buffers - Google's data interchange format 2// Copyright 2015 Google Inc. All rights reserved. 3// https://developers.google.com/protocol-buffers/ 4// 5// Redistribution and use in source and binary forms, with or without 6// modification, are permitted provided that the following conditions are 7// met: 8// 9// * Redistributions of source code must retain the above copyright 10// notice, this list of conditions and the following disclaimer. 11// * Redistributions in binary form must reproduce the above 12// copyright notice, this list of conditions and the following disclaimer 13// in the documentation and/or other materials provided with the 14// distribution. 15// * Neither the name of Google Inc. nor the names of its 16// contributors may be used to endorse or promote products derived from 17// this software without specific prior written permission. 18// 19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31#import <Foundation/Foundation.h> 32#import <XCTest/XCTest.h> 33 34#import "GPBArray.h" 35 36#import "GPBTestUtilities.h" 37 38// To let the testing macros work, add some extra methods to simplify things. 39@interface GPBEnumArray (TestingTweak) 40+ (instancetype)arrayWithValue:(int32_t)value; 41- (instancetype)initWithValues:(const int32_t [])values 42 count:(NSUInteger)count; 43@end 44 45static BOOL TestingEnum_IsValidValue(int32_t value) { 46 switch (value) { 47 case 71: 48 case 72: 49 case 73: 50 case 74: 51 return YES; 52 default: 53 return NO; 54 } 55} 56 57static BOOL TestingEnum_IsValidValue2(int32_t value) { 58 switch (value) { 59 case 71: 60 case 72: 61 case 73: 62 return YES; 63 default: 64 return NO; 65 } 66} 67 68@implementation GPBEnumArray (TestingTweak) 69+ (instancetype)arrayWithValue:(int32_t)value { 70 return [[[self alloc] initWithValidationFunction:TestingEnum_IsValidValue 71 rawValues:&value 72 count:1] autorelease]; 73} 74- (instancetype)initWithValues:(const int32_t [])values 75 count:(NSUInteger)count { 76 return [self initWithValidationFunction:TestingEnum_IsValidValue 77 rawValues:values 78 count:count]; 79} 80@end 81 82#pragma mark - PDDM Macros 83 84//%PDDM-DEFINE ARRAY_TESTS(NAME, TYPE, VAL1, VAL2, VAL3, VAL4) 85//%ARRAY_TESTS2(NAME, TYPE, VAL1, VAL2, VAL3, VAL4, ) 86//%PDDM-DEFINE ARRAY_TESTS2(NAME, TYPE, VAL1, VAL2, VAL3, VAL4, HELPER) 87//%#pragma mark - NAME 88//% 89//%@interface GPB##NAME##ArrayTests : XCTestCase 90//%@end 91//% 92//%@implementation GPB##NAME##ArrayTests 93//% 94//%- (void)testEmpty { 95//% GPB##NAME##Array *array = [[GPB##NAME##Array alloc] init]; 96//% XCTAssertNotNil(array); 97//% XCTAssertEqual(array.count, 0U); 98//% XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); 99//% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { 100//% #pragma unused(value, idx, stop) 101//% XCTFail(@"Shouldn't get here!"); 102//% }]; 103//% [array enumerateValuesWithOptions:NSEnumerationReverse 104//% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { 105//% #pragma unused(value, idx, stop) 106//% XCTFail(@"Shouldn't get here!"); 107//% }]; 108//% [array release]; 109//%} 110//% 111//%- (void)testOne { 112//% GPB##NAME##Array *array = [GPB##NAME##Array arrayWithValue:VAL1]; 113//% XCTAssertNotNil(array); 114//% XCTAssertEqual(array.count, 1U); 115//% XCTAssertEqual([array valueAtIndex:0], VAL1); 116//% XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); 117//% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { 118//% XCTAssertEqual(idx, 0U); 119//% XCTAssertEqual(value, VAL1); 120//% XCTAssertNotEqual(stop, NULL); 121//% }]; 122//% [array enumerateValuesWithOptions:NSEnumerationReverse 123//% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { 124//% XCTAssertEqual(idx, 0U); 125//% XCTAssertEqual(value, VAL1); 126//% XCTAssertNotEqual(stop, NULL); 127//% }]; 128//%} 129//% 130//%- (void)testBasics { 131//% static const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 }; 132//% GPB##NAME##Array *array = 133//% [[GPB##NAME##Array alloc] initWithValues:kValues 134//% NAME$S count:GPBARRAYSIZE(kValues)]; 135//% XCTAssertNotNil(array); 136//% XCTAssertEqual(array.count, 4U); 137//% XCTAssertEqual([array valueAtIndex:0], VAL1); 138//% XCTAssertEqual([array valueAtIndex:1], VAL2); 139//% XCTAssertEqual([array valueAtIndex:2], VAL3); 140//% XCTAssertEqual([array valueAtIndex:3], VAL4); 141//% XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); 142//% __block NSUInteger idx2 = 0; 143//% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { 144//% XCTAssertEqual(idx, idx2); 145//% XCTAssertEqual(value, kValues[idx]); 146//% XCTAssertNotEqual(stop, NULL); 147//% ++idx2; 148//% }]; 149//% idx2 = 0; 150//% [array enumerateValuesWithOptions:NSEnumerationReverse 151//% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { 152//% XCTAssertEqual(idx, (3 - idx2)); 153//% XCTAssertEqual(value, kValues[idx]); 154//% XCTAssertNotEqual(stop, NULL); 155//% ++idx2; 156//% }]; 157//% // Stopping the enumeration. 158//% idx2 = 0; 159//% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { 160//% XCTAssertEqual(idx, idx2); 161//% XCTAssertEqual(value, kValues[idx]); 162//% XCTAssertNotEqual(stop, NULL); 163//% if (idx2 == 1) *stop = YES; 164//% XCTAssertNotEqual(idx, 2U); 165//% XCTAssertNotEqual(idx, 3U); 166//% ++idx2; 167//% }]; 168//% idx2 = 0; 169//% [array enumerateValuesWithOptions:NSEnumerationReverse 170//% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { 171//% XCTAssertEqual(idx, (3 - idx2)); 172//% XCTAssertEqual(value, kValues[idx]); 173//% XCTAssertNotEqual(stop, NULL); 174//% if (idx2 == 1) *stop = YES; 175//% XCTAssertNotEqual(idx, 1U); 176//% XCTAssertNotEqual(idx, 0U); 177//% ++idx2; 178//% }]; 179//% [array release]; 180//%} 181//% 182//%- (void)testEquality { 183//% const TYPE kValues1[] = { VAL1, VAL2, VAL3 }; 184//% const TYPE kValues2[] = { VAL1, VAL4, VAL3 }; 185//% const TYPE kValues3[] = { VAL1, VAL2, VAL3, VAL4 }; 186//% GPB##NAME##Array *array1 = 187//% [[GPB##NAME##Array alloc] initWithValues:kValues1 188//% NAME$S count:GPBARRAYSIZE(kValues1)]; 189//% XCTAssertNotNil(array1); 190//% GPB##NAME##Array *array1prime = 191//% [[GPB##NAME##Array alloc] initWithValues:kValues1 192//% NAME$S count:GPBARRAYSIZE(kValues1)]; 193//% XCTAssertNotNil(array1prime); 194//% GPB##NAME##Array *array2 = 195//% [[GPB##NAME##Array alloc] initWithValues:kValues2 196//% NAME$S count:GPBARRAYSIZE(kValues2)]; 197//% XCTAssertNotNil(array2); 198//% GPB##NAME##Array *array3 = 199//% [[GPB##NAME##Array alloc] initWithValues:kValues3 200//% NAME$S count:GPBARRAYSIZE(kValues3)]; 201//% XCTAssertNotNil(array3); 202//% 203//% // 1/1Prime should be different objects, but equal. 204//% XCTAssertNotEqual(array1, array1prime); 205//% XCTAssertEqualObjects(array1, array1prime); 206//% // Equal, so they must have same hash. 207//% XCTAssertEqual([array1 hash], [array1prime hash]); 208//% 209//% // 1/2/3 shouldn't be equal. 210//% XCTAssertNotEqualObjects(array1, array2); 211//% XCTAssertNotEqualObjects(array1, array3); 212//% XCTAssertNotEqualObjects(array2, array3); 213//% 214//% [array1 release]; 215//% [array1prime release]; 216//% [array2 release]; 217//% [array3 release]; 218//%} 219//% 220//%- (void)testCopy { 221//% const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 }; 222//% GPB##NAME##Array *array = 223//% [[GPB##NAME##Array alloc] initWithValues:kValues 224//% NAME$S count:GPBARRAYSIZE(kValues)]; 225//% XCTAssertNotNil(array); 226//% 227//% GPB##NAME##Array *array2 = [array copy]; 228//% XCTAssertNotNil(array2); 229//% 230//% // Should be new object but equal. 231//% XCTAssertNotEqual(array, array2); 232//% XCTAssertEqualObjects(array, array2); 233//% [array2 release]; 234//% [array release]; 235//%} 236//% 237//%- (void)testArrayFromArray { 238//% const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 }; 239//% GPB##NAME##Array *array = 240//% [[GPB##NAME##Array alloc] initWithValues:kValues 241//% NAME$S count:GPBARRAYSIZE(kValues)]; 242//% XCTAssertNotNil(array); 243//% 244//% GPB##NAME##Array *array2 = [GPB##NAME##Array arrayWithValueArray:array]; 245//% XCTAssertNotNil(array2); 246//% 247//% // Should be new pointer, but equal objects. 248//% XCTAssertNotEqual(array, array2); 249//% XCTAssertEqualObjects(array, array2); 250//% [array release]; 251//%} 252//% 253//%- (void)testAdds { 254//% GPB##NAME##Array *array = [GPB##NAME##Array array]; 255//% XCTAssertNotNil(array); 256//% 257//% XCTAssertEqual(array.count, 0U); 258//% [array addValue:VAL1]; 259//% XCTAssertEqual(array.count, 1U); 260//% 261//% const TYPE kValues1[] = { VAL2, VAL3 }; 262//% [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; 263//% XCTAssertEqual(array.count, 3U); 264//% 265//% const TYPE kValues2[] = { VAL4, VAL1 }; 266//% GPB##NAME##Array *array2 = 267//% [[GPB##NAME##Array alloc] initWithValues:kValues2 268//% NAME$S count:GPBARRAYSIZE(kValues2)]; 269//% XCTAssertNotNil(array2); 270//% [array add##HELPER##ValuesFromArray:array2]; 271//% XCTAssertEqual(array.count, 5U); 272//% 273//% XCTAssertEqual([array valueAtIndex:0], VAL1); 274//% XCTAssertEqual([array valueAtIndex:1], VAL2); 275//% XCTAssertEqual([array valueAtIndex:2], VAL3); 276//% XCTAssertEqual([array valueAtIndex:3], VAL4); 277//% XCTAssertEqual([array valueAtIndex:4], VAL1); 278//% [array2 release]; 279//%} 280//% 281//%- (void)testInsert { 282//% const TYPE kValues[] = { VAL1, VAL2, VAL3 }; 283//% GPB##NAME##Array *array = 284//% [[GPB##NAME##Array alloc] initWithValues:kValues 285//% NAME$S count:GPBARRAYSIZE(kValues)]; 286//% XCTAssertNotNil(array); 287//% XCTAssertEqual(array.count, 3U); 288//% 289//% // First 290//% [array insertValue:VAL4 atIndex:0]; 291//% XCTAssertEqual(array.count, 4U); 292//% 293//% // Middle 294//% [array insertValue:VAL4 atIndex:2]; 295//% XCTAssertEqual(array.count, 5U); 296//% 297//% // End 298//% [array insertValue:VAL4 atIndex:5]; 299//% XCTAssertEqual(array.count, 6U); 300//% 301//% // Too far. 302//% XCTAssertThrowsSpecificNamed([array insertValue:VAL4 atIndex:7], 303//% NSException, NSRangeException); 304//% 305//% XCTAssertEqual([array valueAtIndex:0], VAL4); 306//% XCTAssertEqual([array valueAtIndex:1], VAL1); 307//% XCTAssertEqual([array valueAtIndex:2], VAL4); 308//% XCTAssertEqual([array valueAtIndex:3], VAL2); 309//% XCTAssertEqual([array valueAtIndex:4], VAL3); 310//% XCTAssertEqual([array valueAtIndex:5], VAL4); 311//% [array release]; 312//%} 313//% 314//%- (void)testRemove { 315//% const TYPE kValues[] = { VAL4, VAL1, VAL2, VAL4, VAL3, VAL4 }; 316//% GPB##NAME##Array *array = 317//% [[GPB##NAME##Array alloc] initWithValues:kValues 318//% NAME$S count:GPBARRAYSIZE(kValues)]; 319//% XCTAssertNotNil(array); 320//% XCTAssertEqual(array.count, 6U); 321//% 322//% // First 323//% [array removeValueAtIndex:0]; 324//% XCTAssertEqual(array.count, 5U); 325//% XCTAssertEqual([array valueAtIndex:0], VAL1); 326//% 327//% // Middle 328//% [array removeValueAtIndex:2]; 329//% XCTAssertEqual(array.count, 4U); 330//% XCTAssertEqual([array valueAtIndex:2], VAL3); 331//% 332//% // End 333//% [array removeValueAtIndex:3]; 334//% XCTAssertEqual(array.count, 3U); 335//% 336//% XCTAssertEqual([array valueAtIndex:0], VAL1); 337//% XCTAssertEqual([array valueAtIndex:1], VAL2); 338//% XCTAssertEqual([array valueAtIndex:2], VAL3); 339//% 340//% // Too far. 341//% XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], 342//% NSException, NSRangeException); 343//% 344//% [array removeAll]; 345//% XCTAssertEqual(array.count, 0U); 346//% XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], 347//% NSException, NSRangeException); 348//% [array release]; 349//%} 350//% 351//%- (void)testInplaceMutation { 352//% const TYPE kValues[] = { VAL1, VAL1, VAL3, VAL3 }; 353//% GPB##NAME##Array *array = 354//% [[GPB##NAME##Array alloc] initWithValues:kValues 355//% NAME$S count:GPBARRAYSIZE(kValues)]; 356//% XCTAssertNotNil(array); 357//% 358//% [array replaceValueAtIndex:1 withValue:VAL2]; 359//% [array replaceValueAtIndex:3 withValue:VAL4]; 360//% XCTAssertEqual(array.count, 4U); 361//% XCTAssertEqual([array valueAtIndex:0], VAL1); 362//% XCTAssertEqual([array valueAtIndex:1], VAL2); 363//% XCTAssertEqual([array valueAtIndex:2], VAL3); 364//% XCTAssertEqual([array valueAtIndex:3], VAL4); 365//% 366//% XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:VAL4], 367//% NSException, NSRangeException); 368//% 369//% [array exchangeValueAtIndex:1 withValueAtIndex:3]; 370//% XCTAssertEqual(array.count, 4U); 371//% XCTAssertEqual([array valueAtIndex:0], VAL1); 372//% XCTAssertEqual([array valueAtIndex:1], VAL4); 373//% XCTAssertEqual([array valueAtIndex:2], VAL3); 374//% XCTAssertEqual([array valueAtIndex:3], VAL2); 375//% 376//% [array exchangeValueAtIndex:2 withValueAtIndex:0]; 377//% XCTAssertEqual(array.count, 4U); 378//% XCTAssertEqual([array valueAtIndex:0], VAL3); 379//% XCTAssertEqual([array valueAtIndex:1], VAL4); 380//% XCTAssertEqual([array valueAtIndex:2], VAL1); 381//% XCTAssertEqual([array valueAtIndex:3], VAL2); 382//% 383//% XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], 384//% NSException, NSRangeException); 385//% XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], 386//% NSException, NSRangeException); 387//% [array release]; 388//%} 389//% 390//%- (void)testInternalResizing { 391//% const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 }; 392//% GPB##NAME##Array *array = 393//% [[GPB##NAME##Array alloc] initWithValues:kValues 394//% NAME$S count:GPBARRAYSIZE(kValues)]; 395//% XCTAssertNotNil(array); 396//% 397//% // Add/remove to trigger the intneral buffer to grow/shrink. 398//% for (int i = 0; i < 100; ++i) { 399//% [array addValues:kValues count:GPBARRAYSIZE(kValues)]; 400//% } 401//% XCTAssertEqual(array.count, 404U); 402//% for (int i = 0; i < 100; ++i) { 403//% [array removeValueAtIndex:(i * 2)]; 404//% } 405//% XCTAssertEqual(array.count, 304U); 406//% for (int i = 0; i < 100; ++i) { 407//% [array insertValue:VAL4 atIndex:(i * 3)]; 408//% } 409//% XCTAssertEqual(array.count, 404U); 410//% [array removeAll]; 411//% XCTAssertEqual(array.count, 0U); 412//% [array release]; 413//%} 414//% 415//%@end 416//% 417//%PDDM-EXPAND ARRAY_TESTS(Int32, int32_t, 1, 2, 3, 4) 418// This block of code is generated, do not edit it directly. 419 420#pragma mark - Int32 421 422@interface GPBInt32ArrayTests : XCTestCase 423@end 424 425@implementation GPBInt32ArrayTests 426 427- (void)testEmpty { 428 GPBInt32Array *array = [[GPBInt32Array alloc] init]; 429 XCTAssertNotNil(array); 430 XCTAssertEqual(array.count, 0U); 431 XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); 432 [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 433 #pragma unused(value, idx, stop) 434 XCTFail(@"Shouldn't get here!"); 435 }]; 436 [array enumerateValuesWithOptions:NSEnumerationReverse 437 usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 438 #pragma unused(value, idx, stop) 439 XCTFail(@"Shouldn't get here!"); 440 }]; 441 [array release]; 442} 443 444- (void)testOne { 445 GPBInt32Array *array = [GPBInt32Array arrayWithValue:1]; 446 XCTAssertNotNil(array); 447 XCTAssertEqual(array.count, 1U); 448 XCTAssertEqual([array valueAtIndex:0], 1); 449 XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); 450 [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 451 XCTAssertEqual(idx, 0U); 452 XCTAssertEqual(value, 1); 453 XCTAssertNotEqual(stop, NULL); 454 }]; 455 [array enumerateValuesWithOptions:NSEnumerationReverse 456 usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 457 XCTAssertEqual(idx, 0U); 458 XCTAssertEqual(value, 1); 459 XCTAssertNotEqual(stop, NULL); 460 }]; 461} 462 463- (void)testBasics { 464 static const int32_t kValues[] = { 1, 2, 3, 4 }; 465 GPBInt32Array *array = 466 [[GPBInt32Array alloc] initWithValues:kValues 467 count:GPBARRAYSIZE(kValues)]; 468 XCTAssertNotNil(array); 469 XCTAssertEqual(array.count, 4U); 470 XCTAssertEqual([array valueAtIndex:0], 1); 471 XCTAssertEqual([array valueAtIndex:1], 2); 472 XCTAssertEqual([array valueAtIndex:2], 3); 473 XCTAssertEqual([array valueAtIndex:3], 4); 474 XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); 475 __block NSUInteger idx2 = 0; 476 [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 477 XCTAssertEqual(idx, idx2); 478 XCTAssertEqual(value, kValues[idx]); 479 XCTAssertNotEqual(stop, NULL); 480 ++idx2; 481 }]; 482 idx2 = 0; 483 [array enumerateValuesWithOptions:NSEnumerationReverse 484 usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 485 XCTAssertEqual(idx, (3 - idx2)); 486 XCTAssertEqual(value, kValues[idx]); 487 XCTAssertNotEqual(stop, NULL); 488 ++idx2; 489 }]; 490 // Stopping the enumeration. 491 idx2 = 0; 492 [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 493 XCTAssertEqual(idx, idx2); 494 XCTAssertEqual(value, kValues[idx]); 495 XCTAssertNotEqual(stop, NULL); 496 if (idx2 == 1) *stop = YES; 497 XCTAssertNotEqual(idx, 2U); 498 XCTAssertNotEqual(idx, 3U); 499 ++idx2; 500 }]; 501 idx2 = 0; 502 [array enumerateValuesWithOptions:NSEnumerationReverse 503 usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 504 XCTAssertEqual(idx, (3 - idx2)); 505 XCTAssertEqual(value, kValues[idx]); 506 XCTAssertNotEqual(stop, NULL); 507 if (idx2 == 1) *stop = YES; 508 XCTAssertNotEqual(idx, 1U); 509 XCTAssertNotEqual(idx, 0U); 510 ++idx2; 511 }]; 512 [array release]; 513} 514 515- (void)testEquality { 516 const int32_t kValues1[] = { 1, 2, 3 }; 517 const int32_t kValues2[] = { 1, 4, 3 }; 518 const int32_t kValues3[] = { 1, 2, 3, 4 }; 519 GPBInt32Array *array1 = 520 [[GPBInt32Array alloc] initWithValues:kValues1 521 count:GPBARRAYSIZE(kValues1)]; 522 XCTAssertNotNil(array1); 523 GPBInt32Array *array1prime = 524 [[GPBInt32Array alloc] initWithValues:kValues1 525 count:GPBARRAYSIZE(kValues1)]; 526 XCTAssertNotNil(array1prime); 527 GPBInt32Array *array2 = 528 [[GPBInt32Array alloc] initWithValues:kValues2 529 count:GPBARRAYSIZE(kValues2)]; 530 XCTAssertNotNil(array2); 531 GPBInt32Array *array3 = 532 [[GPBInt32Array alloc] initWithValues:kValues3 533 count:GPBARRAYSIZE(kValues3)]; 534 XCTAssertNotNil(array3); 535 536 // 1/1Prime should be different objects, but equal. 537 XCTAssertNotEqual(array1, array1prime); 538 XCTAssertEqualObjects(array1, array1prime); 539 // Equal, so they must have same hash. 540 XCTAssertEqual([array1 hash], [array1prime hash]); 541 542 // 1/2/3 shouldn't be equal. 543 XCTAssertNotEqualObjects(array1, array2); 544 XCTAssertNotEqualObjects(array1, array3); 545 XCTAssertNotEqualObjects(array2, array3); 546 547 [array1 release]; 548 [array1prime release]; 549 [array2 release]; 550 [array3 release]; 551} 552 553- (void)testCopy { 554 const int32_t kValues[] = { 1, 2, 3, 4 }; 555 GPBInt32Array *array = 556 [[GPBInt32Array alloc] initWithValues:kValues 557 count:GPBARRAYSIZE(kValues)]; 558 XCTAssertNotNil(array); 559 560 GPBInt32Array *array2 = [array copy]; 561 XCTAssertNotNil(array2); 562 563 // Should be new object but equal. 564 XCTAssertNotEqual(array, array2); 565 XCTAssertEqualObjects(array, array2); 566 [array2 release]; 567 [array release]; 568} 569 570- (void)testArrayFromArray { 571 const int32_t kValues[] = { 1, 2, 3, 4 }; 572 GPBInt32Array *array = 573 [[GPBInt32Array alloc] initWithValues:kValues 574 count:GPBARRAYSIZE(kValues)]; 575 XCTAssertNotNil(array); 576 577 GPBInt32Array *array2 = [GPBInt32Array arrayWithValueArray:array]; 578 XCTAssertNotNil(array2); 579 580 // Should be new pointer, but equal objects. 581 XCTAssertNotEqual(array, array2); 582 XCTAssertEqualObjects(array, array2); 583 [array release]; 584} 585 586- (void)testAdds { 587 GPBInt32Array *array = [GPBInt32Array array]; 588 XCTAssertNotNil(array); 589 590 XCTAssertEqual(array.count, 0U); 591 [array addValue:1]; 592 XCTAssertEqual(array.count, 1U); 593 594 const int32_t kValues1[] = { 2, 3 }; 595 [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; 596 XCTAssertEqual(array.count, 3U); 597 598 const int32_t kValues2[] = { 4, 1 }; 599 GPBInt32Array *array2 = 600 [[GPBInt32Array alloc] initWithValues:kValues2 601 count:GPBARRAYSIZE(kValues2)]; 602 XCTAssertNotNil(array2); 603 [array addValuesFromArray:array2]; 604 XCTAssertEqual(array.count, 5U); 605 606 XCTAssertEqual([array valueAtIndex:0], 1); 607 XCTAssertEqual([array valueAtIndex:1], 2); 608 XCTAssertEqual([array valueAtIndex:2], 3); 609 XCTAssertEqual([array valueAtIndex:3], 4); 610 XCTAssertEqual([array valueAtIndex:4], 1); 611 [array2 release]; 612} 613 614- (void)testInsert { 615 const int32_t kValues[] = { 1, 2, 3 }; 616 GPBInt32Array *array = 617 [[GPBInt32Array alloc] initWithValues:kValues 618 count:GPBARRAYSIZE(kValues)]; 619 XCTAssertNotNil(array); 620 XCTAssertEqual(array.count, 3U); 621 622 // First 623 [array insertValue:4 atIndex:0]; 624 XCTAssertEqual(array.count, 4U); 625 626 // Middle 627 [array insertValue:4 atIndex:2]; 628 XCTAssertEqual(array.count, 5U); 629 630 // End 631 [array insertValue:4 atIndex:5]; 632 XCTAssertEqual(array.count, 6U); 633 634 // Too far. 635 XCTAssertThrowsSpecificNamed([array insertValue:4 atIndex:7], 636 NSException, NSRangeException); 637 638 XCTAssertEqual([array valueAtIndex:0], 4); 639 XCTAssertEqual([array valueAtIndex:1], 1); 640 XCTAssertEqual([array valueAtIndex:2], 4); 641 XCTAssertEqual([array valueAtIndex:3], 2); 642 XCTAssertEqual([array valueAtIndex:4], 3); 643 XCTAssertEqual([array valueAtIndex:5], 4); 644 [array release]; 645} 646 647- (void)testRemove { 648 const int32_t kValues[] = { 4, 1, 2, 4, 3, 4 }; 649 GPBInt32Array *array = 650 [[GPBInt32Array alloc] initWithValues:kValues 651 count:GPBARRAYSIZE(kValues)]; 652 XCTAssertNotNil(array); 653 XCTAssertEqual(array.count, 6U); 654 655 // First 656 [array removeValueAtIndex:0]; 657 XCTAssertEqual(array.count, 5U); 658 XCTAssertEqual([array valueAtIndex:0], 1); 659 660 // Middle 661 [array removeValueAtIndex:2]; 662 XCTAssertEqual(array.count, 4U); 663 XCTAssertEqual([array valueAtIndex:2], 3); 664 665 // End 666 [array removeValueAtIndex:3]; 667 XCTAssertEqual(array.count, 3U); 668 669 XCTAssertEqual([array valueAtIndex:0], 1); 670 XCTAssertEqual([array valueAtIndex:1], 2); 671 XCTAssertEqual([array valueAtIndex:2], 3); 672 673 // Too far. 674 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], 675 NSException, NSRangeException); 676 677 [array removeAll]; 678 XCTAssertEqual(array.count, 0U); 679 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], 680 NSException, NSRangeException); 681 [array release]; 682} 683 684- (void)testInplaceMutation { 685 const int32_t kValues[] = { 1, 1, 3, 3 }; 686 GPBInt32Array *array = 687 [[GPBInt32Array alloc] initWithValues:kValues 688 count:GPBARRAYSIZE(kValues)]; 689 XCTAssertNotNil(array); 690 691 [array replaceValueAtIndex:1 withValue:2]; 692 [array replaceValueAtIndex:3 withValue:4]; 693 XCTAssertEqual(array.count, 4U); 694 XCTAssertEqual([array valueAtIndex:0], 1); 695 XCTAssertEqual([array valueAtIndex:1], 2); 696 XCTAssertEqual([array valueAtIndex:2], 3); 697 XCTAssertEqual([array valueAtIndex:3], 4); 698 699 XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:4], 700 NSException, NSRangeException); 701 702 [array exchangeValueAtIndex:1 withValueAtIndex:3]; 703 XCTAssertEqual(array.count, 4U); 704 XCTAssertEqual([array valueAtIndex:0], 1); 705 XCTAssertEqual([array valueAtIndex:1], 4); 706 XCTAssertEqual([array valueAtIndex:2], 3); 707 XCTAssertEqual([array valueAtIndex:3], 2); 708 709 [array exchangeValueAtIndex:2 withValueAtIndex:0]; 710 XCTAssertEqual(array.count, 4U); 711 XCTAssertEqual([array valueAtIndex:0], 3); 712 XCTAssertEqual([array valueAtIndex:1], 4); 713 XCTAssertEqual([array valueAtIndex:2], 1); 714 XCTAssertEqual([array valueAtIndex:3], 2); 715 716 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], 717 NSException, NSRangeException); 718 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], 719 NSException, NSRangeException); 720 [array release]; 721} 722 723- (void)testInternalResizing { 724 const int32_t kValues[] = { 1, 2, 3, 4 }; 725 GPBInt32Array *array = 726 [[GPBInt32Array alloc] initWithValues:kValues 727 count:GPBARRAYSIZE(kValues)]; 728 XCTAssertNotNil(array); 729 730 // Add/remove to trigger the intneral buffer to grow/shrink. 731 for (int i = 0; i < 100; ++i) { 732 [array addValues:kValues count:GPBARRAYSIZE(kValues)]; 733 } 734 XCTAssertEqual(array.count, 404U); 735 for (int i = 0; i < 100; ++i) { 736 [array removeValueAtIndex:(i * 2)]; 737 } 738 XCTAssertEqual(array.count, 304U); 739 for (int i = 0; i < 100; ++i) { 740 [array insertValue:4 atIndex:(i * 3)]; 741 } 742 XCTAssertEqual(array.count, 404U); 743 [array removeAll]; 744 XCTAssertEqual(array.count, 0U); 745 [array release]; 746} 747 748@end 749 750//%PDDM-EXPAND ARRAY_TESTS(UInt32, uint32_t, 11U, 12U, 13U, 14U) 751// This block of code is generated, do not edit it directly. 752 753#pragma mark - UInt32 754 755@interface GPBUInt32ArrayTests : XCTestCase 756@end 757 758@implementation GPBUInt32ArrayTests 759 760- (void)testEmpty { 761 GPBUInt32Array *array = [[GPBUInt32Array alloc] init]; 762 XCTAssertNotNil(array); 763 XCTAssertEqual(array.count, 0U); 764 XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); 765 [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { 766 #pragma unused(value, idx, stop) 767 XCTFail(@"Shouldn't get here!"); 768 }]; 769 [array enumerateValuesWithOptions:NSEnumerationReverse 770 usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { 771 #pragma unused(value, idx, stop) 772 XCTFail(@"Shouldn't get here!"); 773 }]; 774 [array release]; 775} 776 777- (void)testOne { 778 GPBUInt32Array *array = [GPBUInt32Array arrayWithValue:11U]; 779 XCTAssertNotNil(array); 780 XCTAssertEqual(array.count, 1U); 781 XCTAssertEqual([array valueAtIndex:0], 11U); 782 XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); 783 [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { 784 XCTAssertEqual(idx, 0U); 785 XCTAssertEqual(value, 11U); 786 XCTAssertNotEqual(stop, NULL); 787 }]; 788 [array enumerateValuesWithOptions:NSEnumerationReverse 789 usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { 790 XCTAssertEqual(idx, 0U); 791 XCTAssertEqual(value, 11U); 792 XCTAssertNotEqual(stop, NULL); 793 }]; 794} 795 796- (void)testBasics { 797 static const uint32_t kValues[] = { 11U, 12U, 13U, 14U }; 798 GPBUInt32Array *array = 799 [[GPBUInt32Array alloc] initWithValues:kValues 800 count:GPBARRAYSIZE(kValues)]; 801 XCTAssertNotNil(array); 802 XCTAssertEqual(array.count, 4U); 803 XCTAssertEqual([array valueAtIndex:0], 11U); 804 XCTAssertEqual([array valueAtIndex:1], 12U); 805 XCTAssertEqual([array valueAtIndex:2], 13U); 806 XCTAssertEqual([array valueAtIndex:3], 14U); 807 XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); 808 __block NSUInteger idx2 = 0; 809 [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { 810 XCTAssertEqual(idx, idx2); 811 XCTAssertEqual(value, kValues[idx]); 812 XCTAssertNotEqual(stop, NULL); 813 ++idx2; 814 }]; 815 idx2 = 0; 816 [array enumerateValuesWithOptions:NSEnumerationReverse 817 usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { 818 XCTAssertEqual(idx, (3 - idx2)); 819 XCTAssertEqual(value, kValues[idx]); 820 XCTAssertNotEqual(stop, NULL); 821 ++idx2; 822 }]; 823 // Stopping the enumeration. 824 idx2 = 0; 825 [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { 826 XCTAssertEqual(idx, idx2); 827 XCTAssertEqual(value, kValues[idx]); 828 XCTAssertNotEqual(stop, NULL); 829 if (idx2 == 1) *stop = YES; 830 XCTAssertNotEqual(idx, 2U); 831 XCTAssertNotEqual(idx, 3U); 832 ++idx2; 833 }]; 834 idx2 = 0; 835 [array enumerateValuesWithOptions:NSEnumerationReverse 836 usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { 837 XCTAssertEqual(idx, (3 - idx2)); 838 XCTAssertEqual(value, kValues[idx]); 839 XCTAssertNotEqual(stop, NULL); 840 if (idx2 == 1) *stop = YES; 841 XCTAssertNotEqual(idx, 1U); 842 XCTAssertNotEqual(idx, 0U); 843 ++idx2; 844 }]; 845 [array release]; 846} 847 848- (void)testEquality { 849 const uint32_t kValues1[] = { 11U, 12U, 13U }; 850 const uint32_t kValues2[] = { 11U, 14U, 13U }; 851 const uint32_t kValues3[] = { 11U, 12U, 13U, 14U }; 852 GPBUInt32Array *array1 = 853 [[GPBUInt32Array alloc] initWithValues:kValues1 854 count:GPBARRAYSIZE(kValues1)]; 855 XCTAssertNotNil(array1); 856 GPBUInt32Array *array1prime = 857 [[GPBUInt32Array alloc] initWithValues:kValues1 858 count:GPBARRAYSIZE(kValues1)]; 859 XCTAssertNotNil(array1prime); 860 GPBUInt32Array *array2 = 861 [[GPBUInt32Array alloc] initWithValues:kValues2 862 count:GPBARRAYSIZE(kValues2)]; 863 XCTAssertNotNil(array2); 864 GPBUInt32Array *array3 = 865 [[GPBUInt32Array alloc] initWithValues:kValues3 866 count:GPBARRAYSIZE(kValues3)]; 867 XCTAssertNotNil(array3); 868 869 // 1/1Prime should be different objects, but equal. 870 XCTAssertNotEqual(array1, array1prime); 871 XCTAssertEqualObjects(array1, array1prime); 872 // Equal, so they must have same hash. 873 XCTAssertEqual([array1 hash], [array1prime hash]); 874 875 // 1/2/3 shouldn't be equal. 876 XCTAssertNotEqualObjects(array1, array2); 877 XCTAssertNotEqualObjects(array1, array3); 878 XCTAssertNotEqualObjects(array2, array3); 879 880 [array1 release]; 881 [array1prime release]; 882 [array2 release]; 883 [array3 release]; 884} 885 886- (void)testCopy { 887 const uint32_t kValues[] = { 11U, 12U, 13U, 14U }; 888 GPBUInt32Array *array = 889 [[GPBUInt32Array alloc] initWithValues:kValues 890 count:GPBARRAYSIZE(kValues)]; 891 XCTAssertNotNil(array); 892 893 GPBUInt32Array *array2 = [array copy]; 894 XCTAssertNotNil(array2); 895 896 // Should be new object but equal. 897 XCTAssertNotEqual(array, array2); 898 XCTAssertEqualObjects(array, array2); 899 [array2 release]; 900 [array release]; 901} 902 903- (void)testArrayFromArray { 904 const uint32_t kValues[] = { 11U, 12U, 13U, 14U }; 905 GPBUInt32Array *array = 906 [[GPBUInt32Array alloc] initWithValues:kValues 907 count:GPBARRAYSIZE(kValues)]; 908 XCTAssertNotNil(array); 909 910 GPBUInt32Array *array2 = [GPBUInt32Array arrayWithValueArray:array]; 911 XCTAssertNotNil(array2); 912 913 // Should be new pointer, but equal objects. 914 XCTAssertNotEqual(array, array2); 915 XCTAssertEqualObjects(array, array2); 916 [array release]; 917} 918 919- (void)testAdds { 920 GPBUInt32Array *array = [GPBUInt32Array array]; 921 XCTAssertNotNil(array); 922 923 XCTAssertEqual(array.count, 0U); 924 [array addValue:11U]; 925 XCTAssertEqual(array.count, 1U); 926 927 const uint32_t kValues1[] = { 12U, 13U }; 928 [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; 929 XCTAssertEqual(array.count, 3U); 930 931 const uint32_t kValues2[] = { 14U, 11U }; 932 GPBUInt32Array *array2 = 933 [[GPBUInt32Array alloc] initWithValues:kValues2 934 count:GPBARRAYSIZE(kValues2)]; 935 XCTAssertNotNil(array2); 936 [array addValuesFromArray:array2]; 937 XCTAssertEqual(array.count, 5U); 938 939 XCTAssertEqual([array valueAtIndex:0], 11U); 940 XCTAssertEqual([array valueAtIndex:1], 12U); 941 XCTAssertEqual([array valueAtIndex:2], 13U); 942 XCTAssertEqual([array valueAtIndex:3], 14U); 943 XCTAssertEqual([array valueAtIndex:4], 11U); 944 [array2 release]; 945} 946 947- (void)testInsert { 948 const uint32_t kValues[] = { 11U, 12U, 13U }; 949 GPBUInt32Array *array = 950 [[GPBUInt32Array alloc] initWithValues:kValues 951 count:GPBARRAYSIZE(kValues)]; 952 XCTAssertNotNil(array); 953 XCTAssertEqual(array.count, 3U); 954 955 // First 956 [array insertValue:14U atIndex:0]; 957 XCTAssertEqual(array.count, 4U); 958 959 // Middle 960 [array insertValue:14U atIndex:2]; 961 XCTAssertEqual(array.count, 5U); 962 963 // End 964 [array insertValue:14U atIndex:5]; 965 XCTAssertEqual(array.count, 6U); 966 967 // Too far. 968 XCTAssertThrowsSpecificNamed([array insertValue:14U atIndex:7], 969 NSException, NSRangeException); 970 971 XCTAssertEqual([array valueAtIndex:0], 14U); 972 XCTAssertEqual([array valueAtIndex:1], 11U); 973 XCTAssertEqual([array valueAtIndex:2], 14U); 974 XCTAssertEqual([array valueAtIndex:3], 12U); 975 XCTAssertEqual([array valueAtIndex:4], 13U); 976 XCTAssertEqual([array valueAtIndex:5], 14U); 977 [array release]; 978} 979 980- (void)testRemove { 981 const uint32_t kValues[] = { 14U, 11U, 12U, 14U, 13U, 14U }; 982 GPBUInt32Array *array = 983 [[GPBUInt32Array alloc] initWithValues:kValues 984 count:GPBARRAYSIZE(kValues)]; 985 XCTAssertNotNil(array); 986 XCTAssertEqual(array.count, 6U); 987 988 // First 989 [array removeValueAtIndex:0]; 990 XCTAssertEqual(array.count, 5U); 991 XCTAssertEqual([array valueAtIndex:0], 11U); 992 993 // Middle 994 [array removeValueAtIndex:2]; 995 XCTAssertEqual(array.count, 4U); 996 XCTAssertEqual([array valueAtIndex:2], 13U); 997 998 // End 999 [array removeValueAtIndex:3]; 1000 XCTAssertEqual(array.count, 3U); 1001 1002 XCTAssertEqual([array valueAtIndex:0], 11U); 1003 XCTAssertEqual([array valueAtIndex:1], 12U); 1004 XCTAssertEqual([array valueAtIndex:2], 13U); 1005 1006 // Too far. 1007 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], 1008 NSException, NSRangeException); 1009 1010 [array removeAll]; 1011 XCTAssertEqual(array.count, 0U); 1012 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], 1013 NSException, NSRangeException); 1014 [array release]; 1015} 1016 1017- (void)testInplaceMutation { 1018 const uint32_t kValues[] = { 11U, 11U, 13U, 13U }; 1019 GPBUInt32Array *array = 1020 [[GPBUInt32Array alloc] initWithValues:kValues 1021 count:GPBARRAYSIZE(kValues)]; 1022 XCTAssertNotNil(array); 1023 1024 [array replaceValueAtIndex:1 withValue:12U]; 1025 [array replaceValueAtIndex:3 withValue:14U]; 1026 XCTAssertEqual(array.count, 4U); 1027 XCTAssertEqual([array valueAtIndex:0], 11U); 1028 XCTAssertEqual([array valueAtIndex:1], 12U); 1029 XCTAssertEqual([array valueAtIndex:2], 13U); 1030 XCTAssertEqual([array valueAtIndex:3], 14U); 1031 1032 XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:14U], 1033 NSException, NSRangeException); 1034 1035 [array exchangeValueAtIndex:1 withValueAtIndex:3]; 1036 XCTAssertEqual(array.count, 4U); 1037 XCTAssertEqual([array valueAtIndex:0], 11U); 1038 XCTAssertEqual([array valueAtIndex:1], 14U); 1039 XCTAssertEqual([array valueAtIndex:2], 13U); 1040 XCTAssertEqual([array valueAtIndex:3], 12U); 1041 1042 [array exchangeValueAtIndex:2 withValueAtIndex:0]; 1043 XCTAssertEqual(array.count, 4U); 1044 XCTAssertEqual([array valueAtIndex:0], 13U); 1045 XCTAssertEqual([array valueAtIndex:1], 14U); 1046 XCTAssertEqual([array valueAtIndex:2], 11U); 1047 XCTAssertEqual([array valueAtIndex:3], 12U); 1048 1049 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], 1050 NSException, NSRangeException); 1051 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], 1052 NSException, NSRangeException); 1053 [array release]; 1054} 1055 1056- (void)testInternalResizing { 1057 const uint32_t kValues[] = { 11U, 12U, 13U, 14U }; 1058 GPBUInt32Array *array = 1059 [[GPBUInt32Array alloc] initWithValues:kValues 1060 count:GPBARRAYSIZE(kValues)]; 1061 XCTAssertNotNil(array); 1062 1063 // Add/remove to trigger the intneral buffer to grow/shrink. 1064 for (int i = 0; i < 100; ++i) { 1065 [array addValues:kValues count:GPBARRAYSIZE(kValues)]; 1066 } 1067 XCTAssertEqual(array.count, 404U); 1068 for (int i = 0; i < 100; ++i) { 1069 [array removeValueAtIndex:(i * 2)]; 1070 } 1071 XCTAssertEqual(array.count, 304U); 1072 for (int i = 0; i < 100; ++i) { 1073 [array insertValue:14U atIndex:(i * 3)]; 1074 } 1075 XCTAssertEqual(array.count, 404U); 1076 [array removeAll]; 1077 XCTAssertEqual(array.count, 0U); 1078 [array release]; 1079} 1080 1081@end 1082 1083//%PDDM-EXPAND ARRAY_TESTS(Int64, int64_t, 31LL, 32LL, 33LL, 34LL) 1084// This block of code is generated, do not edit it directly. 1085 1086#pragma mark - Int64 1087 1088@interface GPBInt64ArrayTests : XCTestCase 1089@end 1090 1091@implementation GPBInt64ArrayTests 1092 1093- (void)testEmpty { 1094 GPBInt64Array *array = [[GPBInt64Array alloc] init]; 1095 XCTAssertNotNil(array); 1096 XCTAssertEqual(array.count, 0U); 1097 XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); 1098 [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { 1099 #pragma unused(value, idx, stop) 1100 XCTFail(@"Shouldn't get here!"); 1101 }]; 1102 [array enumerateValuesWithOptions:NSEnumerationReverse 1103 usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { 1104 #pragma unused(value, idx, stop) 1105 XCTFail(@"Shouldn't get here!"); 1106 }]; 1107 [array release]; 1108} 1109 1110- (void)testOne { 1111 GPBInt64Array *array = [GPBInt64Array arrayWithValue:31LL]; 1112 XCTAssertNotNil(array); 1113 XCTAssertEqual(array.count, 1U); 1114 XCTAssertEqual([array valueAtIndex:0], 31LL); 1115 XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); 1116 [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { 1117 XCTAssertEqual(idx, 0U); 1118 XCTAssertEqual(value, 31LL); 1119 XCTAssertNotEqual(stop, NULL); 1120 }]; 1121 [array enumerateValuesWithOptions:NSEnumerationReverse 1122 usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { 1123 XCTAssertEqual(idx, 0U); 1124 XCTAssertEqual(value, 31LL); 1125 XCTAssertNotEqual(stop, NULL); 1126 }]; 1127} 1128 1129- (void)testBasics { 1130 static const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL }; 1131 GPBInt64Array *array = 1132 [[GPBInt64Array alloc] initWithValues:kValues 1133 count:GPBARRAYSIZE(kValues)]; 1134 XCTAssertNotNil(array); 1135 XCTAssertEqual(array.count, 4U); 1136 XCTAssertEqual([array valueAtIndex:0], 31LL); 1137 XCTAssertEqual([array valueAtIndex:1], 32LL); 1138 XCTAssertEqual([array valueAtIndex:2], 33LL); 1139 XCTAssertEqual([array valueAtIndex:3], 34LL); 1140 XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); 1141 __block NSUInteger idx2 = 0; 1142 [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { 1143 XCTAssertEqual(idx, idx2); 1144 XCTAssertEqual(value, kValues[idx]); 1145 XCTAssertNotEqual(stop, NULL); 1146 ++idx2; 1147 }]; 1148 idx2 = 0; 1149 [array enumerateValuesWithOptions:NSEnumerationReverse 1150 usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { 1151 XCTAssertEqual(idx, (3 - idx2)); 1152 XCTAssertEqual(value, kValues[idx]); 1153 XCTAssertNotEqual(stop, NULL); 1154 ++idx2; 1155 }]; 1156 // Stopping the enumeration. 1157 idx2 = 0; 1158 [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { 1159 XCTAssertEqual(idx, idx2); 1160 XCTAssertEqual(value, kValues[idx]); 1161 XCTAssertNotEqual(stop, NULL); 1162 if (idx2 == 1) *stop = YES; 1163 XCTAssertNotEqual(idx, 2U); 1164 XCTAssertNotEqual(idx, 3U); 1165 ++idx2; 1166 }]; 1167 idx2 = 0; 1168 [array enumerateValuesWithOptions:NSEnumerationReverse 1169 usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { 1170 XCTAssertEqual(idx, (3 - idx2)); 1171 XCTAssertEqual(value, kValues[idx]); 1172 XCTAssertNotEqual(stop, NULL); 1173 if (idx2 == 1) *stop = YES; 1174 XCTAssertNotEqual(idx, 1U); 1175 XCTAssertNotEqual(idx, 0U); 1176 ++idx2; 1177 }]; 1178 [array release]; 1179} 1180 1181- (void)testEquality { 1182 const int64_t kValues1[] = { 31LL, 32LL, 33LL }; 1183 const int64_t kValues2[] = { 31LL, 34LL, 33LL }; 1184 const int64_t kValues3[] = { 31LL, 32LL, 33LL, 34LL }; 1185 GPBInt64Array *array1 = 1186 [[GPBInt64Array alloc] initWithValues:kValues1 1187 count:GPBARRAYSIZE(kValues1)]; 1188 XCTAssertNotNil(array1); 1189 GPBInt64Array *array1prime = 1190 [[GPBInt64Array alloc] initWithValues:kValues1 1191 count:GPBARRAYSIZE(kValues1)]; 1192 XCTAssertNotNil(array1prime); 1193 GPBInt64Array *array2 = 1194 [[GPBInt64Array alloc] initWithValues:kValues2 1195 count:GPBARRAYSIZE(kValues2)]; 1196 XCTAssertNotNil(array2); 1197 GPBInt64Array *array3 = 1198 [[GPBInt64Array alloc] initWithValues:kValues3 1199 count:GPBARRAYSIZE(kValues3)]; 1200 XCTAssertNotNil(array3); 1201 1202 // 1/1Prime should be different objects, but equal. 1203 XCTAssertNotEqual(array1, array1prime); 1204 XCTAssertEqualObjects(array1, array1prime); 1205 // Equal, so they must have same hash. 1206 XCTAssertEqual([array1 hash], [array1prime hash]); 1207 1208 // 1/2/3 shouldn't be equal. 1209 XCTAssertNotEqualObjects(array1, array2); 1210 XCTAssertNotEqualObjects(array1, array3); 1211 XCTAssertNotEqualObjects(array2, array3); 1212 1213 [array1 release]; 1214 [array1prime release]; 1215 [array2 release]; 1216 [array3 release]; 1217} 1218 1219- (void)testCopy { 1220 const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL }; 1221 GPBInt64Array *array = 1222 [[GPBInt64Array alloc] initWithValues:kValues 1223 count:GPBARRAYSIZE(kValues)]; 1224 XCTAssertNotNil(array); 1225 1226 GPBInt64Array *array2 = [array copy]; 1227 XCTAssertNotNil(array2); 1228 1229 // Should be new object but equal. 1230 XCTAssertNotEqual(array, array2); 1231 XCTAssertEqualObjects(array, array2); 1232 [array2 release]; 1233 [array release]; 1234} 1235 1236- (void)testArrayFromArray { 1237 const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL }; 1238 GPBInt64Array *array = 1239 [[GPBInt64Array alloc] initWithValues:kValues 1240 count:GPBARRAYSIZE(kValues)]; 1241 XCTAssertNotNil(array); 1242 1243 GPBInt64Array *array2 = [GPBInt64Array arrayWithValueArray:array]; 1244 XCTAssertNotNil(array2); 1245 1246 // Should be new pointer, but equal objects. 1247 XCTAssertNotEqual(array, array2); 1248 XCTAssertEqualObjects(array, array2); 1249 [array release]; 1250} 1251 1252- (void)testAdds { 1253 GPBInt64Array *array = [GPBInt64Array array]; 1254 XCTAssertNotNil(array); 1255 1256 XCTAssertEqual(array.count, 0U); 1257 [array addValue:31LL]; 1258 XCTAssertEqual(array.count, 1U); 1259 1260 const int64_t kValues1[] = { 32LL, 33LL }; 1261 [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; 1262 XCTAssertEqual(array.count, 3U); 1263 1264 const int64_t kValues2[] = { 34LL, 31LL }; 1265 GPBInt64Array *array2 = 1266 [[GPBInt64Array alloc] initWithValues:kValues2 1267 count:GPBARRAYSIZE(kValues2)]; 1268 XCTAssertNotNil(array2); 1269 [array addValuesFromArray:array2]; 1270 XCTAssertEqual(array.count, 5U); 1271 1272 XCTAssertEqual([array valueAtIndex:0], 31LL); 1273 XCTAssertEqual([array valueAtIndex:1], 32LL); 1274 XCTAssertEqual([array valueAtIndex:2], 33LL); 1275 XCTAssertEqual([array valueAtIndex:3], 34LL); 1276 XCTAssertEqual([array valueAtIndex:4], 31LL); 1277 [array2 release]; 1278} 1279 1280- (void)testInsert { 1281 const int64_t kValues[] = { 31LL, 32LL, 33LL }; 1282 GPBInt64Array *array = 1283 [[GPBInt64Array alloc] initWithValues:kValues 1284 count:GPBARRAYSIZE(kValues)]; 1285 XCTAssertNotNil(array); 1286 XCTAssertEqual(array.count, 3U); 1287 1288 // First 1289 [array insertValue:34LL atIndex:0]; 1290 XCTAssertEqual(array.count, 4U); 1291 1292 // Middle 1293 [array insertValue:34LL atIndex:2]; 1294 XCTAssertEqual(array.count, 5U); 1295 1296 // End 1297 [array insertValue:34LL atIndex:5]; 1298 XCTAssertEqual(array.count, 6U); 1299 1300 // Too far. 1301 XCTAssertThrowsSpecificNamed([array insertValue:34LL atIndex:7], 1302 NSException, NSRangeException); 1303 1304 XCTAssertEqual([array valueAtIndex:0], 34LL); 1305 XCTAssertEqual([array valueAtIndex:1], 31LL); 1306 XCTAssertEqual([array valueAtIndex:2], 34LL); 1307 XCTAssertEqual([array valueAtIndex:3], 32LL); 1308 XCTAssertEqual([array valueAtIndex:4], 33LL); 1309 XCTAssertEqual([array valueAtIndex:5], 34LL); 1310 [array release]; 1311} 1312 1313- (void)testRemove { 1314 const int64_t kValues[] = { 34LL, 31LL, 32LL, 34LL, 33LL, 34LL }; 1315 GPBInt64Array *array = 1316 [[GPBInt64Array alloc] initWithValues:kValues 1317 count:GPBARRAYSIZE(kValues)]; 1318 XCTAssertNotNil(array); 1319 XCTAssertEqual(array.count, 6U); 1320 1321 // First 1322 [array removeValueAtIndex:0]; 1323 XCTAssertEqual(array.count, 5U); 1324 XCTAssertEqual([array valueAtIndex:0], 31LL); 1325 1326 // Middle 1327 [array removeValueAtIndex:2]; 1328 XCTAssertEqual(array.count, 4U); 1329 XCTAssertEqual([array valueAtIndex:2], 33LL); 1330 1331 // End 1332 [array removeValueAtIndex:3]; 1333 XCTAssertEqual(array.count, 3U); 1334 1335 XCTAssertEqual([array valueAtIndex:0], 31LL); 1336 XCTAssertEqual([array valueAtIndex:1], 32LL); 1337 XCTAssertEqual([array valueAtIndex:2], 33LL); 1338 1339 // Too far. 1340 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], 1341 NSException, NSRangeException); 1342 1343 [array removeAll]; 1344 XCTAssertEqual(array.count, 0U); 1345 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], 1346 NSException, NSRangeException); 1347 [array release]; 1348} 1349 1350- (void)testInplaceMutation { 1351 const int64_t kValues[] = { 31LL, 31LL, 33LL, 33LL }; 1352 GPBInt64Array *array = 1353 [[GPBInt64Array alloc] initWithValues:kValues 1354 count:GPBARRAYSIZE(kValues)]; 1355 XCTAssertNotNil(array); 1356 1357 [array replaceValueAtIndex:1 withValue:32LL]; 1358 [array replaceValueAtIndex:3 withValue:34LL]; 1359 XCTAssertEqual(array.count, 4U); 1360 XCTAssertEqual([array valueAtIndex:0], 31LL); 1361 XCTAssertEqual([array valueAtIndex:1], 32LL); 1362 XCTAssertEqual([array valueAtIndex:2], 33LL); 1363 XCTAssertEqual([array valueAtIndex:3], 34LL); 1364 1365 XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:34LL], 1366 NSException, NSRangeException); 1367 1368 [array exchangeValueAtIndex:1 withValueAtIndex:3]; 1369 XCTAssertEqual(array.count, 4U); 1370 XCTAssertEqual([array valueAtIndex:0], 31LL); 1371 XCTAssertEqual([array valueAtIndex:1], 34LL); 1372 XCTAssertEqual([array valueAtIndex:2], 33LL); 1373 XCTAssertEqual([array valueAtIndex:3], 32LL); 1374 1375 [array exchangeValueAtIndex:2 withValueAtIndex:0]; 1376 XCTAssertEqual(array.count, 4U); 1377 XCTAssertEqual([array valueAtIndex:0], 33LL); 1378 XCTAssertEqual([array valueAtIndex:1], 34LL); 1379 XCTAssertEqual([array valueAtIndex:2], 31LL); 1380 XCTAssertEqual([array valueAtIndex:3], 32LL); 1381 1382 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], 1383 NSException, NSRangeException); 1384 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], 1385 NSException, NSRangeException); 1386 [array release]; 1387} 1388 1389- (void)testInternalResizing { 1390 const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL }; 1391 GPBInt64Array *array = 1392 [[GPBInt64Array alloc] initWithValues:kValues 1393 count:GPBARRAYSIZE(kValues)]; 1394 XCTAssertNotNil(array); 1395 1396 // Add/remove to trigger the intneral buffer to grow/shrink. 1397 for (int i = 0; i < 100; ++i) { 1398 [array addValues:kValues count:GPBARRAYSIZE(kValues)]; 1399 } 1400 XCTAssertEqual(array.count, 404U); 1401 for (int i = 0; i < 100; ++i) { 1402 [array removeValueAtIndex:(i * 2)]; 1403 } 1404 XCTAssertEqual(array.count, 304U); 1405 for (int i = 0; i < 100; ++i) { 1406 [array insertValue:34LL atIndex:(i * 3)]; 1407 } 1408 XCTAssertEqual(array.count, 404U); 1409 [array removeAll]; 1410 XCTAssertEqual(array.count, 0U); 1411 [array release]; 1412} 1413 1414@end 1415 1416//%PDDM-EXPAND ARRAY_TESTS(UInt64, uint64_t, 41ULL, 42ULL, 43ULL, 44ULL) 1417// This block of code is generated, do not edit it directly. 1418 1419#pragma mark - UInt64 1420 1421@interface GPBUInt64ArrayTests : XCTestCase 1422@end 1423 1424@implementation GPBUInt64ArrayTests 1425 1426- (void)testEmpty { 1427 GPBUInt64Array *array = [[GPBUInt64Array alloc] init]; 1428 XCTAssertNotNil(array); 1429 XCTAssertEqual(array.count, 0U); 1430 XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); 1431 [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { 1432 #pragma unused(value, idx, stop) 1433 XCTFail(@"Shouldn't get here!"); 1434 }]; 1435 [array enumerateValuesWithOptions:NSEnumerationReverse 1436 usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { 1437 #pragma unused(value, idx, stop) 1438 XCTFail(@"Shouldn't get here!"); 1439 }]; 1440 [array release]; 1441} 1442 1443- (void)testOne { 1444 GPBUInt64Array *array = [GPBUInt64Array arrayWithValue:41ULL]; 1445 XCTAssertNotNil(array); 1446 XCTAssertEqual(array.count, 1U); 1447 XCTAssertEqual([array valueAtIndex:0], 41ULL); 1448 XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); 1449 [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { 1450 XCTAssertEqual(idx, 0U); 1451 XCTAssertEqual(value, 41ULL); 1452 XCTAssertNotEqual(stop, NULL); 1453 }]; 1454 [array enumerateValuesWithOptions:NSEnumerationReverse 1455 usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { 1456 XCTAssertEqual(idx, 0U); 1457 XCTAssertEqual(value, 41ULL); 1458 XCTAssertNotEqual(stop, NULL); 1459 }]; 1460} 1461 1462- (void)testBasics { 1463 static const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL }; 1464 GPBUInt64Array *array = 1465 [[GPBUInt64Array alloc] initWithValues:kValues 1466 count:GPBARRAYSIZE(kValues)]; 1467 XCTAssertNotNil(array); 1468 XCTAssertEqual(array.count, 4U); 1469 XCTAssertEqual([array valueAtIndex:0], 41ULL); 1470 XCTAssertEqual([array valueAtIndex:1], 42ULL); 1471 XCTAssertEqual([array valueAtIndex:2], 43ULL); 1472 XCTAssertEqual([array valueAtIndex:3], 44ULL); 1473 XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); 1474 __block NSUInteger idx2 = 0; 1475 [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { 1476 XCTAssertEqual(idx, idx2); 1477 XCTAssertEqual(value, kValues[idx]); 1478 XCTAssertNotEqual(stop, NULL); 1479 ++idx2; 1480 }]; 1481 idx2 = 0; 1482 [array enumerateValuesWithOptions:NSEnumerationReverse 1483 usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { 1484 XCTAssertEqual(idx, (3 - idx2)); 1485 XCTAssertEqual(value, kValues[idx]); 1486 XCTAssertNotEqual(stop, NULL); 1487 ++idx2; 1488 }]; 1489 // Stopping the enumeration. 1490 idx2 = 0; 1491 [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { 1492 XCTAssertEqual(idx, idx2); 1493 XCTAssertEqual(value, kValues[idx]); 1494 XCTAssertNotEqual(stop, NULL); 1495 if (idx2 == 1) *stop = YES; 1496 XCTAssertNotEqual(idx, 2U); 1497 XCTAssertNotEqual(idx, 3U); 1498 ++idx2; 1499 }]; 1500 idx2 = 0; 1501 [array enumerateValuesWithOptions:NSEnumerationReverse 1502 usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { 1503 XCTAssertEqual(idx, (3 - idx2)); 1504 XCTAssertEqual(value, kValues[idx]); 1505 XCTAssertNotEqual(stop, NULL); 1506 if (idx2 == 1) *stop = YES; 1507 XCTAssertNotEqual(idx, 1U); 1508 XCTAssertNotEqual(idx, 0U); 1509 ++idx2; 1510 }]; 1511 [array release]; 1512} 1513 1514- (void)testEquality { 1515 const uint64_t kValues1[] = { 41ULL, 42ULL, 43ULL }; 1516 const uint64_t kValues2[] = { 41ULL, 44ULL, 43ULL }; 1517 const uint64_t kValues3[] = { 41ULL, 42ULL, 43ULL, 44ULL }; 1518 GPBUInt64Array *array1 = 1519 [[GPBUInt64Array alloc] initWithValues:kValues1 1520 count:GPBARRAYSIZE(kValues1)]; 1521 XCTAssertNotNil(array1); 1522 GPBUInt64Array *array1prime = 1523 [[GPBUInt64Array alloc] initWithValues:kValues1 1524 count:GPBARRAYSIZE(kValues1)]; 1525 XCTAssertNotNil(array1prime); 1526 GPBUInt64Array *array2 = 1527 [[GPBUInt64Array alloc] initWithValues:kValues2 1528 count:GPBARRAYSIZE(kValues2)]; 1529 XCTAssertNotNil(array2); 1530 GPBUInt64Array *array3 = 1531 [[GPBUInt64Array alloc] initWithValues:kValues3 1532 count:GPBARRAYSIZE(kValues3)]; 1533 XCTAssertNotNil(array3); 1534 1535 // 1/1Prime should be different objects, but equal. 1536 XCTAssertNotEqual(array1, array1prime); 1537 XCTAssertEqualObjects(array1, array1prime); 1538 // Equal, so they must have same hash. 1539 XCTAssertEqual([array1 hash], [array1prime hash]); 1540 1541 // 1/2/3 shouldn't be equal. 1542 XCTAssertNotEqualObjects(array1, array2); 1543 XCTAssertNotEqualObjects(array1, array3); 1544 XCTAssertNotEqualObjects(array2, array3); 1545 1546 [array1 release]; 1547 [array1prime release]; 1548 [array2 release]; 1549 [array3 release]; 1550} 1551 1552- (void)testCopy { 1553 const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL }; 1554 GPBUInt64Array *array = 1555 [[GPBUInt64Array alloc] initWithValues:kValues 1556 count:GPBARRAYSIZE(kValues)]; 1557 XCTAssertNotNil(array); 1558 1559 GPBUInt64Array *array2 = [array copy]; 1560 XCTAssertNotNil(array2); 1561 1562 // Should be new object but equal. 1563 XCTAssertNotEqual(array, array2); 1564 XCTAssertEqualObjects(array, array2); 1565 [array2 release]; 1566 [array release]; 1567} 1568 1569- (void)testArrayFromArray { 1570 const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL }; 1571 GPBUInt64Array *array = 1572 [[GPBUInt64Array alloc] initWithValues:kValues 1573 count:GPBARRAYSIZE(kValues)]; 1574 XCTAssertNotNil(array); 1575 1576 GPBUInt64Array *array2 = [GPBUInt64Array arrayWithValueArray:array]; 1577 XCTAssertNotNil(array2); 1578 1579 // Should be new pointer, but equal objects. 1580 XCTAssertNotEqual(array, array2); 1581 XCTAssertEqualObjects(array, array2); 1582 [array release]; 1583} 1584 1585- (void)testAdds { 1586 GPBUInt64Array *array = [GPBUInt64Array array]; 1587 XCTAssertNotNil(array); 1588 1589 XCTAssertEqual(array.count, 0U); 1590 [array addValue:41ULL]; 1591 XCTAssertEqual(array.count, 1U); 1592 1593 const uint64_t kValues1[] = { 42ULL, 43ULL }; 1594 [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; 1595 XCTAssertEqual(array.count, 3U); 1596 1597 const uint64_t kValues2[] = { 44ULL, 41ULL }; 1598 GPBUInt64Array *array2 = 1599 [[GPBUInt64Array alloc] initWithValues:kValues2 1600 count:GPBARRAYSIZE(kValues2)]; 1601 XCTAssertNotNil(array2); 1602 [array addValuesFromArray:array2]; 1603 XCTAssertEqual(array.count, 5U); 1604 1605 XCTAssertEqual([array valueAtIndex:0], 41ULL); 1606 XCTAssertEqual([array valueAtIndex:1], 42ULL); 1607 XCTAssertEqual([array valueAtIndex:2], 43ULL); 1608 XCTAssertEqual([array valueAtIndex:3], 44ULL); 1609 XCTAssertEqual([array valueAtIndex:4], 41ULL); 1610 [array2 release]; 1611} 1612 1613- (void)testInsert { 1614 const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL }; 1615 GPBUInt64Array *array = 1616 [[GPBUInt64Array alloc] initWithValues:kValues 1617 count:GPBARRAYSIZE(kValues)]; 1618 XCTAssertNotNil(array); 1619 XCTAssertEqual(array.count, 3U); 1620 1621 // First 1622 [array insertValue:44ULL atIndex:0]; 1623 XCTAssertEqual(array.count, 4U); 1624 1625 // Middle 1626 [array insertValue:44ULL atIndex:2]; 1627 XCTAssertEqual(array.count, 5U); 1628 1629 // End 1630 [array insertValue:44ULL atIndex:5]; 1631 XCTAssertEqual(array.count, 6U); 1632 1633 // Too far. 1634 XCTAssertThrowsSpecificNamed([array insertValue:44ULL atIndex:7], 1635 NSException, NSRangeException); 1636 1637 XCTAssertEqual([array valueAtIndex:0], 44ULL); 1638 XCTAssertEqual([array valueAtIndex:1], 41ULL); 1639 XCTAssertEqual([array valueAtIndex:2], 44ULL); 1640 XCTAssertEqual([array valueAtIndex:3], 42ULL); 1641 XCTAssertEqual([array valueAtIndex:4], 43ULL); 1642 XCTAssertEqual([array valueAtIndex:5], 44ULL); 1643 [array release]; 1644} 1645 1646- (void)testRemove { 1647 const uint64_t kValues[] = { 44ULL, 41ULL, 42ULL, 44ULL, 43ULL, 44ULL }; 1648 GPBUInt64Array *array = 1649 [[GPBUInt64Array alloc] initWithValues:kValues 1650 count:GPBARRAYSIZE(kValues)]; 1651 XCTAssertNotNil(array); 1652 XCTAssertEqual(array.count, 6U); 1653 1654 // First 1655 [array removeValueAtIndex:0]; 1656 XCTAssertEqual(array.count, 5U); 1657 XCTAssertEqual([array valueAtIndex:0], 41ULL); 1658 1659 // Middle 1660 [array removeValueAtIndex:2]; 1661 XCTAssertEqual(array.count, 4U); 1662 XCTAssertEqual([array valueAtIndex:2], 43ULL); 1663 1664 // End 1665 [array removeValueAtIndex:3]; 1666 XCTAssertEqual(array.count, 3U); 1667 1668 XCTAssertEqual([array valueAtIndex:0], 41ULL); 1669 XCTAssertEqual([array valueAtIndex:1], 42ULL); 1670 XCTAssertEqual([array valueAtIndex:2], 43ULL); 1671 1672 // Too far. 1673 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], 1674 NSException, NSRangeException); 1675 1676 [array removeAll]; 1677 XCTAssertEqual(array.count, 0U); 1678 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], 1679 NSException, NSRangeException); 1680 [array release]; 1681} 1682 1683- (void)testInplaceMutation { 1684 const uint64_t kValues[] = { 41ULL, 41ULL, 43ULL, 43ULL }; 1685 GPBUInt64Array *array = 1686 [[GPBUInt64Array alloc] initWithValues:kValues 1687 count:GPBARRAYSIZE(kValues)]; 1688 XCTAssertNotNil(array); 1689 1690 [array replaceValueAtIndex:1 withValue:42ULL]; 1691 [array replaceValueAtIndex:3 withValue:44ULL]; 1692 XCTAssertEqual(array.count, 4U); 1693 XCTAssertEqual([array valueAtIndex:0], 41ULL); 1694 XCTAssertEqual([array valueAtIndex:1], 42ULL); 1695 XCTAssertEqual([array valueAtIndex:2], 43ULL); 1696 XCTAssertEqual([array valueAtIndex:3], 44ULL); 1697 1698 XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:44ULL], 1699 NSException, NSRangeException); 1700 1701 [array exchangeValueAtIndex:1 withValueAtIndex:3]; 1702 XCTAssertEqual(array.count, 4U); 1703 XCTAssertEqual([array valueAtIndex:0], 41ULL); 1704 XCTAssertEqual([array valueAtIndex:1], 44ULL); 1705 XCTAssertEqual([array valueAtIndex:2], 43ULL); 1706 XCTAssertEqual([array valueAtIndex:3], 42ULL); 1707 1708 [array exchangeValueAtIndex:2 withValueAtIndex:0]; 1709 XCTAssertEqual(array.count, 4U); 1710 XCTAssertEqual([array valueAtIndex:0], 43ULL); 1711 XCTAssertEqual([array valueAtIndex:1], 44ULL); 1712 XCTAssertEqual([array valueAtIndex:2], 41ULL); 1713 XCTAssertEqual([array valueAtIndex:3], 42ULL); 1714 1715 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], 1716 NSException, NSRangeException); 1717 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], 1718 NSException, NSRangeException); 1719 [array release]; 1720} 1721 1722- (void)testInternalResizing { 1723 const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL }; 1724 GPBUInt64Array *array = 1725 [[GPBUInt64Array alloc] initWithValues:kValues 1726 count:GPBARRAYSIZE(kValues)]; 1727 XCTAssertNotNil(array); 1728 1729 // Add/remove to trigger the intneral buffer to grow/shrink. 1730 for (int i = 0; i < 100; ++i) { 1731 [array addValues:kValues count:GPBARRAYSIZE(kValues)]; 1732 } 1733 XCTAssertEqual(array.count, 404U); 1734 for (int i = 0; i < 100; ++i) { 1735 [array removeValueAtIndex:(i * 2)]; 1736 } 1737 XCTAssertEqual(array.count, 304U); 1738 for (int i = 0; i < 100; ++i) { 1739 [array insertValue:44ULL atIndex:(i * 3)]; 1740 } 1741 XCTAssertEqual(array.count, 404U); 1742 [array removeAll]; 1743 XCTAssertEqual(array.count, 0U); 1744 [array release]; 1745} 1746 1747@end 1748 1749//%PDDM-EXPAND ARRAY_TESTS(Float, float, 51.f, 52.f, 53.f, 54.f) 1750// This block of code is generated, do not edit it directly. 1751 1752#pragma mark - Float 1753 1754@interface GPBFloatArrayTests : XCTestCase 1755@end 1756 1757@implementation GPBFloatArrayTests 1758 1759- (void)testEmpty { 1760 GPBFloatArray *array = [[GPBFloatArray alloc] init]; 1761 XCTAssertNotNil(array); 1762 XCTAssertEqual(array.count, 0U); 1763 XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); 1764 [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) { 1765 #pragma unused(value, idx, stop) 1766 XCTFail(@"Shouldn't get here!"); 1767 }]; 1768 [array enumerateValuesWithOptions:NSEnumerationReverse 1769 usingBlock:^(float value, NSUInteger idx, BOOL *stop) { 1770 #pragma unused(value, idx, stop) 1771 XCTFail(@"Shouldn't get here!"); 1772 }]; 1773 [array release]; 1774} 1775 1776- (void)testOne { 1777 GPBFloatArray *array = [GPBFloatArray arrayWithValue:51.f]; 1778 XCTAssertNotNil(array); 1779 XCTAssertEqual(array.count, 1U); 1780 XCTAssertEqual([array valueAtIndex:0], 51.f); 1781 XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); 1782 [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) { 1783 XCTAssertEqual(idx, 0U); 1784 XCTAssertEqual(value, 51.f); 1785 XCTAssertNotEqual(stop, NULL); 1786 }]; 1787 [array enumerateValuesWithOptions:NSEnumerationReverse 1788 usingBlock:^(float value, NSUInteger idx, BOOL *stop) { 1789 XCTAssertEqual(idx, 0U); 1790 XCTAssertEqual(value, 51.f); 1791 XCTAssertNotEqual(stop, NULL); 1792 }]; 1793} 1794 1795- (void)testBasics { 1796 static const float kValues[] = { 51.f, 52.f, 53.f, 54.f }; 1797 GPBFloatArray *array = 1798 [[GPBFloatArray alloc] initWithValues:kValues 1799 count:GPBARRAYSIZE(kValues)]; 1800 XCTAssertNotNil(array); 1801 XCTAssertEqual(array.count, 4U); 1802 XCTAssertEqual([array valueAtIndex:0], 51.f); 1803 XCTAssertEqual([array valueAtIndex:1], 52.f); 1804 XCTAssertEqual([array valueAtIndex:2], 53.f); 1805 XCTAssertEqual([array valueAtIndex:3], 54.f); 1806 XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); 1807 __block NSUInteger idx2 = 0; 1808 [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) { 1809 XCTAssertEqual(idx, idx2); 1810 XCTAssertEqual(value, kValues[idx]); 1811 XCTAssertNotEqual(stop, NULL); 1812 ++idx2; 1813 }]; 1814 idx2 = 0; 1815 [array enumerateValuesWithOptions:NSEnumerationReverse 1816 usingBlock:^(float value, NSUInteger idx, BOOL *stop) { 1817 XCTAssertEqual(idx, (3 - idx2)); 1818 XCTAssertEqual(value, kValues[idx]); 1819 XCTAssertNotEqual(stop, NULL); 1820 ++idx2; 1821 }]; 1822 // Stopping the enumeration. 1823 idx2 = 0; 1824 [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) { 1825 XCTAssertEqual(idx, idx2); 1826 XCTAssertEqual(value, kValues[idx]); 1827 XCTAssertNotEqual(stop, NULL); 1828 if (idx2 == 1) *stop = YES; 1829 XCTAssertNotEqual(idx, 2U); 1830 XCTAssertNotEqual(idx, 3U); 1831 ++idx2; 1832 }]; 1833 idx2 = 0; 1834 [array enumerateValuesWithOptions:NSEnumerationReverse 1835 usingBlock:^(float value, NSUInteger idx, BOOL *stop) { 1836 XCTAssertEqual(idx, (3 - idx2)); 1837 XCTAssertEqual(value, kValues[idx]); 1838 XCTAssertNotEqual(stop, NULL); 1839 if (idx2 == 1) *stop = YES; 1840 XCTAssertNotEqual(idx, 1U); 1841 XCTAssertNotEqual(idx, 0U); 1842 ++idx2; 1843 }]; 1844 [array release]; 1845} 1846 1847- (void)testEquality { 1848 const float kValues1[] = { 51.f, 52.f, 53.f }; 1849 const float kValues2[] = { 51.f, 54.f, 53.f }; 1850 const float kValues3[] = { 51.f, 52.f, 53.f, 54.f }; 1851 GPBFloatArray *array1 = 1852 [[GPBFloatArray alloc] initWithValues:kValues1 1853 count:GPBARRAYSIZE(kValues1)]; 1854 XCTAssertNotNil(array1); 1855 GPBFloatArray *array1prime = 1856 [[GPBFloatArray alloc] initWithValues:kValues1 1857 count:GPBARRAYSIZE(kValues1)]; 1858 XCTAssertNotNil(array1prime); 1859 GPBFloatArray *array2 = 1860 [[GPBFloatArray alloc] initWithValues:kValues2 1861 count:GPBARRAYSIZE(kValues2)]; 1862 XCTAssertNotNil(array2); 1863 GPBFloatArray *array3 = 1864 [[GPBFloatArray alloc] initWithValues:kValues3 1865 count:GPBARRAYSIZE(kValues3)]; 1866 XCTAssertNotNil(array3); 1867 1868 // 1/1Prime should be different objects, but equal. 1869 XCTAssertNotEqual(array1, array1prime); 1870 XCTAssertEqualObjects(array1, array1prime); 1871 // Equal, so they must have same hash. 1872 XCTAssertEqual([array1 hash], [array1prime hash]); 1873 1874 // 1/2/3 shouldn't be equal. 1875 XCTAssertNotEqualObjects(array1, array2); 1876 XCTAssertNotEqualObjects(array1, array3); 1877 XCTAssertNotEqualObjects(array2, array3); 1878 1879 [array1 release]; 1880 [array1prime release]; 1881 [array2 release]; 1882 [array3 release]; 1883} 1884 1885- (void)testCopy { 1886 const float kValues[] = { 51.f, 52.f, 53.f, 54.f }; 1887 GPBFloatArray *array = 1888 [[GPBFloatArray alloc] initWithValues:kValues 1889 count:GPBARRAYSIZE(kValues)]; 1890 XCTAssertNotNil(array); 1891 1892 GPBFloatArray *array2 = [array copy]; 1893 XCTAssertNotNil(array2); 1894 1895 // Should be new object but equal. 1896 XCTAssertNotEqual(array, array2); 1897 XCTAssertEqualObjects(array, array2); 1898 [array2 release]; 1899 [array release]; 1900} 1901 1902- (void)testArrayFromArray { 1903 const float kValues[] = { 51.f, 52.f, 53.f, 54.f }; 1904 GPBFloatArray *array = 1905 [[GPBFloatArray alloc] initWithValues:kValues 1906 count:GPBARRAYSIZE(kValues)]; 1907 XCTAssertNotNil(array); 1908 1909 GPBFloatArray *array2 = [GPBFloatArray arrayWithValueArray:array]; 1910 XCTAssertNotNil(array2); 1911 1912 // Should be new pointer, but equal objects. 1913 XCTAssertNotEqual(array, array2); 1914 XCTAssertEqualObjects(array, array2); 1915 [array release]; 1916} 1917 1918- (void)testAdds { 1919 GPBFloatArray *array = [GPBFloatArray array]; 1920 XCTAssertNotNil(array); 1921 1922 XCTAssertEqual(array.count, 0U); 1923 [array addValue:51.f]; 1924 XCTAssertEqual(array.count, 1U); 1925 1926 const float kValues1[] = { 52.f, 53.f }; 1927 [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; 1928 XCTAssertEqual(array.count, 3U); 1929 1930 const float kValues2[] = { 54.f, 51.f }; 1931 GPBFloatArray *array2 = 1932 [[GPBFloatArray alloc] initWithValues:kValues2 1933 count:GPBARRAYSIZE(kValues2)]; 1934 XCTAssertNotNil(array2); 1935 [array addValuesFromArray:array2]; 1936 XCTAssertEqual(array.count, 5U); 1937 1938 XCTAssertEqual([array valueAtIndex:0], 51.f); 1939 XCTAssertEqual([array valueAtIndex:1], 52.f); 1940 XCTAssertEqual([array valueAtIndex:2], 53.f); 1941 XCTAssertEqual([array valueAtIndex:3], 54.f); 1942 XCTAssertEqual([array valueAtIndex:4], 51.f); 1943 [array2 release]; 1944} 1945 1946- (void)testInsert { 1947 const float kValues[] = { 51.f, 52.f, 53.f }; 1948 GPBFloatArray *array = 1949 [[GPBFloatArray alloc] initWithValues:kValues 1950 count:GPBARRAYSIZE(kValues)]; 1951 XCTAssertNotNil(array); 1952 XCTAssertEqual(array.count, 3U); 1953 1954 // First 1955 [array insertValue:54.f atIndex:0]; 1956 XCTAssertEqual(array.count, 4U); 1957 1958 // Middle 1959 [array insertValue:54.f atIndex:2]; 1960 XCTAssertEqual(array.count, 5U); 1961 1962 // End 1963 [array insertValue:54.f atIndex:5]; 1964 XCTAssertEqual(array.count, 6U); 1965 1966 // Too far. 1967 XCTAssertThrowsSpecificNamed([array insertValue:54.f atIndex:7], 1968 NSException, NSRangeException); 1969 1970 XCTAssertEqual([array valueAtIndex:0], 54.f); 1971 XCTAssertEqual([array valueAtIndex:1], 51.f); 1972 XCTAssertEqual([array valueAtIndex:2], 54.f); 1973 XCTAssertEqual([array valueAtIndex:3], 52.f); 1974 XCTAssertEqual([array valueAtIndex:4], 53.f); 1975 XCTAssertEqual([array valueAtIndex:5], 54.f); 1976 [array release]; 1977} 1978 1979- (void)testRemove { 1980 const float kValues[] = { 54.f, 51.f, 52.f, 54.f, 53.f, 54.f }; 1981 GPBFloatArray *array = 1982 [[GPBFloatArray alloc] initWithValues:kValues 1983 count:GPBARRAYSIZE(kValues)]; 1984 XCTAssertNotNil(array); 1985 XCTAssertEqual(array.count, 6U); 1986 1987 // First 1988 [array removeValueAtIndex:0]; 1989 XCTAssertEqual(array.count, 5U); 1990 XCTAssertEqual([array valueAtIndex:0], 51.f); 1991 1992 // Middle 1993 [array removeValueAtIndex:2]; 1994 XCTAssertEqual(array.count, 4U); 1995 XCTAssertEqual([array valueAtIndex:2], 53.f); 1996 1997 // End 1998 [array removeValueAtIndex:3]; 1999 XCTAssertEqual(array.count, 3U); 2000 2001 XCTAssertEqual([array valueAtIndex:0], 51.f); 2002 XCTAssertEqual([array valueAtIndex:1], 52.f); 2003 XCTAssertEqual([array valueAtIndex:2], 53.f); 2004 2005 // Too far. 2006 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], 2007 NSException, NSRangeException); 2008 2009 [array removeAll]; 2010 XCTAssertEqual(array.count, 0U); 2011 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], 2012 NSException, NSRangeException); 2013 [array release]; 2014} 2015 2016- (void)testInplaceMutation { 2017 const float kValues[] = { 51.f, 51.f, 53.f, 53.f }; 2018 GPBFloatArray *array = 2019 [[GPBFloatArray alloc] initWithValues:kValues 2020 count:GPBARRAYSIZE(kValues)]; 2021 XCTAssertNotNil(array); 2022 2023 [array replaceValueAtIndex:1 withValue:52.f]; 2024 [array replaceValueAtIndex:3 withValue:54.f]; 2025 XCTAssertEqual(array.count, 4U); 2026 XCTAssertEqual([array valueAtIndex:0], 51.f); 2027 XCTAssertEqual([array valueAtIndex:1], 52.f); 2028 XCTAssertEqual([array valueAtIndex:2], 53.f); 2029 XCTAssertEqual([array valueAtIndex:3], 54.f); 2030 2031 XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:54.f], 2032 NSException, NSRangeException); 2033 2034 [array exchangeValueAtIndex:1 withValueAtIndex:3]; 2035 XCTAssertEqual(array.count, 4U); 2036 XCTAssertEqual([array valueAtIndex:0], 51.f); 2037 XCTAssertEqual([array valueAtIndex:1], 54.f); 2038 XCTAssertEqual([array valueAtIndex:2], 53.f); 2039 XCTAssertEqual([array valueAtIndex:3], 52.f); 2040 2041 [array exchangeValueAtIndex:2 withValueAtIndex:0]; 2042 XCTAssertEqual(array.count, 4U); 2043 XCTAssertEqual([array valueAtIndex:0], 53.f); 2044 XCTAssertEqual([array valueAtIndex:1], 54.f); 2045 XCTAssertEqual([array valueAtIndex:2], 51.f); 2046 XCTAssertEqual([array valueAtIndex:3], 52.f); 2047 2048 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], 2049 NSException, NSRangeException); 2050 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], 2051 NSException, NSRangeException); 2052 [array release]; 2053} 2054 2055- (void)testInternalResizing { 2056 const float kValues[] = { 51.f, 52.f, 53.f, 54.f }; 2057 GPBFloatArray *array = 2058 [[GPBFloatArray alloc] initWithValues:kValues 2059 count:GPBARRAYSIZE(kValues)]; 2060 XCTAssertNotNil(array); 2061 2062 // Add/remove to trigger the intneral buffer to grow/shrink. 2063 for (int i = 0; i < 100; ++i) { 2064 [array addValues:kValues count:GPBARRAYSIZE(kValues)]; 2065 } 2066 XCTAssertEqual(array.count, 404U); 2067 for (int i = 0; i < 100; ++i) { 2068 [array removeValueAtIndex:(i * 2)]; 2069 } 2070 XCTAssertEqual(array.count, 304U); 2071 for (int i = 0; i < 100; ++i) { 2072 [array insertValue:54.f atIndex:(i * 3)]; 2073 } 2074 XCTAssertEqual(array.count, 404U); 2075 [array removeAll]; 2076 XCTAssertEqual(array.count, 0U); 2077 [array release]; 2078} 2079 2080@end 2081 2082//%PDDM-EXPAND ARRAY_TESTS(Double, double, 61., 62., 63., 64.) 2083// This block of code is generated, do not edit it directly. 2084 2085#pragma mark - Double 2086 2087@interface GPBDoubleArrayTests : XCTestCase 2088@end 2089 2090@implementation GPBDoubleArrayTests 2091 2092- (void)testEmpty { 2093 GPBDoubleArray *array = [[GPBDoubleArray alloc] init]; 2094 XCTAssertNotNil(array); 2095 XCTAssertEqual(array.count, 0U); 2096 XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); 2097 [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) { 2098 #pragma unused(value, idx, stop) 2099 XCTFail(@"Shouldn't get here!"); 2100 }]; 2101 [array enumerateValuesWithOptions:NSEnumerationReverse 2102 usingBlock:^(double value, NSUInteger idx, BOOL *stop) { 2103 #pragma unused(value, idx, stop) 2104 XCTFail(@"Shouldn't get here!"); 2105 }]; 2106 [array release]; 2107} 2108 2109- (void)testOne { 2110 GPBDoubleArray *array = [GPBDoubleArray arrayWithValue:61.]; 2111 XCTAssertNotNil(array); 2112 XCTAssertEqual(array.count, 1U); 2113 XCTAssertEqual([array valueAtIndex:0], 61.); 2114 XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); 2115 [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) { 2116 XCTAssertEqual(idx, 0U); 2117 XCTAssertEqual(value, 61.); 2118 XCTAssertNotEqual(stop, NULL); 2119 }]; 2120 [array enumerateValuesWithOptions:NSEnumerationReverse 2121 usingBlock:^(double value, NSUInteger idx, BOOL *stop) { 2122 XCTAssertEqual(idx, 0U); 2123 XCTAssertEqual(value, 61.); 2124 XCTAssertNotEqual(stop, NULL); 2125 }]; 2126} 2127 2128- (void)testBasics { 2129 static const double kValues[] = { 61., 62., 63., 64. }; 2130 GPBDoubleArray *array = 2131 [[GPBDoubleArray alloc] initWithValues:kValues 2132 count:GPBARRAYSIZE(kValues)]; 2133 XCTAssertNotNil(array); 2134 XCTAssertEqual(array.count, 4U); 2135 XCTAssertEqual([array valueAtIndex:0], 61.); 2136 XCTAssertEqual([array valueAtIndex:1], 62.); 2137 XCTAssertEqual([array valueAtIndex:2], 63.); 2138 XCTAssertEqual([array valueAtIndex:3], 64.); 2139 XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); 2140 __block NSUInteger idx2 = 0; 2141 [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) { 2142 XCTAssertEqual(idx, idx2); 2143 XCTAssertEqual(value, kValues[idx]); 2144 XCTAssertNotEqual(stop, NULL); 2145 ++idx2; 2146 }]; 2147 idx2 = 0; 2148 [array enumerateValuesWithOptions:NSEnumerationReverse 2149 usingBlock:^(double value, NSUInteger idx, BOOL *stop) { 2150 XCTAssertEqual(idx, (3 - idx2)); 2151 XCTAssertEqual(value, kValues[idx]); 2152 XCTAssertNotEqual(stop, NULL); 2153 ++idx2; 2154 }]; 2155 // Stopping the enumeration. 2156 idx2 = 0; 2157 [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) { 2158 XCTAssertEqual(idx, idx2); 2159 XCTAssertEqual(value, kValues[idx]); 2160 XCTAssertNotEqual(stop, NULL); 2161 if (idx2 == 1) *stop = YES; 2162 XCTAssertNotEqual(idx, 2U); 2163 XCTAssertNotEqual(idx, 3U); 2164 ++idx2; 2165 }]; 2166 idx2 = 0; 2167 [array enumerateValuesWithOptions:NSEnumerationReverse 2168 usingBlock:^(double value, NSUInteger idx, BOOL *stop) { 2169 XCTAssertEqual(idx, (3 - idx2)); 2170 XCTAssertEqual(value, kValues[idx]); 2171 XCTAssertNotEqual(stop, NULL); 2172 if (idx2 == 1) *stop = YES; 2173 XCTAssertNotEqual(idx, 1U); 2174 XCTAssertNotEqual(idx, 0U); 2175 ++idx2; 2176 }]; 2177 [array release]; 2178} 2179 2180- (void)testEquality { 2181 const double kValues1[] = { 61., 62., 63. }; 2182 const double kValues2[] = { 61., 64., 63. }; 2183 const double kValues3[] = { 61., 62., 63., 64. }; 2184 GPBDoubleArray *array1 = 2185 [[GPBDoubleArray alloc] initWithValues:kValues1 2186 count:GPBARRAYSIZE(kValues1)]; 2187 XCTAssertNotNil(array1); 2188 GPBDoubleArray *array1prime = 2189 [[GPBDoubleArray alloc] initWithValues:kValues1 2190 count:GPBARRAYSIZE(kValues1)]; 2191 XCTAssertNotNil(array1prime); 2192 GPBDoubleArray *array2 = 2193 [[GPBDoubleArray alloc] initWithValues:kValues2 2194 count:GPBARRAYSIZE(kValues2)]; 2195 XCTAssertNotNil(array2); 2196 GPBDoubleArray *array3 = 2197 [[GPBDoubleArray alloc] initWithValues:kValues3 2198 count:GPBARRAYSIZE(kValues3)]; 2199 XCTAssertNotNil(array3); 2200 2201 // 1/1Prime should be different objects, but equal. 2202 XCTAssertNotEqual(array1, array1prime); 2203 XCTAssertEqualObjects(array1, array1prime); 2204 // Equal, so they must have same hash. 2205 XCTAssertEqual([array1 hash], [array1prime hash]); 2206 2207 // 1/2/3 shouldn't be equal. 2208 XCTAssertNotEqualObjects(array1, array2); 2209 XCTAssertNotEqualObjects(array1, array3); 2210 XCTAssertNotEqualObjects(array2, array3); 2211 2212 [array1 release]; 2213 [array1prime release]; 2214 [array2 release]; 2215 [array3 release]; 2216} 2217 2218- (void)testCopy { 2219 const double kValues[] = { 61., 62., 63., 64. }; 2220 GPBDoubleArray *array = 2221 [[GPBDoubleArray alloc] initWithValues:kValues 2222 count:GPBARRAYSIZE(kValues)]; 2223 XCTAssertNotNil(array); 2224 2225 GPBDoubleArray *array2 = [array copy]; 2226 XCTAssertNotNil(array2); 2227 2228 // Should be new object but equal. 2229 XCTAssertNotEqual(array, array2); 2230 XCTAssertEqualObjects(array, array2); 2231 [array2 release]; 2232 [array release]; 2233} 2234 2235- (void)testArrayFromArray { 2236 const double kValues[] = { 61., 62., 63., 64. }; 2237 GPBDoubleArray *array = 2238 [[GPBDoubleArray alloc] initWithValues:kValues 2239 count:GPBARRAYSIZE(kValues)]; 2240 XCTAssertNotNil(array); 2241 2242 GPBDoubleArray *array2 = [GPBDoubleArray arrayWithValueArray:array]; 2243 XCTAssertNotNil(array2); 2244 2245 // Should be new pointer, but equal objects. 2246 XCTAssertNotEqual(array, array2); 2247 XCTAssertEqualObjects(array, array2); 2248 [array release]; 2249} 2250 2251- (void)testAdds { 2252 GPBDoubleArray *array = [GPBDoubleArray array]; 2253 XCTAssertNotNil(array); 2254 2255 XCTAssertEqual(array.count, 0U); 2256 [array addValue:61.]; 2257 XCTAssertEqual(array.count, 1U); 2258 2259 const double kValues1[] = { 62., 63. }; 2260 [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; 2261 XCTAssertEqual(array.count, 3U); 2262 2263 const double kValues2[] = { 64., 61. }; 2264 GPBDoubleArray *array2 = 2265 [[GPBDoubleArray alloc] initWithValues:kValues2 2266 count:GPBARRAYSIZE(kValues2)]; 2267 XCTAssertNotNil(array2); 2268 [array addValuesFromArray:array2]; 2269 XCTAssertEqual(array.count, 5U); 2270 2271 XCTAssertEqual([array valueAtIndex:0], 61.); 2272 XCTAssertEqual([array valueAtIndex:1], 62.); 2273 XCTAssertEqual([array valueAtIndex:2], 63.); 2274 XCTAssertEqual([array valueAtIndex:3], 64.); 2275 XCTAssertEqual([array valueAtIndex:4], 61.); 2276 [array2 release]; 2277} 2278 2279- (void)testInsert { 2280 const double kValues[] = { 61., 62., 63. }; 2281 GPBDoubleArray *array = 2282 [[GPBDoubleArray alloc] initWithValues:kValues 2283 count:GPBARRAYSIZE(kValues)]; 2284 XCTAssertNotNil(array); 2285 XCTAssertEqual(array.count, 3U); 2286 2287 // First 2288 [array insertValue:64. atIndex:0]; 2289 XCTAssertEqual(array.count, 4U); 2290 2291 // Middle 2292 [array insertValue:64. atIndex:2]; 2293 XCTAssertEqual(array.count, 5U); 2294 2295 // End 2296 [array insertValue:64. atIndex:5]; 2297 XCTAssertEqual(array.count, 6U); 2298 2299 // Too far. 2300 XCTAssertThrowsSpecificNamed([array insertValue:64. atIndex:7], 2301 NSException, NSRangeException); 2302 2303 XCTAssertEqual([array valueAtIndex:0], 64.); 2304 XCTAssertEqual([array valueAtIndex:1], 61.); 2305 XCTAssertEqual([array valueAtIndex:2], 64.); 2306 XCTAssertEqual([array valueAtIndex:3], 62.); 2307 XCTAssertEqual([array valueAtIndex:4], 63.); 2308 XCTAssertEqual([array valueAtIndex:5], 64.); 2309 [array release]; 2310} 2311 2312- (void)testRemove { 2313 const double kValues[] = { 64., 61., 62., 64., 63., 64. }; 2314 GPBDoubleArray *array = 2315 [[GPBDoubleArray alloc] initWithValues:kValues 2316 count:GPBARRAYSIZE(kValues)]; 2317 XCTAssertNotNil(array); 2318 XCTAssertEqual(array.count, 6U); 2319 2320 // First 2321 [array removeValueAtIndex:0]; 2322 XCTAssertEqual(array.count, 5U); 2323 XCTAssertEqual([array valueAtIndex:0], 61.); 2324 2325 // Middle 2326 [array removeValueAtIndex:2]; 2327 XCTAssertEqual(array.count, 4U); 2328 XCTAssertEqual([array valueAtIndex:2], 63.); 2329 2330 // End 2331 [array removeValueAtIndex:3]; 2332 XCTAssertEqual(array.count, 3U); 2333 2334 XCTAssertEqual([array valueAtIndex:0], 61.); 2335 XCTAssertEqual([array valueAtIndex:1], 62.); 2336 XCTAssertEqual([array valueAtIndex:2], 63.); 2337 2338 // Too far. 2339 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], 2340 NSException, NSRangeException); 2341 2342 [array removeAll]; 2343 XCTAssertEqual(array.count, 0U); 2344 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], 2345 NSException, NSRangeException); 2346 [array release]; 2347} 2348 2349- (void)testInplaceMutation { 2350 const double kValues[] = { 61., 61., 63., 63. }; 2351 GPBDoubleArray *array = 2352 [[GPBDoubleArray alloc] initWithValues:kValues 2353 count:GPBARRAYSIZE(kValues)]; 2354 XCTAssertNotNil(array); 2355 2356 [array replaceValueAtIndex:1 withValue:62.]; 2357 [array replaceValueAtIndex:3 withValue:64.]; 2358 XCTAssertEqual(array.count, 4U); 2359 XCTAssertEqual([array valueAtIndex:0], 61.); 2360 XCTAssertEqual([array valueAtIndex:1], 62.); 2361 XCTAssertEqual([array valueAtIndex:2], 63.); 2362 XCTAssertEqual([array valueAtIndex:3], 64.); 2363 2364 XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:64.], 2365 NSException, NSRangeException); 2366 2367 [array exchangeValueAtIndex:1 withValueAtIndex:3]; 2368 XCTAssertEqual(array.count, 4U); 2369 XCTAssertEqual([array valueAtIndex:0], 61.); 2370 XCTAssertEqual([array valueAtIndex:1], 64.); 2371 XCTAssertEqual([array valueAtIndex:2], 63.); 2372 XCTAssertEqual([array valueAtIndex:3], 62.); 2373 2374 [array exchangeValueAtIndex:2 withValueAtIndex:0]; 2375 XCTAssertEqual(array.count, 4U); 2376 XCTAssertEqual([array valueAtIndex:0], 63.); 2377 XCTAssertEqual([array valueAtIndex:1], 64.); 2378 XCTAssertEqual([array valueAtIndex:2], 61.); 2379 XCTAssertEqual([array valueAtIndex:3], 62.); 2380 2381 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], 2382 NSException, NSRangeException); 2383 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], 2384 NSException, NSRangeException); 2385 [array release]; 2386} 2387 2388- (void)testInternalResizing { 2389 const double kValues[] = { 61., 62., 63., 64. }; 2390 GPBDoubleArray *array = 2391 [[GPBDoubleArray alloc] initWithValues:kValues 2392 count:GPBARRAYSIZE(kValues)]; 2393 XCTAssertNotNil(array); 2394 2395 // Add/remove to trigger the intneral buffer to grow/shrink. 2396 for (int i = 0; i < 100; ++i) { 2397 [array addValues:kValues count:GPBARRAYSIZE(kValues)]; 2398 } 2399 XCTAssertEqual(array.count, 404U); 2400 for (int i = 0; i < 100; ++i) { 2401 [array removeValueAtIndex:(i * 2)]; 2402 } 2403 XCTAssertEqual(array.count, 304U); 2404 for (int i = 0; i < 100; ++i) { 2405 [array insertValue:64. atIndex:(i * 3)]; 2406 } 2407 XCTAssertEqual(array.count, 404U); 2408 [array removeAll]; 2409 XCTAssertEqual(array.count, 0U); 2410 [array release]; 2411} 2412 2413@end 2414 2415//%PDDM-EXPAND ARRAY_TESTS(Bool, BOOL, TRUE, TRUE, FALSE, FALSE) 2416// This block of code is generated, do not edit it directly. 2417 2418#pragma mark - Bool 2419 2420@interface GPBBoolArrayTests : XCTestCase 2421@end 2422 2423@implementation GPBBoolArrayTests 2424 2425- (void)testEmpty { 2426 GPBBoolArray *array = [[GPBBoolArray alloc] init]; 2427 XCTAssertNotNil(array); 2428 XCTAssertEqual(array.count, 0U); 2429 XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); 2430 [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { 2431 #pragma unused(value, idx, stop) 2432 XCTFail(@"Shouldn't get here!"); 2433 }]; 2434 [array enumerateValuesWithOptions:NSEnumerationReverse 2435 usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { 2436 #pragma unused(value, idx, stop) 2437 XCTFail(@"Shouldn't get here!"); 2438 }]; 2439 [array release]; 2440} 2441 2442- (void)testOne { 2443 GPBBoolArray *array = [GPBBoolArray arrayWithValue:TRUE]; 2444 XCTAssertNotNil(array); 2445 XCTAssertEqual(array.count, 1U); 2446 XCTAssertEqual([array valueAtIndex:0], TRUE); 2447 XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); 2448 [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { 2449 XCTAssertEqual(idx, 0U); 2450 XCTAssertEqual(value, TRUE); 2451 XCTAssertNotEqual(stop, NULL); 2452 }]; 2453 [array enumerateValuesWithOptions:NSEnumerationReverse 2454 usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { 2455 XCTAssertEqual(idx, 0U); 2456 XCTAssertEqual(value, TRUE); 2457 XCTAssertNotEqual(stop, NULL); 2458 }]; 2459} 2460 2461- (void)testBasics { 2462 static const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE }; 2463 GPBBoolArray *array = 2464 [[GPBBoolArray alloc] initWithValues:kValues 2465 count:GPBARRAYSIZE(kValues)]; 2466 XCTAssertNotNil(array); 2467 XCTAssertEqual(array.count, 4U); 2468 XCTAssertEqual([array valueAtIndex:0], TRUE); 2469 XCTAssertEqual([array valueAtIndex:1], TRUE); 2470 XCTAssertEqual([array valueAtIndex:2], FALSE); 2471 XCTAssertEqual([array valueAtIndex:3], FALSE); 2472 XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); 2473 __block NSUInteger idx2 = 0; 2474 [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { 2475 XCTAssertEqual(idx, idx2); 2476 XCTAssertEqual(value, kValues[idx]); 2477 XCTAssertNotEqual(stop, NULL); 2478 ++idx2; 2479 }]; 2480 idx2 = 0; 2481 [array enumerateValuesWithOptions:NSEnumerationReverse 2482 usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { 2483 XCTAssertEqual(idx, (3 - idx2)); 2484 XCTAssertEqual(value, kValues[idx]); 2485 XCTAssertNotEqual(stop, NULL); 2486 ++idx2; 2487 }]; 2488 // Stopping the enumeration. 2489 idx2 = 0; 2490 [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { 2491 XCTAssertEqual(idx, idx2); 2492 XCTAssertEqual(value, kValues[idx]); 2493 XCTAssertNotEqual(stop, NULL); 2494 if (idx2 == 1) *stop = YES; 2495 XCTAssertNotEqual(idx, 2U); 2496 XCTAssertNotEqual(idx, 3U); 2497 ++idx2; 2498 }]; 2499 idx2 = 0; 2500 [array enumerateValuesWithOptions:NSEnumerationReverse 2501 usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { 2502 XCTAssertEqual(idx, (3 - idx2)); 2503 XCTAssertEqual(value, kValues[idx]); 2504 XCTAssertNotEqual(stop, NULL); 2505 if (idx2 == 1) *stop = YES; 2506 XCTAssertNotEqual(idx, 1U); 2507 XCTAssertNotEqual(idx, 0U); 2508 ++idx2; 2509 }]; 2510 [array release]; 2511} 2512 2513- (void)testEquality { 2514 const BOOL kValues1[] = { TRUE, TRUE, FALSE }; 2515 const BOOL kValues2[] = { TRUE, FALSE, FALSE }; 2516 const BOOL kValues3[] = { TRUE, TRUE, FALSE, FALSE }; 2517 GPBBoolArray *array1 = 2518 [[GPBBoolArray alloc] initWithValues:kValues1 2519 count:GPBARRAYSIZE(kValues1)]; 2520 XCTAssertNotNil(array1); 2521 GPBBoolArray *array1prime = 2522 [[GPBBoolArray alloc] initWithValues:kValues1 2523 count:GPBARRAYSIZE(kValues1)]; 2524 XCTAssertNotNil(array1prime); 2525 GPBBoolArray *array2 = 2526 [[GPBBoolArray alloc] initWithValues:kValues2 2527 count:GPBARRAYSIZE(kValues2)]; 2528 XCTAssertNotNil(array2); 2529 GPBBoolArray *array3 = 2530 [[GPBBoolArray alloc] initWithValues:kValues3 2531 count:GPBARRAYSIZE(kValues3)]; 2532 XCTAssertNotNil(array3); 2533 2534 // 1/1Prime should be different objects, but equal. 2535 XCTAssertNotEqual(array1, array1prime); 2536 XCTAssertEqualObjects(array1, array1prime); 2537 // Equal, so they must have same hash. 2538 XCTAssertEqual([array1 hash], [array1prime hash]); 2539 2540 // 1/2/3 shouldn't be equal. 2541 XCTAssertNotEqualObjects(array1, array2); 2542 XCTAssertNotEqualObjects(array1, array3); 2543 XCTAssertNotEqualObjects(array2, array3); 2544 2545 [array1 release]; 2546 [array1prime release]; 2547 [array2 release]; 2548 [array3 release]; 2549} 2550 2551- (void)testCopy { 2552 const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE }; 2553 GPBBoolArray *array = 2554 [[GPBBoolArray alloc] initWithValues:kValues 2555 count:GPBARRAYSIZE(kValues)]; 2556 XCTAssertNotNil(array); 2557 2558 GPBBoolArray *array2 = [array copy]; 2559 XCTAssertNotNil(array2); 2560 2561 // Should be new object but equal. 2562 XCTAssertNotEqual(array, array2); 2563 XCTAssertEqualObjects(array, array2); 2564 [array2 release]; 2565 [array release]; 2566} 2567 2568- (void)testArrayFromArray { 2569 const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE }; 2570 GPBBoolArray *array = 2571 [[GPBBoolArray alloc] initWithValues:kValues 2572 count:GPBARRAYSIZE(kValues)]; 2573 XCTAssertNotNil(array); 2574 2575 GPBBoolArray *array2 = [GPBBoolArray arrayWithValueArray:array]; 2576 XCTAssertNotNil(array2); 2577 2578 // Should be new pointer, but equal objects. 2579 XCTAssertNotEqual(array, array2); 2580 XCTAssertEqualObjects(array, array2); 2581 [array release]; 2582} 2583 2584- (void)testAdds { 2585 GPBBoolArray *array = [GPBBoolArray array]; 2586 XCTAssertNotNil(array); 2587 2588 XCTAssertEqual(array.count, 0U); 2589 [array addValue:TRUE]; 2590 XCTAssertEqual(array.count, 1U); 2591 2592 const BOOL kValues1[] = { TRUE, FALSE }; 2593 [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; 2594 XCTAssertEqual(array.count, 3U); 2595 2596 const BOOL kValues2[] = { FALSE, TRUE }; 2597 GPBBoolArray *array2 = 2598 [[GPBBoolArray alloc] initWithValues:kValues2 2599 count:GPBARRAYSIZE(kValues2)]; 2600 XCTAssertNotNil(array2); 2601 [array addValuesFromArray:array2]; 2602 XCTAssertEqual(array.count, 5U); 2603 2604 XCTAssertEqual([array valueAtIndex:0], TRUE); 2605 XCTAssertEqual([array valueAtIndex:1], TRUE); 2606 XCTAssertEqual([array valueAtIndex:2], FALSE); 2607 XCTAssertEqual([array valueAtIndex:3], FALSE); 2608 XCTAssertEqual([array valueAtIndex:4], TRUE); 2609 [array2 release]; 2610} 2611 2612- (void)testInsert { 2613 const BOOL kValues[] = { TRUE, TRUE, FALSE }; 2614 GPBBoolArray *array = 2615 [[GPBBoolArray alloc] initWithValues:kValues 2616 count:GPBARRAYSIZE(kValues)]; 2617 XCTAssertNotNil(array); 2618 XCTAssertEqual(array.count, 3U); 2619 2620 // First 2621 [array insertValue:FALSE atIndex:0]; 2622 XCTAssertEqual(array.count, 4U); 2623 2624 // Middle 2625 [array insertValue:FALSE atIndex:2]; 2626 XCTAssertEqual(array.count, 5U); 2627 2628 // End 2629 [array insertValue:FALSE atIndex:5]; 2630 XCTAssertEqual(array.count, 6U); 2631 2632 // Too far. 2633 XCTAssertThrowsSpecificNamed([array insertValue:FALSE atIndex:7], 2634 NSException, NSRangeException); 2635 2636 XCTAssertEqual([array valueAtIndex:0], FALSE); 2637 XCTAssertEqual([array valueAtIndex:1], TRUE); 2638 XCTAssertEqual([array valueAtIndex:2], FALSE); 2639 XCTAssertEqual([array valueAtIndex:3], TRUE); 2640 XCTAssertEqual([array valueAtIndex:4], FALSE); 2641 XCTAssertEqual([array valueAtIndex:5], FALSE); 2642 [array release]; 2643} 2644 2645- (void)testRemove { 2646 const BOOL kValues[] = { FALSE, TRUE, TRUE, FALSE, FALSE, FALSE }; 2647 GPBBoolArray *array = 2648 [[GPBBoolArray alloc] initWithValues:kValues 2649 count:GPBARRAYSIZE(kValues)]; 2650 XCTAssertNotNil(array); 2651 XCTAssertEqual(array.count, 6U); 2652 2653 // First 2654 [array removeValueAtIndex:0]; 2655 XCTAssertEqual(array.count, 5U); 2656 XCTAssertEqual([array valueAtIndex:0], TRUE); 2657 2658 // Middle 2659 [array removeValueAtIndex:2]; 2660 XCTAssertEqual(array.count, 4U); 2661 XCTAssertEqual([array valueAtIndex:2], FALSE); 2662 2663 // End 2664 [array removeValueAtIndex:3]; 2665 XCTAssertEqual(array.count, 3U); 2666 2667 XCTAssertEqual([array valueAtIndex:0], TRUE); 2668 XCTAssertEqual([array valueAtIndex:1], TRUE); 2669 XCTAssertEqual([array valueAtIndex:2], FALSE); 2670 2671 // Too far. 2672 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], 2673 NSException, NSRangeException); 2674 2675 [array removeAll]; 2676 XCTAssertEqual(array.count, 0U); 2677 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], 2678 NSException, NSRangeException); 2679 [array release]; 2680} 2681 2682- (void)testInplaceMutation { 2683 const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE }; 2684 GPBBoolArray *array = 2685 [[GPBBoolArray alloc] initWithValues:kValues 2686 count:GPBARRAYSIZE(kValues)]; 2687 XCTAssertNotNil(array); 2688 2689 [array replaceValueAtIndex:1 withValue:TRUE]; 2690 [array replaceValueAtIndex:3 withValue:FALSE]; 2691 XCTAssertEqual(array.count, 4U); 2692 XCTAssertEqual([array valueAtIndex:0], TRUE); 2693 XCTAssertEqual([array valueAtIndex:1], TRUE); 2694 XCTAssertEqual([array valueAtIndex:2], FALSE); 2695 XCTAssertEqual([array valueAtIndex:3], FALSE); 2696 2697 XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:FALSE], 2698 NSException, NSRangeException); 2699 2700 [array exchangeValueAtIndex:1 withValueAtIndex:3]; 2701 XCTAssertEqual(array.count, 4U); 2702 XCTAssertEqual([array valueAtIndex:0], TRUE); 2703 XCTAssertEqual([array valueAtIndex:1], FALSE); 2704 XCTAssertEqual([array valueAtIndex:2], FALSE); 2705 XCTAssertEqual([array valueAtIndex:3], TRUE); 2706 2707 [array exchangeValueAtIndex:2 withValueAtIndex:0]; 2708 XCTAssertEqual(array.count, 4U); 2709 XCTAssertEqual([array valueAtIndex:0], FALSE); 2710 XCTAssertEqual([array valueAtIndex:1], FALSE); 2711 XCTAssertEqual([array valueAtIndex:2], TRUE); 2712 XCTAssertEqual([array valueAtIndex:3], TRUE); 2713 2714 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], 2715 NSException, NSRangeException); 2716 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], 2717 NSException, NSRangeException); 2718 [array release]; 2719} 2720 2721- (void)testInternalResizing { 2722 const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE }; 2723 GPBBoolArray *array = 2724 [[GPBBoolArray alloc] initWithValues:kValues 2725 count:GPBARRAYSIZE(kValues)]; 2726 XCTAssertNotNil(array); 2727 2728 // Add/remove to trigger the intneral buffer to grow/shrink. 2729 for (int i = 0; i < 100; ++i) { 2730 [array addValues:kValues count:GPBARRAYSIZE(kValues)]; 2731 } 2732 XCTAssertEqual(array.count, 404U); 2733 for (int i = 0; i < 100; ++i) { 2734 [array removeValueAtIndex:(i * 2)]; 2735 } 2736 XCTAssertEqual(array.count, 304U); 2737 for (int i = 0; i < 100; ++i) { 2738 [array insertValue:FALSE atIndex:(i * 3)]; 2739 } 2740 XCTAssertEqual(array.count, 404U); 2741 [array removeAll]; 2742 XCTAssertEqual(array.count, 0U); 2743 [array release]; 2744} 2745 2746@end 2747 2748//%PDDM-EXPAND ARRAY_TESTS2(Enum, int32_t, 71, 72, 73, 74, Raw) 2749// This block of code is generated, do not edit it directly. 2750 2751#pragma mark - Enum 2752 2753@interface GPBEnumArrayTests : XCTestCase 2754@end 2755 2756@implementation GPBEnumArrayTests 2757 2758- (void)testEmpty { 2759 GPBEnumArray *array = [[GPBEnumArray alloc] init]; 2760 XCTAssertNotNil(array); 2761 XCTAssertEqual(array.count, 0U); 2762 XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); 2763 [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 2764 #pragma unused(value, idx, stop) 2765 XCTFail(@"Shouldn't get here!"); 2766 }]; 2767 [array enumerateValuesWithOptions:NSEnumerationReverse 2768 usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 2769 #pragma unused(value, idx, stop) 2770 XCTFail(@"Shouldn't get here!"); 2771 }]; 2772 [array release]; 2773} 2774 2775- (void)testOne { 2776 GPBEnumArray *array = [GPBEnumArray arrayWithValue:71]; 2777 XCTAssertNotNil(array); 2778 XCTAssertEqual(array.count, 1U); 2779 XCTAssertEqual([array valueAtIndex:0], 71); 2780 XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); 2781 [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 2782 XCTAssertEqual(idx, 0U); 2783 XCTAssertEqual(value, 71); 2784 XCTAssertNotEqual(stop, NULL); 2785 }]; 2786 [array enumerateValuesWithOptions:NSEnumerationReverse 2787 usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 2788 XCTAssertEqual(idx, 0U); 2789 XCTAssertEqual(value, 71); 2790 XCTAssertNotEqual(stop, NULL); 2791 }]; 2792} 2793 2794- (void)testBasics { 2795 static const int32_t kValues[] = { 71, 72, 73, 74 }; 2796 GPBEnumArray *array = 2797 [[GPBEnumArray alloc] initWithValues:kValues 2798 count:GPBARRAYSIZE(kValues)]; 2799 XCTAssertNotNil(array); 2800 XCTAssertEqual(array.count, 4U); 2801 XCTAssertEqual([array valueAtIndex:0], 71); 2802 XCTAssertEqual([array valueAtIndex:1], 72); 2803 XCTAssertEqual([array valueAtIndex:2], 73); 2804 XCTAssertEqual([array valueAtIndex:3], 74); 2805 XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); 2806 __block NSUInteger idx2 = 0; 2807 [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 2808 XCTAssertEqual(idx, idx2); 2809 XCTAssertEqual(value, kValues[idx]); 2810 XCTAssertNotEqual(stop, NULL); 2811 ++idx2; 2812 }]; 2813 idx2 = 0; 2814 [array enumerateValuesWithOptions:NSEnumerationReverse 2815 usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 2816 XCTAssertEqual(idx, (3 - idx2)); 2817 XCTAssertEqual(value, kValues[idx]); 2818 XCTAssertNotEqual(stop, NULL); 2819 ++idx2; 2820 }]; 2821 // Stopping the enumeration. 2822 idx2 = 0; 2823 [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 2824 XCTAssertEqual(idx, idx2); 2825 XCTAssertEqual(value, kValues[idx]); 2826 XCTAssertNotEqual(stop, NULL); 2827 if (idx2 == 1) *stop = YES; 2828 XCTAssertNotEqual(idx, 2U); 2829 XCTAssertNotEqual(idx, 3U); 2830 ++idx2; 2831 }]; 2832 idx2 = 0; 2833 [array enumerateValuesWithOptions:NSEnumerationReverse 2834 usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 2835 XCTAssertEqual(idx, (3 - idx2)); 2836 XCTAssertEqual(value, kValues[idx]); 2837 XCTAssertNotEqual(stop, NULL); 2838 if (idx2 == 1) *stop = YES; 2839 XCTAssertNotEqual(idx, 1U); 2840 XCTAssertNotEqual(idx, 0U); 2841 ++idx2; 2842 }]; 2843 [array release]; 2844} 2845 2846- (void)testEquality { 2847 const int32_t kValues1[] = { 71, 72, 73 }; 2848 const int32_t kValues2[] = { 71, 74, 73 }; 2849 const int32_t kValues3[] = { 71, 72, 73, 74 }; 2850 GPBEnumArray *array1 = 2851 [[GPBEnumArray alloc] initWithValues:kValues1 2852 count:GPBARRAYSIZE(kValues1)]; 2853 XCTAssertNotNil(array1); 2854 GPBEnumArray *array1prime = 2855 [[GPBEnumArray alloc] initWithValues:kValues1 2856 count:GPBARRAYSIZE(kValues1)]; 2857 XCTAssertNotNil(array1prime); 2858 GPBEnumArray *array2 = 2859 [[GPBEnumArray alloc] initWithValues:kValues2 2860 count:GPBARRAYSIZE(kValues2)]; 2861 XCTAssertNotNil(array2); 2862 GPBEnumArray *array3 = 2863 [[GPBEnumArray alloc] initWithValues:kValues3 2864 count:GPBARRAYSIZE(kValues3)]; 2865 XCTAssertNotNil(array3); 2866 2867 // 1/1Prime should be different objects, but equal. 2868 XCTAssertNotEqual(array1, array1prime); 2869 XCTAssertEqualObjects(array1, array1prime); 2870 // Equal, so they must have same hash. 2871 XCTAssertEqual([array1 hash], [array1prime hash]); 2872 2873 // 1/2/3 shouldn't be equal. 2874 XCTAssertNotEqualObjects(array1, array2); 2875 XCTAssertNotEqualObjects(array1, array3); 2876 XCTAssertNotEqualObjects(array2, array3); 2877 2878 [array1 release]; 2879 [array1prime release]; 2880 [array2 release]; 2881 [array3 release]; 2882} 2883 2884- (void)testCopy { 2885 const int32_t kValues[] = { 71, 72, 73, 74 }; 2886 GPBEnumArray *array = 2887 [[GPBEnumArray alloc] initWithValues:kValues 2888 count:GPBARRAYSIZE(kValues)]; 2889 XCTAssertNotNil(array); 2890 2891 GPBEnumArray *array2 = [array copy]; 2892 XCTAssertNotNil(array2); 2893 2894 // Should be new object but equal. 2895 XCTAssertNotEqual(array, array2); 2896 XCTAssertEqualObjects(array, array2); 2897 [array2 release]; 2898 [array release]; 2899} 2900 2901- (void)testArrayFromArray { 2902 const int32_t kValues[] = { 71, 72, 73, 74 }; 2903 GPBEnumArray *array = 2904 [[GPBEnumArray alloc] initWithValues:kValues 2905 count:GPBARRAYSIZE(kValues)]; 2906 XCTAssertNotNil(array); 2907 2908 GPBEnumArray *array2 = [GPBEnumArray arrayWithValueArray:array]; 2909 XCTAssertNotNil(array2); 2910 2911 // Should be new pointer, but equal objects. 2912 XCTAssertNotEqual(array, array2); 2913 XCTAssertEqualObjects(array, array2); 2914 [array release]; 2915} 2916 2917- (void)testAdds { 2918 GPBEnumArray *array = [GPBEnumArray array]; 2919 XCTAssertNotNil(array); 2920 2921 XCTAssertEqual(array.count, 0U); 2922 [array addValue:71]; 2923 XCTAssertEqual(array.count, 1U); 2924 2925 const int32_t kValues1[] = { 72, 73 }; 2926 [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; 2927 XCTAssertEqual(array.count, 3U); 2928 2929 const int32_t kValues2[] = { 74, 71 }; 2930 GPBEnumArray *array2 = 2931 [[GPBEnumArray alloc] initWithValues:kValues2 2932 count:GPBARRAYSIZE(kValues2)]; 2933 XCTAssertNotNil(array2); 2934 [array addRawValuesFromArray:array2]; 2935 XCTAssertEqual(array.count, 5U); 2936 2937 XCTAssertEqual([array valueAtIndex:0], 71); 2938 XCTAssertEqual([array valueAtIndex:1], 72); 2939 XCTAssertEqual([array valueAtIndex:2], 73); 2940 XCTAssertEqual([array valueAtIndex:3], 74); 2941 XCTAssertEqual([array valueAtIndex:4], 71); 2942 [array2 release]; 2943} 2944 2945- (void)testInsert { 2946 const int32_t kValues[] = { 71, 72, 73 }; 2947 GPBEnumArray *array = 2948 [[GPBEnumArray alloc] initWithValues:kValues 2949 count:GPBARRAYSIZE(kValues)]; 2950 XCTAssertNotNil(array); 2951 XCTAssertEqual(array.count, 3U); 2952 2953 // First 2954 [array insertValue:74 atIndex:0]; 2955 XCTAssertEqual(array.count, 4U); 2956 2957 // Middle 2958 [array insertValue:74 atIndex:2]; 2959 XCTAssertEqual(array.count, 5U); 2960 2961 // End 2962 [array insertValue:74 atIndex:5]; 2963 XCTAssertEqual(array.count, 6U); 2964 2965 // Too far. 2966 XCTAssertThrowsSpecificNamed([array insertValue:74 atIndex:7], 2967 NSException, NSRangeException); 2968 2969 XCTAssertEqual([array valueAtIndex:0], 74); 2970 XCTAssertEqual([array valueAtIndex:1], 71); 2971 XCTAssertEqual([array valueAtIndex:2], 74); 2972 XCTAssertEqual([array valueAtIndex:3], 72); 2973 XCTAssertEqual([array valueAtIndex:4], 73); 2974 XCTAssertEqual([array valueAtIndex:5], 74); 2975 [array release]; 2976} 2977 2978- (void)testRemove { 2979 const int32_t kValues[] = { 74, 71, 72, 74, 73, 74 }; 2980 GPBEnumArray *array = 2981 [[GPBEnumArray alloc] initWithValues:kValues 2982 count:GPBARRAYSIZE(kValues)]; 2983 XCTAssertNotNil(array); 2984 XCTAssertEqual(array.count, 6U); 2985 2986 // First 2987 [array removeValueAtIndex:0]; 2988 XCTAssertEqual(array.count, 5U); 2989 XCTAssertEqual([array valueAtIndex:0], 71); 2990 2991 // Middle 2992 [array removeValueAtIndex:2]; 2993 XCTAssertEqual(array.count, 4U); 2994 XCTAssertEqual([array valueAtIndex:2], 73); 2995 2996 // End 2997 [array removeValueAtIndex:3]; 2998 XCTAssertEqual(array.count, 3U); 2999 3000 XCTAssertEqual([array valueAtIndex:0], 71); 3001 XCTAssertEqual([array valueAtIndex:1], 72); 3002 XCTAssertEqual([array valueAtIndex:2], 73); 3003 3004 // Too far. 3005 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], 3006 NSException, NSRangeException); 3007 3008 [array removeAll]; 3009 XCTAssertEqual(array.count, 0U); 3010 XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], 3011 NSException, NSRangeException); 3012 [array release]; 3013} 3014 3015- (void)testInplaceMutation { 3016 const int32_t kValues[] = { 71, 71, 73, 73 }; 3017 GPBEnumArray *array = 3018 [[GPBEnumArray alloc] initWithValues:kValues 3019 count:GPBARRAYSIZE(kValues)]; 3020 XCTAssertNotNil(array); 3021 3022 [array replaceValueAtIndex:1 withValue:72]; 3023 [array replaceValueAtIndex:3 withValue:74]; 3024 XCTAssertEqual(array.count, 4U); 3025 XCTAssertEqual([array valueAtIndex:0], 71); 3026 XCTAssertEqual([array valueAtIndex:1], 72); 3027 XCTAssertEqual([array valueAtIndex:2], 73); 3028 XCTAssertEqual([array valueAtIndex:3], 74); 3029 3030 XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:74], 3031 NSException, NSRangeException); 3032 3033 [array exchangeValueAtIndex:1 withValueAtIndex:3]; 3034 XCTAssertEqual(array.count, 4U); 3035 XCTAssertEqual([array valueAtIndex:0], 71); 3036 XCTAssertEqual([array valueAtIndex:1], 74); 3037 XCTAssertEqual([array valueAtIndex:2], 73); 3038 XCTAssertEqual([array valueAtIndex:3], 72); 3039 3040 [array exchangeValueAtIndex:2 withValueAtIndex:0]; 3041 XCTAssertEqual(array.count, 4U); 3042 XCTAssertEqual([array valueAtIndex:0], 73); 3043 XCTAssertEqual([array valueAtIndex:1], 74); 3044 XCTAssertEqual([array valueAtIndex:2], 71); 3045 XCTAssertEqual([array valueAtIndex:3], 72); 3046 3047 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], 3048 NSException, NSRangeException); 3049 XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], 3050 NSException, NSRangeException); 3051 [array release]; 3052} 3053 3054- (void)testInternalResizing { 3055 const int32_t kValues[] = { 71, 72, 73, 74 }; 3056 GPBEnumArray *array = 3057 [[GPBEnumArray alloc] initWithValues:kValues 3058 count:GPBARRAYSIZE(kValues)]; 3059 XCTAssertNotNil(array); 3060 3061 // Add/remove to trigger the intneral buffer to grow/shrink. 3062 for (int i = 0; i < 100; ++i) { 3063 [array addValues:kValues count:GPBARRAYSIZE(kValues)]; 3064 } 3065 XCTAssertEqual(array.count, 404U); 3066 for (int i = 0; i < 100; ++i) { 3067 [array removeValueAtIndex:(i * 2)]; 3068 } 3069 XCTAssertEqual(array.count, 304U); 3070 for (int i = 0; i < 100; ++i) { 3071 [array insertValue:74 atIndex:(i * 3)]; 3072 } 3073 XCTAssertEqual(array.count, 404U); 3074 [array removeAll]; 3075 XCTAssertEqual(array.count, 0U); 3076 [array release]; 3077} 3078 3079@end 3080 3081//%PDDM-EXPAND-END (8 expansions) 3082 3083#pragma mark - Non macro-based Enum tests 3084 3085// These are hand written tests to cover the verification and raw methods. 3086 3087@interface GPBEnumArrayCustomTests : XCTestCase 3088@end 3089 3090@implementation GPBEnumArrayCustomTests 3091 3092- (void)testRawBasics { 3093 static const int32_t kValues[] = { 71, 272, 73, 374 }; 3094 static const int32_t kValuesFiltered[] = { 3095 71, kGPBUnrecognizedEnumeratorValue, 73, kGPBUnrecognizedEnumeratorValue 3096 }; 3097 XCTAssertEqual(GPBARRAYSIZE(kValues), GPBARRAYSIZE(kValuesFiltered)); 3098 GPBEnumArray *array = 3099 [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue 3100 rawValues:kValues 3101 count:GPBARRAYSIZE(kValues)]; 3102 XCTAssertNotNil(array); 3103 XCTAssertEqual(array.count, 4U); 3104 GPBEnumValidationFunc func = TestingEnum_IsValidValue; 3105 XCTAssertEqual(array.validationFunc, func); 3106 XCTAssertEqual([array rawValueAtIndex:0], 71); 3107 XCTAssertEqual([array rawValueAtIndex:1], 272); 3108 XCTAssertEqual([array valueAtIndex:1], kGPBUnrecognizedEnumeratorValue); 3109 XCTAssertEqual([array rawValueAtIndex:2], 73); 3110 XCTAssertEqual([array rawValueAtIndex:3], 374); 3111 XCTAssertEqual([array valueAtIndex:3], kGPBUnrecognizedEnumeratorValue); 3112 XCTAssertThrowsSpecificNamed([array rawValueAtIndex:4], NSException, NSRangeException); 3113 __block NSUInteger idx2 = 0; 3114 [array enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 3115 XCTAssertEqual(idx, idx2); 3116 XCTAssertEqual(value, kValues[idx]); 3117 XCTAssertNotEqual(stop, NULL); 3118 ++idx2; 3119 }]; 3120 idx2 = 0; 3121 [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 3122 XCTAssertEqual(idx, idx2); 3123 XCTAssertEqual(value, kValuesFiltered[idx]); 3124 XCTAssertNotEqual(stop, NULL); 3125 ++idx2; 3126 }]; 3127 idx2 = 0; 3128 [array enumerateRawValuesWithOptions:NSEnumerationReverse 3129 usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 3130 XCTAssertEqual(idx, (3 - idx2)); 3131 XCTAssertEqual(value, kValues[idx]); 3132 XCTAssertNotEqual(stop, NULL); 3133 ++idx2; 3134 }]; 3135 idx2 = 0; 3136 [array enumerateValuesWithOptions:NSEnumerationReverse 3137 usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 3138 XCTAssertEqual(idx, (3 - idx2)); 3139 XCTAssertEqual(value, kValuesFiltered[idx]); 3140 XCTAssertNotEqual(stop, NULL); 3141 ++idx2; 3142 }]; 3143 // Stopping the enumeration. 3144 idx2 = 0; 3145 [array enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 3146 XCTAssertEqual(idx, idx2); 3147 XCTAssertEqual(value, kValues[idx]); 3148 XCTAssertNotEqual(stop, NULL); 3149 if (idx2 == 1) *stop = YES; 3150 XCTAssertNotEqual(idx, 2U); 3151 XCTAssertNotEqual(idx, 3U); 3152 ++idx2; 3153 }]; 3154 idx2 = 0; 3155 [array enumerateRawValuesWithOptions:NSEnumerationReverse 3156 usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { 3157 XCTAssertEqual(idx, (3 - idx2)); 3158 XCTAssertEqual(value, kValues[idx]); 3159 XCTAssertNotEqual(stop, NULL); 3160 if (idx2 == 1) *stop = YES; 3161 XCTAssertNotEqual(idx, 1U); 3162 XCTAssertNotEqual(idx, 0U); 3163 ++idx2; 3164 }]; 3165 [array release]; 3166} 3167 3168- (void)testEquality { 3169 const int32_t kValues1[] = { 71, 72, 173 }; // With unknown value 3170 const int32_t kValues2[] = { 71, 74, 173 }; // With unknown value 3171 const int32_t kValues3[] = { 71, 72, 173, 74 }; // With unknown value 3172 GPBEnumArray *array1 = 3173 [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue 3174 rawValues:kValues1 3175 count:GPBARRAYSIZE(kValues1)]; 3176 XCTAssertNotNil(array1); 3177 GPBEnumArray *array1prime = 3178 [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue2 3179 rawValues:kValues1 3180 count:GPBARRAYSIZE(kValues1)]; 3181 XCTAssertNotNil(array1prime); 3182 GPBEnumArray *array2 = 3183 [[GPBEnumArray alloc] initWithValues:kValues2 3184 count:GPBARRAYSIZE(kValues2)]; 3185 XCTAssertNotNil(array2); 3186 GPBEnumArray *array3 = 3187 [[GPBEnumArray alloc] initWithValues:kValues3 3188 count:GPBARRAYSIZE(kValues3)]; 3189 XCTAssertNotNil(array3); 3190 3191 // 1/1Prime should be different objects, but equal. 3192 XCTAssertNotEqual(array1, array1prime); 3193 XCTAssertEqualObjects(array1, array1prime); 3194 // Equal, so they must have same hash. 3195 XCTAssertEqual([array1 hash], [array1prime hash]); 3196 // But different validation functions. 3197 XCTAssertNotEqual(array1.validationFunc, array1prime.validationFunc); 3198 3199 // 1/2/3 shouldn't be equal. 3200 XCTAssertNotEqualObjects(array1, array2); 3201 XCTAssertNotEqualObjects(array1, array3); 3202 XCTAssertNotEqualObjects(array2, array3); 3203 3204 [array1 release]; 3205 [array1prime release]; 3206 [array2 release]; 3207 [array3 release]; 3208} 3209 3210- (void)testCopy { 3211 const int32_t kValues[] = { 71, 72 }; 3212 GPBEnumArray *array = 3213 [[GPBEnumArray alloc] initWithValues:kValues 3214 count:GPBARRAYSIZE(kValues)]; 3215 XCTAssertNotNil(array); 3216 3217 [array addRawValue:1000]; // Unknown 3218 XCTAssertEqual(array.count, 3U); 3219 XCTAssertEqual([array rawValueAtIndex:0], 71); 3220 XCTAssertEqual([array rawValueAtIndex:1], 72); 3221 XCTAssertEqual([array rawValueAtIndex:2], 1000); 3222 XCTAssertEqual([array valueAtIndex:2], kGPBUnrecognizedEnumeratorValue); 3223 3224 GPBEnumArray *array2 = [array copy]; 3225 XCTAssertNotNil(array2); 3226 3227 // Should be new object but equal. 3228 XCTAssertNotEqual(array, array2); 3229 XCTAssertEqualObjects(array, array2); 3230 XCTAssertEqual(array.validationFunc, array2.validationFunc); 3231 XCTAssertTrue([array2 isKindOfClass:[GPBEnumArray class]]); 3232 XCTAssertEqual(array2.count, 3U); 3233 XCTAssertEqual([array2 rawValueAtIndex:0], 71); 3234 XCTAssertEqual([array2 rawValueAtIndex:1], 72); 3235 XCTAssertEqual([array2 rawValueAtIndex:2], 1000); 3236 XCTAssertEqual([array2 valueAtIndex:2], kGPBUnrecognizedEnumeratorValue); 3237 [array2 release]; 3238 [array release]; 3239} 3240 3241- (void)testArrayFromArray { 3242 const int32_t kValues[] = { 71, 172, 173, 74 }; // Unknowns 3243 GPBEnumArray *array = 3244 [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue 3245 rawValues:kValues 3246 count:GPBARRAYSIZE(kValues)]; 3247 XCTAssertNotNil(array); 3248 3249 GPBEnumArray *array2 = [GPBEnumArray arrayWithValueArray:array]; 3250 XCTAssertNotNil(array2); 3251 3252 // Should be new pointer, but equal objects. 3253 XCTAssertNotEqual(array, array2); 3254 XCTAssertEqualObjects(array, array2); 3255 XCTAssertEqual(array.validationFunc, array2.validationFunc); 3256 [array release]; 3257} 3258 3259- (void)testUnknownAdds { 3260 GPBEnumArray *array = 3261 [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue]; 3262 XCTAssertNotNil(array); 3263 3264 XCTAssertThrowsSpecificNamed([array addValue:172], 3265 NSException, NSInvalidArgumentException); 3266 XCTAssertEqual(array.count, 0U); 3267 3268 const int32_t kValues1[] = { 172, 173 }; // Unknown 3269 XCTAssertThrowsSpecificNamed([array addValues:kValues1 count:GPBARRAYSIZE(kValues1)], 3270 NSException, NSInvalidArgumentException); 3271 XCTAssertEqual(array.count, 0U); 3272 [array release]; 3273} 3274 3275- (void)testRawAdds { 3276 GPBEnumArray *array = 3277 [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue]; 3278 XCTAssertNotNil(array); 3279 3280 XCTAssertEqual(array.count, 0U); 3281 [array addRawValue:71]; // Valid 3282 XCTAssertEqual(array.count, 1U); 3283 3284 const int32_t kValues1[] = { 172, 173 }; // Unknown 3285 [array addRawValues:kValues1 count:GPBARRAYSIZE(kValues1)]; 3286 XCTAssertEqual(array.count, 3U); 3287 3288 const int32_t kValues2[] = { 74, 71 }; 3289 GPBEnumArray *array2 = 3290 [[GPBEnumArray alloc] initWithValues:kValues2 3291 count:GPBARRAYSIZE(kValues2)]; 3292 XCTAssertNotNil(array2); 3293 [array addRawValuesFromArray:array2]; 3294 XCTAssertEqual(array.count, 5U); 3295 3296 XCTAssertEqual([array rawValueAtIndex:0], 71); 3297 XCTAssertEqual([array rawValueAtIndex:1], 172); 3298 XCTAssertEqual([array valueAtIndex:1], kGPBUnrecognizedEnumeratorValue); 3299 XCTAssertEqual([array rawValueAtIndex:2], 173); 3300 XCTAssertEqual([array valueAtIndex:2], kGPBUnrecognizedEnumeratorValue); 3301 XCTAssertEqual([array rawValueAtIndex:3], 74); 3302 XCTAssertEqual([array rawValueAtIndex:4], 71); 3303 [array release]; 3304} 3305 3306- (void)testUnknownInserts { 3307 const int32_t kValues[] = { 71, 72, 73 }; 3308 GPBEnumArray *array = 3309 [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue 3310 rawValues:kValues 3311 count:GPBARRAYSIZE(kValues)]; 3312 XCTAssertNotNil(array); 3313 XCTAssertEqual(array.count, 3U); 3314 3315 // First 3316 XCTAssertThrowsSpecificNamed([array insertValue:174 atIndex:0], 3317 NSException, NSInvalidArgumentException); 3318 XCTAssertEqual(array.count, 3U); 3319 3320 // Middle 3321 XCTAssertThrowsSpecificNamed([array insertValue:274 atIndex:1], 3322 NSException, NSInvalidArgumentException); 3323 XCTAssertEqual(array.count, 3U); 3324 3325 // End 3326 XCTAssertThrowsSpecificNamed([array insertValue:374 atIndex:3], 3327 NSException, NSInvalidArgumentException); 3328 XCTAssertEqual(array.count, 3U); 3329 [array release]; 3330} 3331 3332- (void)testRawInsert { 3333 const int32_t kValues[] = { 71, 72, 73 }; 3334 GPBEnumArray *array = 3335 [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue 3336 rawValues:kValues 3337 count:GPBARRAYSIZE(kValues)]; 3338 XCTAssertNotNil(array); 3339 XCTAssertEqual(array.count, 3U); 3340 3341 // First 3342 [array insertRawValue:174 atIndex:0]; // Unknown 3343 XCTAssertEqual(array.count, 4U); 3344 3345 // Middle 3346 [array insertRawValue:274 atIndex:2]; // Unknown 3347 XCTAssertEqual(array.count, 5U); 3348 3349 // End 3350 [array insertRawValue:374 atIndex:5]; // Unknown 3351 XCTAssertEqual(array.count, 6U); 3352 3353 // Too far. 3354 XCTAssertThrowsSpecificNamed([array insertRawValue:74 atIndex:7], 3355 NSException, NSRangeException); 3356 3357 XCTAssertEqual([array rawValueAtIndex:0], 174); 3358 XCTAssertEqual([array valueAtIndex:0], kGPBUnrecognizedEnumeratorValue); 3359 XCTAssertEqual([array rawValueAtIndex:1], 71); 3360 XCTAssertEqual([array rawValueAtIndex:2], 274); 3361 XCTAssertEqual([array valueAtIndex:2], kGPBUnrecognizedEnumeratorValue); 3362 XCTAssertEqual([array rawValueAtIndex:3], 72); 3363 XCTAssertEqual([array rawValueAtIndex:4], 73); 3364 XCTAssertEqual([array rawValueAtIndex:5], 374); 3365 XCTAssertEqual([array valueAtIndex:5], kGPBUnrecognizedEnumeratorValue); 3366 [array release]; 3367} 3368 3369- (void)testUnknownInplaceMutation { 3370 const int32_t kValues[] = { 71, 72, 73, 74 }; 3371 GPBEnumArray *array = 3372 [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue 3373 rawValues:kValues 3374 count:GPBARRAYSIZE(kValues)]; 3375 XCTAssertNotNil(array); 3376 3377 XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:1 withValue:172], 3378 NSException, NSInvalidArgumentException); 3379 XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:3 withValue:274], 3380 NSException, NSInvalidArgumentException); 3381 XCTAssertEqual(array.count, 4U); 3382 XCTAssertEqual([array valueAtIndex:0], 71); 3383 XCTAssertEqual([array valueAtIndex:1], 72); 3384 XCTAssertEqual([array valueAtIndex:2], 73); 3385 XCTAssertEqual([array valueAtIndex:3], 74); 3386 [array release]; 3387} 3388 3389 3390- (void)testRawInplaceMutation { 3391 const int32_t kValues[] = { 71, 72, 73, 74 }; 3392 GPBEnumArray *array = 3393 [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue 3394 rawValues:kValues 3395 count:GPBARRAYSIZE(kValues)]; 3396 XCTAssertNotNil(array); 3397 3398 [array replaceValueAtIndex:1 withRawValue:172]; // Unknown 3399 [array replaceValueAtIndex:3 withRawValue:274]; // Unknown 3400 XCTAssertEqual(array.count, 4U); 3401 XCTAssertEqual([array rawValueAtIndex:0], 71); 3402 XCTAssertEqual([array rawValueAtIndex:1], 172); 3403 XCTAssertEqual([array valueAtIndex:1], kGPBUnrecognizedEnumeratorValue); 3404 XCTAssertEqual([array rawValueAtIndex:2], 73); 3405 XCTAssertEqual([array rawValueAtIndex:3], 274); 3406 XCTAssertEqual([array valueAtIndex:3], kGPBUnrecognizedEnumeratorValue); 3407 3408 XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withRawValue:74], 3409 NSException, NSRangeException); 3410 [array release]; 3411} 3412 3413- (void)testRawInternalResizing { 3414 const int32_t kValues[] = { 71, 172, 173, 74 }; // Unknown 3415 GPBEnumArray *array = 3416 [[GPBEnumArray alloc] initWithValues:kValues 3417 count:GPBARRAYSIZE(kValues)]; 3418 XCTAssertNotNil(array); 3419 3420 // Add/remove to trigger the intneral buffer to grow/shrink. 3421 for (int i = 0; i < 100; ++i) { 3422 [array addRawValues:kValues count:GPBARRAYSIZE(kValues)]; 3423 } 3424 XCTAssertEqual(array.count, 404U); 3425 for (int i = 0; i < 100; ++i) { 3426 [array removeValueAtIndex:(i * 2)]; 3427 } 3428 XCTAssertEqual(array.count, 304U); 3429 for (int i = 0; i < 100; ++i) { 3430 [array insertRawValue:274 atIndex:(i * 3)]; // Unknown 3431 } 3432 XCTAssertEqual(array.count, 404U); 3433 [array removeAll]; 3434 XCTAssertEqual(array.count, 0U); 3435 [array release]; 3436} 3437 3438@end 3439