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