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