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