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