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