xref: /aosp_15_r20/external/protobuf/objectivec/Tests/GPBArrayTests.m (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format
2*1b3f573fSAndroid Build Coastguard Worker// Copyright 2015 Google Inc.  All rights reserved.
3*1b3f573fSAndroid Build Coastguard Worker// https://developers.google.com/protocol-buffers/
4*1b3f573fSAndroid Build Coastguard Worker//
5*1b3f573fSAndroid Build Coastguard Worker// Redistribution and use in source and binary forms, with or without
6*1b3f573fSAndroid Build Coastguard Worker// modification, are permitted provided that the following conditions are
7*1b3f573fSAndroid Build Coastguard Worker// met:
8*1b3f573fSAndroid Build Coastguard Worker//
9*1b3f573fSAndroid Build Coastguard Worker//     * Redistributions of source code must retain the above copyright
10*1b3f573fSAndroid Build Coastguard Worker// notice, this list of conditions and the following disclaimer.
11*1b3f573fSAndroid Build Coastguard Worker//     * Redistributions in binary form must reproduce the above
12*1b3f573fSAndroid Build Coastguard Worker// copyright notice, this list of conditions and the following disclaimer
13*1b3f573fSAndroid Build Coastguard Worker// in the documentation and/or other materials provided with the
14*1b3f573fSAndroid Build Coastguard Worker// distribution.
15*1b3f573fSAndroid Build Coastguard Worker//     * Neither the name of Google Inc. nor the names of its
16*1b3f573fSAndroid Build Coastguard Worker// contributors may be used to endorse or promote products derived from
17*1b3f573fSAndroid Build Coastguard Worker// this software without specific prior written permission.
18*1b3f573fSAndroid Build Coastguard Worker//
19*1b3f573fSAndroid Build Coastguard Worker// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*1b3f573fSAndroid Build Coastguard Worker// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*1b3f573fSAndroid Build Coastguard Worker// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23*1b3f573fSAndroid Build Coastguard Worker// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*1b3f573fSAndroid Build Coastguard Worker// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*1b3f573fSAndroid Build Coastguard Worker// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*1b3f573fSAndroid Build Coastguard Worker// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*1b3f573fSAndroid Build Coastguard Worker// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29*1b3f573fSAndroid Build Coastguard Worker// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*1b3f573fSAndroid Build Coastguard Worker
31*1b3f573fSAndroid Build Coastguard Worker#import <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