| // Protocol Buffers - Google's data interchange format |
| // Copyright 2015 Google Inc. All rights reserved. |
| // |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file or at |
| // https://developers.google.com/open-source/licenses/bsd |
| |
| #import <Foundation/Foundation.h> |
| #import <XCTest/XCTest.h> |
| |
| #import "GPBArray.h" |
| #import "GPBArray_PackagePrivate.h" |
| |
| #import "GPBTestUtilities.h" |
| |
| // To let the testing macros work, add some extra methods to simplify things. |
| @interface GPBEnumArray (TestingTweak) |
| + (instancetype)arrayWithValue:(int32_t)value; |
| + (instancetype)arrayWithCapacity:(NSUInteger)count; |
| - (instancetype)initWithValues:(const int32_t[])values count:(NSUInteger)count; |
| @end |
| |
| static BOOL TestingEnum_IsValidValue(int32_t value) { |
| switch (value) { |
| case 71: |
| case 72: |
| case 73: |
| case 74: |
| return YES; |
| default: |
| return NO; |
| } |
| } |
| |
| static BOOL TestingEnum_IsValidValue2(int32_t value) { |
| switch (value) { |
| case 71: |
| case 72: |
| case 73: |
| return YES; |
| default: |
| return NO; |
| } |
| } |
| |
| @implementation GPBEnumArray (TestingTweak) |
| + (instancetype)arrayWithValue:(int32_t)value { |
| return [[[self alloc] initWithValidationFunction:TestingEnum_IsValidValue |
| rawValues:&value |
| count:1] autorelease]; |
| } |
| + (instancetype)arrayWithCapacity:(NSUInteger)count { |
| return [[[self alloc] initWithValidationFunction:TestingEnum_IsValidValue |
| capacity:count] autorelease]; |
| } |
| - (instancetype)initWithValues:(const int32_t[])values count:(NSUInteger)count { |
| return [self initWithValidationFunction:TestingEnum_IsValidValue rawValues:values count:count]; |
| } |
| @end |
| |
| #pragma mark - PDDM Macros |
| |
| // Disable clang-format for the macros. |
| // clang-format off |
| |
| //%PDDM-DEFINE ARRAY_TESTS(NAME, TYPE, VAL1, VAL2, VAL3, VAL4) |
| //%ARRAY_TESTS2(NAME, TYPE, VAL1, VAL2, VAL3, VAL4, ) |
| //%PDDM-DEFINE ARRAY_TESTS2(NAME, TYPE, VAL1, VAL2, VAL3, VAL4, HELPER) |
| //%#pragma mark - NAME |
| //% |
| //%@interface GPB##NAME##ArrayTests : XCTestCase |
| //%@end |
| //% |
| //%@implementation GPB##NAME##ArrayTests |
| //% |
| //%- (void)testEmpty { |
| //% GPB##NAME##Array *array = [[GPB##NAME##Array alloc] init]; |
| //% XCTAssertNotNil(array); |
| //% XCTAssertEqual(array.count, 0U); |
| //% XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); |
| //% [array enumerateValuesWithBlock:^(__unused TYPE value, __unused NSUInteger idx, __unused BOOL *stop) { |
| //% XCTFail(@"Shouldn't get here!"); |
| //% }]; |
| //% [array enumerateValuesWithOptions:NSEnumerationReverse |
| //% usingBlock:^(__unused TYPE value, __unused NSUInteger idx, __unused BOOL *stop) { |
| //% XCTFail(@"Shouldn't get here!"); |
| //% }]; |
| //% [array release]; |
| //%} |
| //% |
| //%- (void)testOne { |
| //% GPB##NAME##Array *array = [GPB##NAME##Array arrayWithValue:VAL1]; |
| //% XCTAssertNotNil(array); |
| //% XCTAssertEqual(array.count, 1U); |
| //% XCTAssertEqual([array valueAtIndex:0], VAL1); |
| //% XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); |
| //% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { |
| //% XCTAssertEqual(idx, 0U); |
| //% XCTAssertEqual(value, VAL1); |
| //% XCTAssertNotEqual(stop, NULL); |
| //% }]; |
| //% [array enumerateValuesWithOptions:NSEnumerationReverse |
| //% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { |
| //% XCTAssertEqual(idx, 0U); |
| //% XCTAssertEqual(value, VAL1); |
| //% XCTAssertNotEqual(stop, NULL); |
| //% }]; |
| //%} |
| //% |
| //%- (void)testBasics { |
| //% static const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 }; |
| //% GPB##NAME##Array *array = |
| //% [[GPB##NAME##Array alloc] initWithValues:kValues |
| //% NAME$S count:GPBARRAYSIZE(kValues)]; |
| //% XCTAssertNotNil(array); |
| //% XCTAssertEqual(array.count, 4U); |
| //% XCTAssertEqual([array valueAtIndex:0], VAL1); |
| //% XCTAssertEqual([array valueAtIndex:1], VAL2); |
| //% XCTAssertEqual([array valueAtIndex:2], VAL3); |
| //% XCTAssertEqual([array valueAtIndex:3], VAL4); |
| //% XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); |
| //% __block NSUInteger idx2 = 0; |
| //% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { |
| //% XCTAssertEqual(idx, idx2); |
| //% XCTAssertEqual(value, kValues[idx]); |
| //% XCTAssertNotEqual(stop, NULL); |
| //% ++idx2; |
| //% }]; |
| //% idx2 = 0; |
| //% [array enumerateValuesWithOptions:NSEnumerationReverse |
| //% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { |
| //% XCTAssertEqual(idx, (3 - idx2)); |
| //% XCTAssertEqual(value, kValues[idx]); |
| //% XCTAssertNotEqual(stop, NULL); |
| //% ++idx2; |
| //% }]; |
| //% // Stopping the enumeration. |
| //% idx2 = 0; |
| //% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { |
| //% XCTAssertEqual(idx, idx2); |
| //% XCTAssertEqual(value, kValues[idx]); |
| //% XCTAssertNotEqual(stop, NULL); |
| //% if (idx2 == 1) *stop = YES; |
| //% XCTAssertNotEqual(idx, 2U); |
| //% XCTAssertNotEqual(idx, 3U); |
| //% ++idx2; |
| //% }]; |
| //% idx2 = 0; |
| //% [array enumerateValuesWithOptions:NSEnumerationReverse |
| //% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { |
| //% XCTAssertEqual(idx, (3 - idx2)); |
| //% XCTAssertEqual(value, kValues[idx]); |
| //% XCTAssertNotEqual(stop, NULL); |
| //% if (idx2 == 1) *stop = YES; |
| //% XCTAssertNotEqual(idx, 1U); |
| //% XCTAssertNotEqual(idx, 0U); |
| //% ++idx2; |
| //% }]; |
| //% // Ensure description doesn't choke. |
| //% XCTAssertTrue(array.description.length > 10); |
| //% [array release]; |
| //%} |
| //% |
| //%- (void)testEquality { |
| //% const TYPE kValues1[] = { VAL1, VAL2, VAL3 }; |
| //% const TYPE kValues2[] = { VAL1, VAL4, VAL3 }; |
| //% const TYPE kValues3[] = { VAL1, VAL2, VAL3, VAL4 }; |
| //% GPB##NAME##Array *array1 = |
| //% [[GPB##NAME##Array alloc] initWithValues:kValues1 |
| //% NAME$S count:GPBARRAYSIZE(kValues1)]; |
| //% XCTAssertNotNil(array1); |
| //% GPB##NAME##Array *array1prime = |
| //% [[GPB##NAME##Array alloc] initWithValues:kValues1 |
| //% NAME$S count:GPBARRAYSIZE(kValues1)]; |
| //% XCTAssertNotNil(array1prime); |
| //% GPB##NAME##Array *array2 = |
| //% [[GPB##NAME##Array alloc] initWithValues:kValues2 |
| //% NAME$S count:GPBARRAYSIZE(kValues2)]; |
| //% XCTAssertNotNil(array2); |
| //% GPB##NAME##Array *array3 = |
| //% [[GPB##NAME##Array alloc] initWithValues:kValues3 |
| //% NAME$S count:GPBARRAYSIZE(kValues3)]; |
| //% XCTAssertNotNil(array3); |
| //% |
| //% // Identity |
| //% XCTAssertTrue([array1 isEqual:array1]); |
| //% // Wrong type doesn't blow up. |
| //% XCTAssertFalse([array1 isEqual:@"bogus"]); |
| //% // 1/1Prime should be different objects, but equal. |
| //% XCTAssertNotEqual(array1, array1prime); |
| //% XCTAssertEqualObjects(array1, array1prime); |
| //% // Equal, so they must have same hash. |
| //% XCTAssertEqual([array1 hash], [array1prime hash]); |
| //% |
| //% // 1/2/3 shouldn't be equal. |
| //% XCTAssertNotEqualObjects(array1, array2); |
| //% XCTAssertNotEqualObjects(array1, array3); |
| //% XCTAssertNotEqualObjects(array2, array3); |
| //% |
| //% [array1 release]; |
| //% [array1prime release]; |
| //% [array2 release]; |
| //% [array3 release]; |
| //%} |
| //% |
| //%- (void)testCopy { |
| //% const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 }; |
| //% GPB##NAME##Array *array = |
| //% [[GPB##NAME##Array alloc] initWithValues:kValues |
| //% NAME$S count:GPBARRAYSIZE(kValues)]; |
| //% XCTAssertNotNil(array); |
| //% |
| //% GPB##NAME##Array *array2 = [array copy]; |
| //% XCTAssertNotNil(array2); |
| //% |
| //% // Should be new object but equal. |
| //% XCTAssertNotEqual(array, array2); |
| //% XCTAssertEqualObjects(array, array2); |
| //% [array2 release]; |
| //% [array release]; |
| //%} |
| //% |
| //%- (void)testArrayFromArray { |
| //% const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 }; |
| //% GPB##NAME##Array *array = |
| //% [[GPB##NAME##Array alloc] initWithValues:kValues |
| //% NAME$S count:GPBARRAYSIZE(kValues)]; |
| //% XCTAssertNotNil(array); |
| //% |
| //% GPB##NAME##Array *array2 = [GPB##NAME##Array arrayWithValueArray:array]; |
| //% XCTAssertNotNil(array2); |
| //% |
| //% // Should be new pointer, but equal objects. |
| //% XCTAssertNotEqual(array, array2); |
| //% XCTAssertEqualObjects(array, array2); |
| //% [array release]; |
| //%} |
| //% |
| //%- (void)testAdds { |
| //% GPB##NAME##Array *array = [GPB##NAME##Array array]; |
| //% XCTAssertNotNil(array); |
| //% |
| //% XCTAssertEqual(array.count, 0U); |
| //% [array addValue:VAL1]; |
| //% XCTAssertEqual(array.count, 1U); |
| //% |
| //% const TYPE kValues1[] = { VAL2, VAL3 }; |
| //% [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; |
| //% XCTAssertEqual(array.count, 3U); |
| //% |
| //% const TYPE kValues2[] = { VAL4, VAL1 }; |
| //% GPB##NAME##Array *array2 = |
| //% [[GPB##NAME##Array alloc] initWithValues:kValues2 |
| //% NAME$S count:GPBARRAYSIZE(kValues2)]; |
| //% XCTAssertNotNil(array2); |
| //% [array add##HELPER##ValuesFromArray:array2]; |
| //% XCTAssertEqual(array.count, 5U); |
| //% |
| //% // Zero/nil inputs do nothing. |
| //% [array addValues:kValues1 count:0]; |
| //% XCTAssertEqual(array.count, 5U); |
| //% [array addValues:NULL count:5]; |
| //% XCTAssertEqual(array.count, 5U); |
| //% |
| //% XCTAssertEqual([array valueAtIndex:0], VAL1); |
| //% XCTAssertEqual([array valueAtIndex:1], VAL2); |
| //% XCTAssertEqual([array valueAtIndex:2], VAL3); |
| //% XCTAssertEqual([array valueAtIndex:3], VAL4); |
| //% XCTAssertEqual([array valueAtIndex:4], VAL1); |
| //% [array2 release]; |
| //%} |
| //% |
| //%- (void)testInsert { |
| //% const TYPE kValues[] = { VAL1, VAL2, VAL3 }; |
| //% GPB##NAME##Array *array = |
| //% [[GPB##NAME##Array alloc] initWithValues:kValues |
| //% NAME$S count:GPBARRAYSIZE(kValues)]; |
| //% XCTAssertNotNil(array); |
| //% XCTAssertEqual(array.count, 3U); |
| //% |
| //% // First |
| //% [array insertValue:VAL4 atIndex:0]; |
| //% XCTAssertEqual(array.count, 4U); |
| //% |
| //% // Middle |
| //% [array insertValue:VAL4 atIndex:2]; |
| //% XCTAssertEqual(array.count, 5U); |
| //% |
| //% // End |
| //% [array insertValue:VAL4 atIndex:5]; |
| //% XCTAssertEqual(array.count, 6U); |
| //% |
| //% // Too far. |
| //% XCTAssertThrowsSpecificNamed([array insertValue:VAL4 atIndex:7], |
| //% NSException, NSRangeException); |
| //% |
| //% XCTAssertEqual([array valueAtIndex:0], VAL4); |
| //% XCTAssertEqual([array valueAtIndex:1], VAL1); |
| //% XCTAssertEqual([array valueAtIndex:2], VAL4); |
| //% XCTAssertEqual([array valueAtIndex:3], VAL2); |
| //% XCTAssertEqual([array valueAtIndex:4], VAL3); |
| //% XCTAssertEqual([array valueAtIndex:5], VAL4); |
| //% [array release]; |
| //%} |
| //% |
| //%- (void)testRemove { |
| //% const TYPE kValues[] = { VAL4, VAL1, VAL2, VAL4, VAL3, VAL4 }; |
| //% GPB##NAME##Array *array = |
| //% [[GPB##NAME##Array alloc] initWithValues:kValues |
| //% NAME$S count:GPBARRAYSIZE(kValues)]; |
| //% XCTAssertNotNil(array); |
| //% XCTAssertEqual(array.count, 6U); |
| //% |
| //% // First |
| //% [array removeValueAtIndex:0]; |
| //% XCTAssertEqual(array.count, 5U); |
| //% XCTAssertEqual([array valueAtIndex:0], VAL1); |
| //% |
| //% // Middle |
| //% [array removeValueAtIndex:2]; |
| //% XCTAssertEqual(array.count, 4U); |
| //% XCTAssertEqual([array valueAtIndex:2], VAL3); |
| //% |
| //% // End |
| //% [array removeValueAtIndex:3]; |
| //% XCTAssertEqual(array.count, 3U); |
| //% |
| //% XCTAssertEqual([array valueAtIndex:0], VAL1); |
| //% XCTAssertEqual([array valueAtIndex:1], VAL2); |
| //% XCTAssertEqual([array valueAtIndex:2], VAL3); |
| //% |
| //% // Too far. |
| //% XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], |
| //% NSException, NSRangeException); |
| //% |
| //% [array removeAll]; |
| //% XCTAssertEqual(array.count, 0U); |
| //% XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], |
| //% NSException, NSRangeException); |
| //% [array release]; |
| //%} |
| //% |
| //%- (void)testInplaceMutation { |
| //% const TYPE kValues[] = { VAL1, VAL1, VAL3, VAL3 }; |
| //% GPB##NAME##Array *array = |
| //% [[GPB##NAME##Array alloc] initWithValues:kValues |
| //% NAME$S count:GPBARRAYSIZE(kValues)]; |
| //% XCTAssertNotNil(array); |
| //% |
| //% [array replaceValueAtIndex:1 withValue:VAL2]; |
| //% [array replaceValueAtIndex:3 withValue:VAL4]; |
| //% XCTAssertEqual(array.count, 4U); |
| //% XCTAssertEqual([array valueAtIndex:0], VAL1); |
| //% XCTAssertEqual([array valueAtIndex:1], VAL2); |
| //% XCTAssertEqual([array valueAtIndex:2], VAL3); |
| //% XCTAssertEqual([array valueAtIndex:3], VAL4); |
| //% |
| //% XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:VAL4], |
| //% NSException, NSRangeException); |
| //% |
| //% [array exchangeValueAtIndex:1 withValueAtIndex:3]; |
| //% XCTAssertEqual(array.count, 4U); |
| //% XCTAssertEqual([array valueAtIndex:0], VAL1); |
| //% XCTAssertEqual([array valueAtIndex:1], VAL4); |
| //% XCTAssertEqual([array valueAtIndex:2], VAL3); |
| //% XCTAssertEqual([array valueAtIndex:3], VAL2); |
| //% |
| //% [array exchangeValueAtIndex:2 withValueAtIndex:0]; |
| //% XCTAssertEqual(array.count, 4U); |
| //% XCTAssertEqual([array valueAtIndex:0], VAL3); |
| //% XCTAssertEqual([array valueAtIndex:1], VAL4); |
| //% XCTAssertEqual([array valueAtIndex:2], VAL1); |
| //% XCTAssertEqual([array valueAtIndex:3], VAL2); |
| //% |
| //% XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], |
| //% NSException, NSRangeException); |
| //% XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], |
| //% NSException, NSRangeException); |
| //% [array release]; |
| //%} |
| //% |
| //%- (void)testInternalResizing { |
| //% const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 }; |
| //% GPB##NAME##Array *array = |
| //% [GPB##NAME##Array arrayWithCapacity:GPBARRAYSIZE(kValues)]; |
| //% XCTAssertNotNil(array); |
| //% [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| //% |
| //% // Add/remove to trigger the intneral buffer to grow/shrink. |
| //% for (int i = 0; i < 100; ++i) { |
| //% [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| //% } |
| //% XCTAssertEqual(array.count, 404U); |
| //% for (int i = 0; i < 100; ++i) { |
| //% [array removeValueAtIndex:(i * 2)]; |
| //% } |
| //% XCTAssertEqual(array.count, 304U); |
| //% for (int i = 0; i < 100; ++i) { |
| //% [array insertValue:VAL4 atIndex:(i * 3)]; |
| //% } |
| //% XCTAssertEqual(array.count, 404U); |
| //% [array removeAll]; |
| //% XCTAssertEqual(array.count, 0U); |
| //%} |
| //% |
| //%@end |
| //% |
| //%PDDM-EXPAND ARRAY_TESTS(Int32, int32_t, 1, 2, 3, 4) |
| // This block of code is generated, do not edit it directly. |
| |
| #pragma mark - Int32 |
| |
| @interface GPBInt32ArrayTests : XCTestCase |
| @end |
| |
| @implementation GPBInt32ArrayTests |
| |
| - (void)testEmpty { |
| GPBInt32Array *array = [[GPBInt32Array alloc] init]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(__unused int32_t value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(__unused int32_t value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array release]; |
| } |
| |
| - (void)testOne { |
| GPBInt32Array *array = [GPBInt32Array arrayWithValue:1]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 1U); |
| XCTAssertEqual([array valueAtIndex:0], 1); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 1); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 1); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| } |
| |
| - (void)testBasics { |
| static const int32_t kValues[] = { 1, 2, 3, 4 }; |
| GPBInt32Array *array = |
| [[GPBInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 1); |
| XCTAssertEqual([array valueAtIndex:1], 2); |
| XCTAssertEqual([array valueAtIndex:2], 3); |
| XCTAssertEqual([array valueAtIndex:3], 4); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); |
| __block NSUInteger idx2 = 0; |
| [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| // Stopping the enumeration. |
| idx2 = 0; |
| [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 2U); |
| XCTAssertNotEqual(idx, 3U); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 1U); |
| XCTAssertNotEqual(idx, 0U); |
| ++idx2; |
| }]; |
| // Ensure description doesn't choke. |
| XCTAssertTrue(array.description.length > 10); |
| [array release]; |
| } |
| |
| - (void)testEquality { |
| const int32_t kValues1[] = { 1, 2, 3 }; |
| const int32_t kValues2[] = { 1, 4, 3 }; |
| const int32_t kValues3[] = { 1, 2, 3, 4 }; |
| GPBInt32Array *array1 = |
| [[GPBInt32Array alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1); |
| GPBInt32Array *array1prime = |
| [[GPBInt32Array alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1prime); |
| GPBInt32Array *array2 = |
| [[GPBInt32Array alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| GPBInt32Array *array3 = |
| [[GPBInt32Array alloc] initWithValues:kValues3 |
| count:GPBARRAYSIZE(kValues3)]; |
| XCTAssertNotNil(array3); |
| |
| // Identity |
| XCTAssertTrue([array1 isEqual:array1]); |
| // Wrong type doesn't blow up. |
| XCTAssertFalse([array1 isEqual:@"bogus"]); |
| // 1/1Prime should be different objects, but equal. |
| XCTAssertNotEqual(array1, array1prime); |
| XCTAssertEqualObjects(array1, array1prime); |
| // Equal, so they must have same hash. |
| XCTAssertEqual([array1 hash], [array1prime hash]); |
| |
| // 1/2/3 shouldn't be equal. |
| XCTAssertNotEqualObjects(array1, array2); |
| XCTAssertNotEqualObjects(array1, array3); |
| XCTAssertNotEqualObjects(array2, array3); |
| |
| [array1 release]; |
| [array1prime release]; |
| [array2 release]; |
| [array3 release]; |
| } |
| |
| - (void)testCopy { |
| const int32_t kValues[] = { 1, 2, 3, 4 }; |
| GPBInt32Array *array = |
| [[GPBInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBInt32Array *array2 = [array copy]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new object but equal. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array2 release]; |
| [array release]; |
| } |
| |
| - (void)testArrayFromArray { |
| const int32_t kValues[] = { 1, 2, 3, 4 }; |
| GPBInt32Array *array = |
| [[GPBInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBInt32Array *array2 = [GPBInt32Array arrayWithValueArray:array]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new pointer, but equal objects. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array release]; |
| } |
| |
| - (void)testAdds { |
| GPBInt32Array *array = [GPBInt32Array array]; |
| XCTAssertNotNil(array); |
| |
| XCTAssertEqual(array.count, 0U); |
| [array addValue:1]; |
| XCTAssertEqual(array.count, 1U); |
| |
| const int32_t kValues1[] = { 2, 3 }; |
| [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertEqual(array.count, 3U); |
| |
| const int32_t kValues2[] = { 4, 1 }; |
| GPBInt32Array *array2 = |
| [[GPBInt32Array alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| [array addValuesFromArray:array2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // Zero/nil inputs do nothing. |
| [array addValues:kValues1 count:0]; |
| XCTAssertEqual(array.count, 5U); |
| [array addValues:NULL count:5]; |
| XCTAssertEqual(array.count, 5U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 1); |
| XCTAssertEqual([array valueAtIndex:1], 2); |
| XCTAssertEqual([array valueAtIndex:2], 3); |
| XCTAssertEqual([array valueAtIndex:3], 4); |
| XCTAssertEqual([array valueAtIndex:4], 1); |
| [array2 release]; |
| } |
| |
| - (void)testInsert { |
| const int32_t kValues[] = { 1, 2, 3 }; |
| GPBInt32Array *array = |
| [[GPBInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 3U); |
| |
| // First |
| [array insertValue:4 atIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| |
| // Middle |
| [array insertValue:4 atIndex:2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // End |
| [array insertValue:4 atIndex:5]; |
| XCTAssertEqual(array.count, 6U); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array insertValue:4 atIndex:7], |
| NSException, NSRangeException); |
| |
| XCTAssertEqual([array valueAtIndex:0], 4); |
| XCTAssertEqual([array valueAtIndex:1], 1); |
| XCTAssertEqual([array valueAtIndex:2], 4); |
| XCTAssertEqual([array valueAtIndex:3], 2); |
| XCTAssertEqual([array valueAtIndex:4], 3); |
| XCTAssertEqual([array valueAtIndex:5], 4); |
| [array release]; |
| } |
| |
| - (void)testRemove { |
| const int32_t kValues[] = { 4, 1, 2, 4, 3, 4 }; |
| GPBInt32Array *array = |
| [[GPBInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 6U); |
| |
| // First |
| [array removeValueAtIndex:0]; |
| XCTAssertEqual(array.count, 5U); |
| XCTAssertEqual([array valueAtIndex:0], 1); |
| |
| // Middle |
| [array removeValueAtIndex:2]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:2], 3); |
| |
| // End |
| [array removeValueAtIndex:3]; |
| XCTAssertEqual(array.count, 3U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 1); |
| XCTAssertEqual([array valueAtIndex:1], 2); |
| XCTAssertEqual([array valueAtIndex:2], 3); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], |
| NSException, NSRangeException); |
| |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInplaceMutation { |
| const int32_t kValues[] = { 1, 1, 3, 3 }; |
| GPBInt32Array *array = |
| [[GPBInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| [array replaceValueAtIndex:1 withValue:2]; |
| [array replaceValueAtIndex:3 withValue:4]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 1); |
| XCTAssertEqual([array valueAtIndex:1], 2); |
| XCTAssertEqual([array valueAtIndex:2], 3); |
| XCTAssertEqual([array valueAtIndex:3], 4); |
| |
| XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:4], |
| NSException, NSRangeException); |
| |
| [array exchangeValueAtIndex:1 withValueAtIndex:3]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 1); |
| XCTAssertEqual([array valueAtIndex:1], 4); |
| XCTAssertEqual([array valueAtIndex:2], 3); |
| XCTAssertEqual([array valueAtIndex:3], 2); |
| |
| [array exchangeValueAtIndex:2 withValueAtIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 3); |
| XCTAssertEqual([array valueAtIndex:1], 4); |
| XCTAssertEqual([array valueAtIndex:2], 1); |
| XCTAssertEqual([array valueAtIndex:3], 2); |
| |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], |
| NSException, NSRangeException); |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInternalResizing { |
| const int32_t kValues[] = { 1, 2, 3, 4 }; |
| GPBInt32Array *array = |
| [GPBInt32Array arrayWithCapacity:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| |
| // Add/remove to trigger the intneral buffer to grow/shrink. |
| for (int i = 0; i < 100; ++i) { |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| for (int i = 0; i < 100; ++i) { |
| [array removeValueAtIndex:(i * 2)]; |
| } |
| XCTAssertEqual(array.count, 304U); |
| for (int i = 0; i < 100; ++i) { |
| [array insertValue:4 atIndex:(i * 3)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| } |
| |
| @end |
| |
| //%PDDM-EXPAND ARRAY_TESTS(UInt32, uint32_t, 11U, 12U, 13U, 14U) |
| // This block of code is generated, do not edit it directly. |
| |
| #pragma mark - UInt32 |
| |
| @interface GPBUInt32ArrayTests : XCTestCase |
| @end |
| |
| @implementation GPBUInt32ArrayTests |
| |
| - (void)testEmpty { |
| GPBUInt32Array *array = [[GPBUInt32Array alloc] init]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(__unused uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(__unused uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array release]; |
| } |
| |
| - (void)testOne { |
| GPBUInt32Array *array = [GPBUInt32Array arrayWithValue:11U]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 1U); |
| XCTAssertEqual([array valueAtIndex:0], 11U); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 11U); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 11U); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| } |
| |
| - (void)testBasics { |
| static const uint32_t kValues[] = { 11U, 12U, 13U, 14U }; |
| GPBUInt32Array *array = |
| [[GPBUInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 11U); |
| XCTAssertEqual([array valueAtIndex:1], 12U); |
| XCTAssertEqual([array valueAtIndex:2], 13U); |
| XCTAssertEqual([array valueAtIndex:3], 14U); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); |
| __block NSUInteger idx2 = 0; |
| [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| // Stopping the enumeration. |
| idx2 = 0; |
| [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 2U); |
| XCTAssertNotEqual(idx, 3U); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 1U); |
| XCTAssertNotEqual(idx, 0U); |
| ++idx2; |
| }]; |
| // Ensure description doesn't choke. |
| XCTAssertTrue(array.description.length > 10); |
| [array release]; |
| } |
| |
| - (void)testEquality { |
| const uint32_t kValues1[] = { 11U, 12U, 13U }; |
| const uint32_t kValues2[] = { 11U, 14U, 13U }; |
| const uint32_t kValues3[] = { 11U, 12U, 13U, 14U }; |
| GPBUInt32Array *array1 = |
| [[GPBUInt32Array alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1); |
| GPBUInt32Array *array1prime = |
| [[GPBUInt32Array alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1prime); |
| GPBUInt32Array *array2 = |
| [[GPBUInt32Array alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| GPBUInt32Array *array3 = |
| [[GPBUInt32Array alloc] initWithValues:kValues3 |
| count:GPBARRAYSIZE(kValues3)]; |
| XCTAssertNotNil(array3); |
| |
| // Identity |
| XCTAssertTrue([array1 isEqual:array1]); |
| // Wrong type doesn't blow up. |
| XCTAssertFalse([array1 isEqual:@"bogus"]); |
| // 1/1Prime should be different objects, but equal. |
| XCTAssertNotEqual(array1, array1prime); |
| XCTAssertEqualObjects(array1, array1prime); |
| // Equal, so they must have same hash. |
| XCTAssertEqual([array1 hash], [array1prime hash]); |
| |
| // 1/2/3 shouldn't be equal. |
| XCTAssertNotEqualObjects(array1, array2); |
| XCTAssertNotEqualObjects(array1, array3); |
| XCTAssertNotEqualObjects(array2, array3); |
| |
| [array1 release]; |
| [array1prime release]; |
| [array2 release]; |
| [array3 release]; |
| } |
| |
| - (void)testCopy { |
| const uint32_t kValues[] = { 11U, 12U, 13U, 14U }; |
| GPBUInt32Array *array = |
| [[GPBUInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBUInt32Array *array2 = [array copy]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new object but equal. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array2 release]; |
| [array release]; |
| } |
| |
| - (void)testArrayFromArray { |
| const uint32_t kValues[] = { 11U, 12U, 13U, 14U }; |
| GPBUInt32Array *array = |
| [[GPBUInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBUInt32Array *array2 = [GPBUInt32Array arrayWithValueArray:array]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new pointer, but equal objects. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array release]; |
| } |
| |
| - (void)testAdds { |
| GPBUInt32Array *array = [GPBUInt32Array array]; |
| XCTAssertNotNil(array); |
| |
| XCTAssertEqual(array.count, 0U); |
| [array addValue:11U]; |
| XCTAssertEqual(array.count, 1U); |
| |
| const uint32_t kValues1[] = { 12U, 13U }; |
| [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertEqual(array.count, 3U); |
| |
| const uint32_t kValues2[] = { 14U, 11U }; |
| GPBUInt32Array *array2 = |
| [[GPBUInt32Array alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| [array addValuesFromArray:array2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // Zero/nil inputs do nothing. |
| [array addValues:kValues1 count:0]; |
| XCTAssertEqual(array.count, 5U); |
| [array addValues:NULL count:5]; |
| XCTAssertEqual(array.count, 5U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 11U); |
| XCTAssertEqual([array valueAtIndex:1], 12U); |
| XCTAssertEqual([array valueAtIndex:2], 13U); |
| XCTAssertEqual([array valueAtIndex:3], 14U); |
| XCTAssertEqual([array valueAtIndex:4], 11U); |
| [array2 release]; |
| } |
| |
| - (void)testInsert { |
| const uint32_t kValues[] = { 11U, 12U, 13U }; |
| GPBUInt32Array *array = |
| [[GPBUInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 3U); |
| |
| // First |
| [array insertValue:14U atIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| |
| // Middle |
| [array insertValue:14U atIndex:2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // End |
| [array insertValue:14U atIndex:5]; |
| XCTAssertEqual(array.count, 6U); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array insertValue:14U atIndex:7], |
| NSException, NSRangeException); |
| |
| XCTAssertEqual([array valueAtIndex:0], 14U); |
| XCTAssertEqual([array valueAtIndex:1], 11U); |
| XCTAssertEqual([array valueAtIndex:2], 14U); |
| XCTAssertEqual([array valueAtIndex:3], 12U); |
| XCTAssertEqual([array valueAtIndex:4], 13U); |
| XCTAssertEqual([array valueAtIndex:5], 14U); |
| [array release]; |
| } |
| |
| - (void)testRemove { |
| const uint32_t kValues[] = { 14U, 11U, 12U, 14U, 13U, 14U }; |
| GPBUInt32Array *array = |
| [[GPBUInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 6U); |
| |
| // First |
| [array removeValueAtIndex:0]; |
| XCTAssertEqual(array.count, 5U); |
| XCTAssertEqual([array valueAtIndex:0], 11U); |
| |
| // Middle |
| [array removeValueAtIndex:2]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:2], 13U); |
| |
| // End |
| [array removeValueAtIndex:3]; |
| XCTAssertEqual(array.count, 3U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 11U); |
| XCTAssertEqual([array valueAtIndex:1], 12U); |
| XCTAssertEqual([array valueAtIndex:2], 13U); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], |
| NSException, NSRangeException); |
| |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInplaceMutation { |
| const uint32_t kValues[] = { 11U, 11U, 13U, 13U }; |
| GPBUInt32Array *array = |
| [[GPBUInt32Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| [array replaceValueAtIndex:1 withValue:12U]; |
| [array replaceValueAtIndex:3 withValue:14U]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 11U); |
| XCTAssertEqual([array valueAtIndex:1], 12U); |
| XCTAssertEqual([array valueAtIndex:2], 13U); |
| XCTAssertEqual([array valueAtIndex:3], 14U); |
| |
| XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:14U], |
| NSException, NSRangeException); |
| |
| [array exchangeValueAtIndex:1 withValueAtIndex:3]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 11U); |
| XCTAssertEqual([array valueAtIndex:1], 14U); |
| XCTAssertEqual([array valueAtIndex:2], 13U); |
| XCTAssertEqual([array valueAtIndex:3], 12U); |
| |
| [array exchangeValueAtIndex:2 withValueAtIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 13U); |
| XCTAssertEqual([array valueAtIndex:1], 14U); |
| XCTAssertEqual([array valueAtIndex:2], 11U); |
| XCTAssertEqual([array valueAtIndex:3], 12U); |
| |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], |
| NSException, NSRangeException); |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInternalResizing { |
| const uint32_t kValues[] = { 11U, 12U, 13U, 14U }; |
| GPBUInt32Array *array = |
| [GPBUInt32Array arrayWithCapacity:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| |
| // Add/remove to trigger the intneral buffer to grow/shrink. |
| for (int i = 0; i < 100; ++i) { |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| for (int i = 0; i < 100; ++i) { |
| [array removeValueAtIndex:(i * 2)]; |
| } |
| XCTAssertEqual(array.count, 304U); |
| for (int i = 0; i < 100; ++i) { |
| [array insertValue:14U atIndex:(i * 3)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| } |
| |
| @end |
| |
| //%PDDM-EXPAND ARRAY_TESTS(Int64, int64_t, 31LL, 32LL, 33LL, 34LL) |
| // This block of code is generated, do not edit it directly. |
| |
| #pragma mark - Int64 |
| |
| @interface GPBInt64ArrayTests : XCTestCase |
| @end |
| |
| @implementation GPBInt64ArrayTests |
| |
| - (void)testEmpty { |
| GPBInt64Array *array = [[GPBInt64Array alloc] init]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(__unused int64_t value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(__unused int64_t value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array release]; |
| } |
| |
| - (void)testOne { |
| GPBInt64Array *array = [GPBInt64Array arrayWithValue:31LL]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 1U); |
| XCTAssertEqual([array valueAtIndex:0], 31LL); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 31LL); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 31LL); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| } |
| |
| - (void)testBasics { |
| static const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL }; |
| GPBInt64Array *array = |
| [[GPBInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 31LL); |
| XCTAssertEqual([array valueAtIndex:1], 32LL); |
| XCTAssertEqual([array valueAtIndex:2], 33LL); |
| XCTAssertEqual([array valueAtIndex:3], 34LL); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); |
| __block NSUInteger idx2 = 0; |
| [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| // Stopping the enumeration. |
| idx2 = 0; |
| [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 2U); |
| XCTAssertNotEqual(idx, 3U); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 1U); |
| XCTAssertNotEqual(idx, 0U); |
| ++idx2; |
| }]; |
| // Ensure description doesn't choke. |
| XCTAssertTrue(array.description.length > 10); |
| [array release]; |
| } |
| |
| - (void)testEquality { |
| const int64_t kValues1[] = { 31LL, 32LL, 33LL }; |
| const int64_t kValues2[] = { 31LL, 34LL, 33LL }; |
| const int64_t kValues3[] = { 31LL, 32LL, 33LL, 34LL }; |
| GPBInt64Array *array1 = |
| [[GPBInt64Array alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1); |
| GPBInt64Array *array1prime = |
| [[GPBInt64Array alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1prime); |
| GPBInt64Array *array2 = |
| [[GPBInt64Array alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| GPBInt64Array *array3 = |
| [[GPBInt64Array alloc] initWithValues:kValues3 |
| count:GPBARRAYSIZE(kValues3)]; |
| XCTAssertNotNil(array3); |
| |
| // Identity |
| XCTAssertTrue([array1 isEqual:array1]); |
| // Wrong type doesn't blow up. |
| XCTAssertFalse([array1 isEqual:@"bogus"]); |
| // 1/1Prime should be different objects, but equal. |
| XCTAssertNotEqual(array1, array1prime); |
| XCTAssertEqualObjects(array1, array1prime); |
| // Equal, so they must have same hash. |
| XCTAssertEqual([array1 hash], [array1prime hash]); |
| |
| // 1/2/3 shouldn't be equal. |
| XCTAssertNotEqualObjects(array1, array2); |
| XCTAssertNotEqualObjects(array1, array3); |
| XCTAssertNotEqualObjects(array2, array3); |
| |
| [array1 release]; |
| [array1prime release]; |
| [array2 release]; |
| [array3 release]; |
| } |
| |
| - (void)testCopy { |
| const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL }; |
| GPBInt64Array *array = |
| [[GPBInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBInt64Array *array2 = [array copy]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new object but equal. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array2 release]; |
| [array release]; |
| } |
| |
| - (void)testArrayFromArray { |
| const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL }; |
| GPBInt64Array *array = |
| [[GPBInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBInt64Array *array2 = [GPBInt64Array arrayWithValueArray:array]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new pointer, but equal objects. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array release]; |
| } |
| |
| - (void)testAdds { |
| GPBInt64Array *array = [GPBInt64Array array]; |
| XCTAssertNotNil(array); |
| |
| XCTAssertEqual(array.count, 0U); |
| [array addValue:31LL]; |
| XCTAssertEqual(array.count, 1U); |
| |
| const int64_t kValues1[] = { 32LL, 33LL }; |
| [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertEqual(array.count, 3U); |
| |
| const int64_t kValues2[] = { 34LL, 31LL }; |
| GPBInt64Array *array2 = |
| [[GPBInt64Array alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| [array addValuesFromArray:array2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // Zero/nil inputs do nothing. |
| [array addValues:kValues1 count:0]; |
| XCTAssertEqual(array.count, 5U); |
| [array addValues:NULL count:5]; |
| XCTAssertEqual(array.count, 5U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 31LL); |
| XCTAssertEqual([array valueAtIndex:1], 32LL); |
| XCTAssertEqual([array valueAtIndex:2], 33LL); |
| XCTAssertEqual([array valueAtIndex:3], 34LL); |
| XCTAssertEqual([array valueAtIndex:4], 31LL); |
| [array2 release]; |
| } |
| |
| - (void)testInsert { |
| const int64_t kValues[] = { 31LL, 32LL, 33LL }; |
| GPBInt64Array *array = |
| [[GPBInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 3U); |
| |
| // First |
| [array insertValue:34LL atIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| |
| // Middle |
| [array insertValue:34LL atIndex:2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // End |
| [array insertValue:34LL atIndex:5]; |
| XCTAssertEqual(array.count, 6U); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array insertValue:34LL atIndex:7], |
| NSException, NSRangeException); |
| |
| XCTAssertEqual([array valueAtIndex:0], 34LL); |
| XCTAssertEqual([array valueAtIndex:1], 31LL); |
| XCTAssertEqual([array valueAtIndex:2], 34LL); |
| XCTAssertEqual([array valueAtIndex:3], 32LL); |
| XCTAssertEqual([array valueAtIndex:4], 33LL); |
| XCTAssertEqual([array valueAtIndex:5], 34LL); |
| [array release]; |
| } |
| |
| - (void)testRemove { |
| const int64_t kValues[] = { 34LL, 31LL, 32LL, 34LL, 33LL, 34LL }; |
| GPBInt64Array *array = |
| [[GPBInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 6U); |
| |
| // First |
| [array removeValueAtIndex:0]; |
| XCTAssertEqual(array.count, 5U); |
| XCTAssertEqual([array valueAtIndex:0], 31LL); |
| |
| // Middle |
| [array removeValueAtIndex:2]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:2], 33LL); |
| |
| // End |
| [array removeValueAtIndex:3]; |
| XCTAssertEqual(array.count, 3U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 31LL); |
| XCTAssertEqual([array valueAtIndex:1], 32LL); |
| XCTAssertEqual([array valueAtIndex:2], 33LL); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], |
| NSException, NSRangeException); |
| |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInplaceMutation { |
| const int64_t kValues[] = { 31LL, 31LL, 33LL, 33LL }; |
| GPBInt64Array *array = |
| [[GPBInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| [array replaceValueAtIndex:1 withValue:32LL]; |
| [array replaceValueAtIndex:3 withValue:34LL]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 31LL); |
| XCTAssertEqual([array valueAtIndex:1], 32LL); |
| XCTAssertEqual([array valueAtIndex:2], 33LL); |
| XCTAssertEqual([array valueAtIndex:3], 34LL); |
| |
| XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:34LL], |
| NSException, NSRangeException); |
| |
| [array exchangeValueAtIndex:1 withValueAtIndex:3]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 31LL); |
| XCTAssertEqual([array valueAtIndex:1], 34LL); |
| XCTAssertEqual([array valueAtIndex:2], 33LL); |
| XCTAssertEqual([array valueAtIndex:3], 32LL); |
| |
| [array exchangeValueAtIndex:2 withValueAtIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 33LL); |
| XCTAssertEqual([array valueAtIndex:1], 34LL); |
| XCTAssertEqual([array valueAtIndex:2], 31LL); |
| XCTAssertEqual([array valueAtIndex:3], 32LL); |
| |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], |
| NSException, NSRangeException); |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInternalResizing { |
| const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL }; |
| GPBInt64Array *array = |
| [GPBInt64Array arrayWithCapacity:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| |
| // Add/remove to trigger the intneral buffer to grow/shrink. |
| for (int i = 0; i < 100; ++i) { |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| for (int i = 0; i < 100; ++i) { |
| [array removeValueAtIndex:(i * 2)]; |
| } |
| XCTAssertEqual(array.count, 304U); |
| for (int i = 0; i < 100; ++i) { |
| [array insertValue:34LL atIndex:(i * 3)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| } |
| |
| @end |
| |
| //%PDDM-EXPAND ARRAY_TESTS(UInt64, uint64_t, 41ULL, 42ULL, 43ULL, 44ULL) |
| // This block of code is generated, do not edit it directly. |
| |
| #pragma mark - UInt64 |
| |
| @interface GPBUInt64ArrayTests : XCTestCase |
| @end |
| |
| @implementation GPBUInt64ArrayTests |
| |
| - (void)testEmpty { |
| GPBUInt64Array *array = [[GPBUInt64Array alloc] init]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(__unused uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(__unused uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array release]; |
| } |
| |
| - (void)testOne { |
| GPBUInt64Array *array = [GPBUInt64Array arrayWithValue:41ULL]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 1U); |
| XCTAssertEqual([array valueAtIndex:0], 41ULL); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 41ULL); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 41ULL); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| } |
| |
| - (void)testBasics { |
| static const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL }; |
| GPBUInt64Array *array = |
| [[GPBUInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 41ULL); |
| XCTAssertEqual([array valueAtIndex:1], 42ULL); |
| XCTAssertEqual([array valueAtIndex:2], 43ULL); |
| XCTAssertEqual([array valueAtIndex:3], 44ULL); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); |
| __block NSUInteger idx2 = 0; |
| [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| // Stopping the enumeration. |
| idx2 = 0; |
| [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 2U); |
| XCTAssertNotEqual(idx, 3U); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 1U); |
| XCTAssertNotEqual(idx, 0U); |
| ++idx2; |
| }]; |
| // Ensure description doesn't choke. |
| XCTAssertTrue(array.description.length > 10); |
| [array release]; |
| } |
| |
| - (void)testEquality { |
| const uint64_t kValues1[] = { 41ULL, 42ULL, 43ULL }; |
| const uint64_t kValues2[] = { 41ULL, 44ULL, 43ULL }; |
| const uint64_t kValues3[] = { 41ULL, 42ULL, 43ULL, 44ULL }; |
| GPBUInt64Array *array1 = |
| [[GPBUInt64Array alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1); |
| GPBUInt64Array *array1prime = |
| [[GPBUInt64Array alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1prime); |
| GPBUInt64Array *array2 = |
| [[GPBUInt64Array alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| GPBUInt64Array *array3 = |
| [[GPBUInt64Array alloc] initWithValues:kValues3 |
| count:GPBARRAYSIZE(kValues3)]; |
| XCTAssertNotNil(array3); |
| |
| // Identity |
| XCTAssertTrue([array1 isEqual:array1]); |
| // Wrong type doesn't blow up. |
| XCTAssertFalse([array1 isEqual:@"bogus"]); |
| // 1/1Prime should be different objects, but equal. |
| XCTAssertNotEqual(array1, array1prime); |
| XCTAssertEqualObjects(array1, array1prime); |
| // Equal, so they must have same hash. |
| XCTAssertEqual([array1 hash], [array1prime hash]); |
| |
| // 1/2/3 shouldn't be equal. |
| XCTAssertNotEqualObjects(array1, array2); |
| XCTAssertNotEqualObjects(array1, array3); |
| XCTAssertNotEqualObjects(array2, array3); |
| |
| [array1 release]; |
| [array1prime release]; |
| [array2 release]; |
| [array3 release]; |
| } |
| |
| - (void)testCopy { |
| const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL }; |
| GPBUInt64Array *array = |
| [[GPBUInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBUInt64Array *array2 = [array copy]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new object but equal. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array2 release]; |
| [array release]; |
| } |
| |
| - (void)testArrayFromArray { |
| const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL }; |
| GPBUInt64Array *array = |
| [[GPBUInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBUInt64Array *array2 = [GPBUInt64Array arrayWithValueArray:array]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new pointer, but equal objects. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array release]; |
| } |
| |
| - (void)testAdds { |
| GPBUInt64Array *array = [GPBUInt64Array array]; |
| XCTAssertNotNil(array); |
| |
| XCTAssertEqual(array.count, 0U); |
| [array addValue:41ULL]; |
| XCTAssertEqual(array.count, 1U); |
| |
| const uint64_t kValues1[] = { 42ULL, 43ULL }; |
| [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertEqual(array.count, 3U); |
| |
| const uint64_t kValues2[] = { 44ULL, 41ULL }; |
| GPBUInt64Array *array2 = |
| [[GPBUInt64Array alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| [array addValuesFromArray:array2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // Zero/nil inputs do nothing. |
| [array addValues:kValues1 count:0]; |
| XCTAssertEqual(array.count, 5U); |
| [array addValues:NULL count:5]; |
| XCTAssertEqual(array.count, 5U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 41ULL); |
| XCTAssertEqual([array valueAtIndex:1], 42ULL); |
| XCTAssertEqual([array valueAtIndex:2], 43ULL); |
| XCTAssertEqual([array valueAtIndex:3], 44ULL); |
| XCTAssertEqual([array valueAtIndex:4], 41ULL); |
| [array2 release]; |
| } |
| |
| - (void)testInsert { |
| const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL }; |
| GPBUInt64Array *array = |
| [[GPBUInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 3U); |
| |
| // First |
| [array insertValue:44ULL atIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| |
| // Middle |
| [array insertValue:44ULL atIndex:2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // End |
| [array insertValue:44ULL atIndex:5]; |
| XCTAssertEqual(array.count, 6U); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array insertValue:44ULL atIndex:7], |
| NSException, NSRangeException); |
| |
| XCTAssertEqual([array valueAtIndex:0], 44ULL); |
| XCTAssertEqual([array valueAtIndex:1], 41ULL); |
| XCTAssertEqual([array valueAtIndex:2], 44ULL); |
| XCTAssertEqual([array valueAtIndex:3], 42ULL); |
| XCTAssertEqual([array valueAtIndex:4], 43ULL); |
| XCTAssertEqual([array valueAtIndex:5], 44ULL); |
| [array release]; |
| } |
| |
| - (void)testRemove { |
| const uint64_t kValues[] = { 44ULL, 41ULL, 42ULL, 44ULL, 43ULL, 44ULL }; |
| GPBUInt64Array *array = |
| [[GPBUInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 6U); |
| |
| // First |
| [array removeValueAtIndex:0]; |
| XCTAssertEqual(array.count, 5U); |
| XCTAssertEqual([array valueAtIndex:0], 41ULL); |
| |
| // Middle |
| [array removeValueAtIndex:2]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:2], 43ULL); |
| |
| // End |
| [array removeValueAtIndex:3]; |
| XCTAssertEqual(array.count, 3U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 41ULL); |
| XCTAssertEqual([array valueAtIndex:1], 42ULL); |
| XCTAssertEqual([array valueAtIndex:2], 43ULL); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], |
| NSException, NSRangeException); |
| |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInplaceMutation { |
| const uint64_t kValues[] = { 41ULL, 41ULL, 43ULL, 43ULL }; |
| GPBUInt64Array *array = |
| [[GPBUInt64Array alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| [array replaceValueAtIndex:1 withValue:42ULL]; |
| [array replaceValueAtIndex:3 withValue:44ULL]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 41ULL); |
| XCTAssertEqual([array valueAtIndex:1], 42ULL); |
| XCTAssertEqual([array valueAtIndex:2], 43ULL); |
| XCTAssertEqual([array valueAtIndex:3], 44ULL); |
| |
| XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:44ULL], |
| NSException, NSRangeException); |
| |
| [array exchangeValueAtIndex:1 withValueAtIndex:3]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 41ULL); |
| XCTAssertEqual([array valueAtIndex:1], 44ULL); |
| XCTAssertEqual([array valueAtIndex:2], 43ULL); |
| XCTAssertEqual([array valueAtIndex:3], 42ULL); |
| |
| [array exchangeValueAtIndex:2 withValueAtIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 43ULL); |
| XCTAssertEqual([array valueAtIndex:1], 44ULL); |
| XCTAssertEqual([array valueAtIndex:2], 41ULL); |
| XCTAssertEqual([array valueAtIndex:3], 42ULL); |
| |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], |
| NSException, NSRangeException); |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInternalResizing { |
| const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL }; |
| GPBUInt64Array *array = |
| [GPBUInt64Array arrayWithCapacity:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| |
| // Add/remove to trigger the intneral buffer to grow/shrink. |
| for (int i = 0; i < 100; ++i) { |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| for (int i = 0; i < 100; ++i) { |
| [array removeValueAtIndex:(i * 2)]; |
| } |
| XCTAssertEqual(array.count, 304U); |
| for (int i = 0; i < 100; ++i) { |
| [array insertValue:44ULL atIndex:(i * 3)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| } |
| |
| @end |
| |
| //%PDDM-EXPAND ARRAY_TESTS(Float, float, 51.f, 52.f, 53.f, 54.f) |
| // This block of code is generated, do not edit it directly. |
| |
| #pragma mark - Float |
| |
| @interface GPBFloatArrayTests : XCTestCase |
| @end |
| |
| @implementation GPBFloatArrayTests |
| |
| - (void)testEmpty { |
| GPBFloatArray *array = [[GPBFloatArray alloc] init]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(__unused float value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(__unused float value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array release]; |
| } |
| |
| - (void)testOne { |
| GPBFloatArray *array = [GPBFloatArray arrayWithValue:51.f]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 1U); |
| XCTAssertEqual([array valueAtIndex:0], 51.f); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 51.f); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(float value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 51.f); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| } |
| |
| - (void)testBasics { |
| static const float kValues[] = { 51.f, 52.f, 53.f, 54.f }; |
| GPBFloatArray *array = |
| [[GPBFloatArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 51.f); |
| XCTAssertEqual([array valueAtIndex:1], 52.f); |
| XCTAssertEqual([array valueAtIndex:2], 53.f); |
| XCTAssertEqual([array valueAtIndex:3], 54.f); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); |
| __block NSUInteger idx2 = 0; |
| [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(float value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| // Stopping the enumeration. |
| idx2 = 0; |
| [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 2U); |
| XCTAssertNotEqual(idx, 3U); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(float value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 1U); |
| XCTAssertNotEqual(idx, 0U); |
| ++idx2; |
| }]; |
| // Ensure description doesn't choke. |
| XCTAssertTrue(array.description.length > 10); |
| [array release]; |
| } |
| |
| - (void)testEquality { |
| const float kValues1[] = { 51.f, 52.f, 53.f }; |
| const float kValues2[] = { 51.f, 54.f, 53.f }; |
| const float kValues3[] = { 51.f, 52.f, 53.f, 54.f }; |
| GPBFloatArray *array1 = |
| [[GPBFloatArray alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1); |
| GPBFloatArray *array1prime = |
| [[GPBFloatArray alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1prime); |
| GPBFloatArray *array2 = |
| [[GPBFloatArray alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| GPBFloatArray *array3 = |
| [[GPBFloatArray alloc] initWithValues:kValues3 |
| count:GPBARRAYSIZE(kValues3)]; |
| XCTAssertNotNil(array3); |
| |
| // Identity |
| XCTAssertTrue([array1 isEqual:array1]); |
| // Wrong type doesn't blow up. |
| XCTAssertFalse([array1 isEqual:@"bogus"]); |
| // 1/1Prime should be different objects, but equal. |
| XCTAssertNotEqual(array1, array1prime); |
| XCTAssertEqualObjects(array1, array1prime); |
| // Equal, so they must have same hash. |
| XCTAssertEqual([array1 hash], [array1prime hash]); |
| |
| // 1/2/3 shouldn't be equal. |
| XCTAssertNotEqualObjects(array1, array2); |
| XCTAssertNotEqualObjects(array1, array3); |
| XCTAssertNotEqualObjects(array2, array3); |
| |
| [array1 release]; |
| [array1prime release]; |
| [array2 release]; |
| [array3 release]; |
| } |
| |
| - (void)testCopy { |
| const float kValues[] = { 51.f, 52.f, 53.f, 54.f }; |
| GPBFloatArray *array = |
| [[GPBFloatArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBFloatArray *array2 = [array copy]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new object but equal. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array2 release]; |
| [array release]; |
| } |
| |
| - (void)testArrayFromArray { |
| const float kValues[] = { 51.f, 52.f, 53.f, 54.f }; |
| GPBFloatArray *array = |
| [[GPBFloatArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBFloatArray *array2 = [GPBFloatArray arrayWithValueArray:array]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new pointer, but equal objects. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array release]; |
| } |
| |
| - (void)testAdds { |
| GPBFloatArray *array = [GPBFloatArray array]; |
| XCTAssertNotNil(array); |
| |
| XCTAssertEqual(array.count, 0U); |
| [array addValue:51.f]; |
| XCTAssertEqual(array.count, 1U); |
| |
| const float kValues1[] = { 52.f, 53.f }; |
| [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertEqual(array.count, 3U); |
| |
| const float kValues2[] = { 54.f, 51.f }; |
| GPBFloatArray *array2 = |
| [[GPBFloatArray alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| [array addValuesFromArray:array2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // Zero/nil inputs do nothing. |
| [array addValues:kValues1 count:0]; |
| XCTAssertEqual(array.count, 5U); |
| [array addValues:NULL count:5]; |
| XCTAssertEqual(array.count, 5U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 51.f); |
| XCTAssertEqual([array valueAtIndex:1], 52.f); |
| XCTAssertEqual([array valueAtIndex:2], 53.f); |
| XCTAssertEqual([array valueAtIndex:3], 54.f); |
| XCTAssertEqual([array valueAtIndex:4], 51.f); |
| [array2 release]; |
| } |
| |
| - (void)testInsert { |
| const float kValues[] = { 51.f, 52.f, 53.f }; |
| GPBFloatArray *array = |
| [[GPBFloatArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 3U); |
| |
| // First |
| [array insertValue:54.f atIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| |
| // Middle |
| [array insertValue:54.f atIndex:2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // End |
| [array insertValue:54.f atIndex:5]; |
| XCTAssertEqual(array.count, 6U); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array insertValue:54.f atIndex:7], |
| NSException, NSRangeException); |
| |
| XCTAssertEqual([array valueAtIndex:0], 54.f); |
| XCTAssertEqual([array valueAtIndex:1], 51.f); |
| XCTAssertEqual([array valueAtIndex:2], 54.f); |
| XCTAssertEqual([array valueAtIndex:3], 52.f); |
| XCTAssertEqual([array valueAtIndex:4], 53.f); |
| XCTAssertEqual([array valueAtIndex:5], 54.f); |
| [array release]; |
| } |
| |
| - (void)testRemove { |
| const float kValues[] = { 54.f, 51.f, 52.f, 54.f, 53.f, 54.f }; |
| GPBFloatArray *array = |
| [[GPBFloatArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 6U); |
| |
| // First |
| [array removeValueAtIndex:0]; |
| XCTAssertEqual(array.count, 5U); |
| XCTAssertEqual([array valueAtIndex:0], 51.f); |
| |
| // Middle |
| [array removeValueAtIndex:2]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:2], 53.f); |
| |
| // End |
| [array removeValueAtIndex:3]; |
| XCTAssertEqual(array.count, 3U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 51.f); |
| XCTAssertEqual([array valueAtIndex:1], 52.f); |
| XCTAssertEqual([array valueAtIndex:2], 53.f); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], |
| NSException, NSRangeException); |
| |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInplaceMutation { |
| const float kValues[] = { 51.f, 51.f, 53.f, 53.f }; |
| GPBFloatArray *array = |
| [[GPBFloatArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| [array replaceValueAtIndex:1 withValue:52.f]; |
| [array replaceValueAtIndex:3 withValue:54.f]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 51.f); |
| XCTAssertEqual([array valueAtIndex:1], 52.f); |
| XCTAssertEqual([array valueAtIndex:2], 53.f); |
| XCTAssertEqual([array valueAtIndex:3], 54.f); |
| |
| XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:54.f], |
| NSException, NSRangeException); |
| |
| [array exchangeValueAtIndex:1 withValueAtIndex:3]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 51.f); |
| XCTAssertEqual([array valueAtIndex:1], 54.f); |
| XCTAssertEqual([array valueAtIndex:2], 53.f); |
| XCTAssertEqual([array valueAtIndex:3], 52.f); |
| |
| [array exchangeValueAtIndex:2 withValueAtIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 53.f); |
| XCTAssertEqual([array valueAtIndex:1], 54.f); |
| XCTAssertEqual([array valueAtIndex:2], 51.f); |
| XCTAssertEqual([array valueAtIndex:3], 52.f); |
| |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], |
| NSException, NSRangeException); |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInternalResizing { |
| const float kValues[] = { 51.f, 52.f, 53.f, 54.f }; |
| GPBFloatArray *array = |
| [GPBFloatArray arrayWithCapacity:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| |
| // Add/remove to trigger the intneral buffer to grow/shrink. |
| for (int i = 0; i < 100; ++i) { |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| for (int i = 0; i < 100; ++i) { |
| [array removeValueAtIndex:(i * 2)]; |
| } |
| XCTAssertEqual(array.count, 304U); |
| for (int i = 0; i < 100; ++i) { |
| [array insertValue:54.f atIndex:(i * 3)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| } |
| |
| @end |
| |
| //%PDDM-EXPAND ARRAY_TESTS(Double, double, 61., 62., 63., 64.) |
| // This block of code is generated, do not edit it directly. |
| |
| #pragma mark - Double |
| |
| @interface GPBDoubleArrayTests : XCTestCase |
| @end |
| |
| @implementation GPBDoubleArrayTests |
| |
| - (void)testEmpty { |
| GPBDoubleArray *array = [[GPBDoubleArray alloc] init]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(__unused double value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(__unused double value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array release]; |
| } |
| |
| - (void)testOne { |
| GPBDoubleArray *array = [GPBDoubleArray arrayWithValue:61.]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 1U); |
| XCTAssertEqual([array valueAtIndex:0], 61.); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 61.); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(double value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 61.); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| } |
| |
| - (void)testBasics { |
| static const double kValues[] = { 61., 62., 63., 64. }; |
| GPBDoubleArray *array = |
| [[GPBDoubleArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 61.); |
| XCTAssertEqual([array valueAtIndex:1], 62.); |
| XCTAssertEqual([array valueAtIndex:2], 63.); |
| XCTAssertEqual([array valueAtIndex:3], 64.); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); |
| __block NSUInteger idx2 = 0; |
| [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(double value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| // Stopping the enumeration. |
| idx2 = 0; |
| [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 2U); |
| XCTAssertNotEqual(idx, 3U); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(double value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 1U); |
| XCTAssertNotEqual(idx, 0U); |
| ++idx2; |
| }]; |
| // Ensure description doesn't choke. |
| XCTAssertTrue(array.description.length > 10); |
| [array release]; |
| } |
| |
| - (void)testEquality { |
| const double kValues1[] = { 61., 62., 63. }; |
| const double kValues2[] = { 61., 64., 63. }; |
| const double kValues3[] = { 61., 62., 63., 64. }; |
| GPBDoubleArray *array1 = |
| [[GPBDoubleArray alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1); |
| GPBDoubleArray *array1prime = |
| [[GPBDoubleArray alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1prime); |
| GPBDoubleArray *array2 = |
| [[GPBDoubleArray alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| GPBDoubleArray *array3 = |
| [[GPBDoubleArray alloc] initWithValues:kValues3 |
| count:GPBARRAYSIZE(kValues3)]; |
| XCTAssertNotNil(array3); |
| |
| // Identity |
| XCTAssertTrue([array1 isEqual:array1]); |
| // Wrong type doesn't blow up. |
| XCTAssertFalse([array1 isEqual:@"bogus"]); |
| // 1/1Prime should be different objects, but equal. |
| XCTAssertNotEqual(array1, array1prime); |
| XCTAssertEqualObjects(array1, array1prime); |
| // Equal, so they must have same hash. |
| XCTAssertEqual([array1 hash], [array1prime hash]); |
| |
| // 1/2/3 shouldn't be equal. |
| XCTAssertNotEqualObjects(array1, array2); |
| XCTAssertNotEqualObjects(array1, array3); |
| XCTAssertNotEqualObjects(array2, array3); |
| |
| [array1 release]; |
| [array1prime release]; |
| [array2 release]; |
| [array3 release]; |
| } |
| |
| - (void)testCopy { |
| const double kValues[] = { 61., 62., 63., 64. }; |
| GPBDoubleArray *array = |
| [[GPBDoubleArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBDoubleArray *array2 = [array copy]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new object but equal. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array2 release]; |
| [array release]; |
| } |
| |
| - (void)testArrayFromArray { |
| const double kValues[] = { 61., 62., 63., 64. }; |
| GPBDoubleArray *array = |
| [[GPBDoubleArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBDoubleArray *array2 = [GPBDoubleArray arrayWithValueArray:array]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new pointer, but equal objects. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array release]; |
| } |
| |
| - (void)testAdds { |
| GPBDoubleArray *array = [GPBDoubleArray array]; |
| XCTAssertNotNil(array); |
| |
| XCTAssertEqual(array.count, 0U); |
| [array addValue:61.]; |
| XCTAssertEqual(array.count, 1U); |
| |
| const double kValues1[] = { 62., 63. }; |
| [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertEqual(array.count, 3U); |
| |
| const double kValues2[] = { 64., 61. }; |
| GPBDoubleArray *array2 = |
| [[GPBDoubleArray alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| [array addValuesFromArray:array2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // Zero/nil inputs do nothing. |
| [array addValues:kValues1 count:0]; |
| XCTAssertEqual(array.count, 5U); |
| [array addValues:NULL count:5]; |
| XCTAssertEqual(array.count, 5U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 61.); |
| XCTAssertEqual([array valueAtIndex:1], 62.); |
| XCTAssertEqual([array valueAtIndex:2], 63.); |
| XCTAssertEqual([array valueAtIndex:3], 64.); |
| XCTAssertEqual([array valueAtIndex:4], 61.); |
| [array2 release]; |
| } |
| |
| - (void)testInsert { |
| const double kValues[] = { 61., 62., 63. }; |
| GPBDoubleArray *array = |
| [[GPBDoubleArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 3U); |
| |
| // First |
| [array insertValue:64. atIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| |
| // Middle |
| [array insertValue:64. atIndex:2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // End |
| [array insertValue:64. atIndex:5]; |
| XCTAssertEqual(array.count, 6U); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array insertValue:64. atIndex:7], |
| NSException, NSRangeException); |
| |
| XCTAssertEqual([array valueAtIndex:0], 64.); |
| XCTAssertEqual([array valueAtIndex:1], 61.); |
| XCTAssertEqual([array valueAtIndex:2], 64.); |
| XCTAssertEqual([array valueAtIndex:3], 62.); |
| XCTAssertEqual([array valueAtIndex:4], 63.); |
| XCTAssertEqual([array valueAtIndex:5], 64.); |
| [array release]; |
| } |
| |
| - (void)testRemove { |
| const double kValues[] = { 64., 61., 62., 64., 63., 64. }; |
| GPBDoubleArray *array = |
| [[GPBDoubleArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 6U); |
| |
| // First |
| [array removeValueAtIndex:0]; |
| XCTAssertEqual(array.count, 5U); |
| XCTAssertEqual([array valueAtIndex:0], 61.); |
| |
| // Middle |
| [array removeValueAtIndex:2]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:2], 63.); |
| |
| // End |
| [array removeValueAtIndex:3]; |
| XCTAssertEqual(array.count, 3U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 61.); |
| XCTAssertEqual([array valueAtIndex:1], 62.); |
| XCTAssertEqual([array valueAtIndex:2], 63.); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], |
| NSException, NSRangeException); |
| |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInplaceMutation { |
| const double kValues[] = { 61., 61., 63., 63. }; |
| GPBDoubleArray *array = |
| [[GPBDoubleArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| [array replaceValueAtIndex:1 withValue:62.]; |
| [array replaceValueAtIndex:3 withValue:64.]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 61.); |
| XCTAssertEqual([array valueAtIndex:1], 62.); |
| XCTAssertEqual([array valueAtIndex:2], 63.); |
| XCTAssertEqual([array valueAtIndex:3], 64.); |
| |
| XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:64.], |
| NSException, NSRangeException); |
| |
| [array exchangeValueAtIndex:1 withValueAtIndex:3]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 61.); |
| XCTAssertEqual([array valueAtIndex:1], 64.); |
| XCTAssertEqual([array valueAtIndex:2], 63.); |
| XCTAssertEqual([array valueAtIndex:3], 62.); |
| |
| [array exchangeValueAtIndex:2 withValueAtIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 63.); |
| XCTAssertEqual([array valueAtIndex:1], 64.); |
| XCTAssertEqual([array valueAtIndex:2], 61.); |
| XCTAssertEqual([array valueAtIndex:3], 62.); |
| |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], |
| NSException, NSRangeException); |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInternalResizing { |
| const double kValues[] = { 61., 62., 63., 64. }; |
| GPBDoubleArray *array = |
| [GPBDoubleArray arrayWithCapacity:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| |
| // Add/remove to trigger the intneral buffer to grow/shrink. |
| for (int i = 0; i < 100; ++i) { |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| for (int i = 0; i < 100; ++i) { |
| [array removeValueAtIndex:(i * 2)]; |
| } |
| XCTAssertEqual(array.count, 304U); |
| for (int i = 0; i < 100; ++i) { |
| [array insertValue:64. atIndex:(i * 3)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| } |
| |
| @end |
| |
| //%PDDM-EXPAND ARRAY_TESTS(Bool, BOOL, TRUE, TRUE, FALSE, FALSE) |
| // This block of code is generated, do not edit it directly. |
| |
| #pragma mark - Bool |
| |
| @interface GPBBoolArrayTests : XCTestCase |
| @end |
| |
| @implementation GPBBoolArrayTests |
| |
| - (void)testEmpty { |
| GPBBoolArray *array = [[GPBBoolArray alloc] init]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(__unused BOOL value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(__unused BOOL value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array release]; |
| } |
| |
| - (void)testOne { |
| GPBBoolArray *array = [GPBBoolArray arrayWithValue:TRUE]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 1U); |
| XCTAssertEqual([array valueAtIndex:0], TRUE); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, TRUE); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, TRUE); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| } |
| |
| - (void)testBasics { |
| static const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE }; |
| GPBBoolArray *array = |
| [[GPBBoolArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], TRUE); |
| XCTAssertEqual([array valueAtIndex:1], TRUE); |
| XCTAssertEqual([array valueAtIndex:2], FALSE); |
| XCTAssertEqual([array valueAtIndex:3], FALSE); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); |
| __block NSUInteger idx2 = 0; |
| [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| // Stopping the enumeration. |
| idx2 = 0; |
| [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 2U); |
| XCTAssertNotEqual(idx, 3U); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 1U); |
| XCTAssertNotEqual(idx, 0U); |
| ++idx2; |
| }]; |
| // Ensure description doesn't choke. |
| XCTAssertTrue(array.description.length > 10); |
| [array release]; |
| } |
| |
| - (void)testEquality { |
| const BOOL kValues1[] = { TRUE, TRUE, FALSE }; |
| const BOOL kValues2[] = { TRUE, FALSE, FALSE }; |
| const BOOL kValues3[] = { TRUE, TRUE, FALSE, FALSE }; |
| GPBBoolArray *array1 = |
| [[GPBBoolArray alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1); |
| GPBBoolArray *array1prime = |
| [[GPBBoolArray alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1prime); |
| GPBBoolArray *array2 = |
| [[GPBBoolArray alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| GPBBoolArray *array3 = |
| [[GPBBoolArray alloc] initWithValues:kValues3 |
| count:GPBARRAYSIZE(kValues3)]; |
| XCTAssertNotNil(array3); |
| |
| // Identity |
| XCTAssertTrue([array1 isEqual:array1]); |
| // Wrong type doesn't blow up. |
| XCTAssertFalse([array1 isEqual:@"bogus"]); |
| // 1/1Prime should be different objects, but equal. |
| XCTAssertNotEqual(array1, array1prime); |
| XCTAssertEqualObjects(array1, array1prime); |
| // Equal, so they must have same hash. |
| XCTAssertEqual([array1 hash], [array1prime hash]); |
| |
| // 1/2/3 shouldn't be equal. |
| XCTAssertNotEqualObjects(array1, array2); |
| XCTAssertNotEqualObjects(array1, array3); |
| XCTAssertNotEqualObjects(array2, array3); |
| |
| [array1 release]; |
| [array1prime release]; |
| [array2 release]; |
| [array3 release]; |
| } |
| |
| - (void)testCopy { |
| const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE }; |
| GPBBoolArray *array = |
| [[GPBBoolArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBBoolArray *array2 = [array copy]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new object but equal. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array2 release]; |
| [array release]; |
| } |
| |
| - (void)testArrayFromArray { |
| const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE }; |
| GPBBoolArray *array = |
| [[GPBBoolArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBBoolArray *array2 = [GPBBoolArray arrayWithValueArray:array]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new pointer, but equal objects. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array release]; |
| } |
| |
| - (void)testAdds { |
| GPBBoolArray *array = [GPBBoolArray array]; |
| XCTAssertNotNil(array); |
| |
| XCTAssertEqual(array.count, 0U); |
| [array addValue:TRUE]; |
| XCTAssertEqual(array.count, 1U); |
| |
| const BOOL kValues1[] = { TRUE, FALSE }; |
| [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertEqual(array.count, 3U); |
| |
| const BOOL kValues2[] = { FALSE, TRUE }; |
| GPBBoolArray *array2 = |
| [[GPBBoolArray alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| [array addValuesFromArray:array2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // Zero/nil inputs do nothing. |
| [array addValues:kValues1 count:0]; |
| XCTAssertEqual(array.count, 5U); |
| [array addValues:NULL count:5]; |
| XCTAssertEqual(array.count, 5U); |
| |
| XCTAssertEqual([array valueAtIndex:0], TRUE); |
| XCTAssertEqual([array valueAtIndex:1], TRUE); |
| XCTAssertEqual([array valueAtIndex:2], FALSE); |
| XCTAssertEqual([array valueAtIndex:3], FALSE); |
| XCTAssertEqual([array valueAtIndex:4], TRUE); |
| [array2 release]; |
| } |
| |
| - (void)testInsert { |
| const BOOL kValues[] = { TRUE, TRUE, FALSE }; |
| GPBBoolArray *array = |
| [[GPBBoolArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 3U); |
| |
| // First |
| [array insertValue:FALSE atIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| |
| // Middle |
| [array insertValue:FALSE atIndex:2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // End |
| [array insertValue:FALSE atIndex:5]; |
| XCTAssertEqual(array.count, 6U); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array insertValue:FALSE atIndex:7], |
| NSException, NSRangeException); |
| |
| XCTAssertEqual([array valueAtIndex:0], FALSE); |
| XCTAssertEqual([array valueAtIndex:1], TRUE); |
| XCTAssertEqual([array valueAtIndex:2], FALSE); |
| XCTAssertEqual([array valueAtIndex:3], TRUE); |
| XCTAssertEqual([array valueAtIndex:4], FALSE); |
| XCTAssertEqual([array valueAtIndex:5], FALSE); |
| [array release]; |
| } |
| |
| - (void)testRemove { |
| const BOOL kValues[] = { FALSE, TRUE, TRUE, FALSE, FALSE, FALSE }; |
| GPBBoolArray *array = |
| [[GPBBoolArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 6U); |
| |
| // First |
| [array removeValueAtIndex:0]; |
| XCTAssertEqual(array.count, 5U); |
| XCTAssertEqual([array valueAtIndex:0], TRUE); |
| |
| // Middle |
| [array removeValueAtIndex:2]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:2], FALSE); |
| |
| // End |
| [array removeValueAtIndex:3]; |
| XCTAssertEqual(array.count, 3U); |
| |
| XCTAssertEqual([array valueAtIndex:0], TRUE); |
| XCTAssertEqual([array valueAtIndex:1], TRUE); |
| XCTAssertEqual([array valueAtIndex:2], FALSE); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], |
| NSException, NSRangeException); |
| |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInplaceMutation { |
| const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE }; |
| GPBBoolArray *array = |
| [[GPBBoolArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| [array replaceValueAtIndex:1 withValue:TRUE]; |
| [array replaceValueAtIndex:3 withValue:FALSE]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], TRUE); |
| XCTAssertEqual([array valueAtIndex:1], TRUE); |
| XCTAssertEqual([array valueAtIndex:2], FALSE); |
| XCTAssertEqual([array valueAtIndex:3], FALSE); |
| |
| XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:FALSE], |
| NSException, NSRangeException); |
| |
| [array exchangeValueAtIndex:1 withValueAtIndex:3]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], TRUE); |
| XCTAssertEqual([array valueAtIndex:1], FALSE); |
| XCTAssertEqual([array valueAtIndex:2], FALSE); |
| XCTAssertEqual([array valueAtIndex:3], TRUE); |
| |
| [array exchangeValueAtIndex:2 withValueAtIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], FALSE); |
| XCTAssertEqual([array valueAtIndex:1], FALSE); |
| XCTAssertEqual([array valueAtIndex:2], TRUE); |
| XCTAssertEqual([array valueAtIndex:3], TRUE); |
| |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], |
| NSException, NSRangeException); |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInternalResizing { |
| const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE }; |
| GPBBoolArray *array = |
| [GPBBoolArray arrayWithCapacity:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| |
| // Add/remove to trigger the intneral buffer to grow/shrink. |
| for (int i = 0; i < 100; ++i) { |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| for (int i = 0; i < 100; ++i) { |
| [array removeValueAtIndex:(i * 2)]; |
| } |
| XCTAssertEqual(array.count, 304U); |
| for (int i = 0; i < 100; ++i) { |
| [array insertValue:FALSE atIndex:(i * 3)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| } |
| |
| @end |
| |
| //%PDDM-EXPAND ARRAY_TESTS2(Enum, int32_t, 71, 72, 73, 74, Raw) |
| // This block of code is generated, do not edit it directly. |
| |
| #pragma mark - Enum |
| |
| @interface GPBEnumArrayTests : XCTestCase |
| @end |
| |
| @implementation GPBEnumArrayTests |
| |
| - (void)testEmpty { |
| GPBEnumArray *array = [[GPBEnumArray alloc] init]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(__unused int32_t value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(__unused int32_t value, __unused NSUInteger idx, __unused BOOL *stop) { |
| XCTFail(@"Shouldn't get here!"); |
| }]; |
| [array release]; |
| } |
| |
| - (void)testOne { |
| GPBEnumArray *array = [GPBEnumArray arrayWithValue:71]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 1U); |
| XCTAssertEqual([array valueAtIndex:0], 71); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException); |
| [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 71); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, 0U); |
| XCTAssertEqual(value, 71); |
| XCTAssertNotEqual(stop, NULL); |
| }]; |
| } |
| |
| - (void)testBasics { |
| static const int32_t kValues[] = { 71, 72, 73, 74 }; |
| GPBEnumArray *array = |
| [[GPBEnumArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 71); |
| XCTAssertEqual([array valueAtIndex:1], 72); |
| XCTAssertEqual([array valueAtIndex:2], 73); |
| XCTAssertEqual([array valueAtIndex:3], 74); |
| XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException); |
| __block NSUInteger idx2 = 0; |
| [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| // Stopping the enumeration. |
| idx2 = 0; |
| [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 2U); |
| XCTAssertNotEqual(idx, 3U); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 1U); |
| XCTAssertNotEqual(idx, 0U); |
| ++idx2; |
| }]; |
| // Ensure description doesn't choke. |
| XCTAssertTrue(array.description.length > 10); |
| [array release]; |
| } |
| |
| - (void)testEquality { |
| const int32_t kValues1[] = { 71, 72, 73 }; |
| const int32_t kValues2[] = { 71, 74, 73 }; |
| const int32_t kValues3[] = { 71, 72, 73, 74 }; |
| GPBEnumArray *array1 = |
| [[GPBEnumArray alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1); |
| GPBEnumArray *array1prime = |
| [[GPBEnumArray alloc] initWithValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1prime); |
| GPBEnumArray *array2 = |
| [[GPBEnumArray alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| GPBEnumArray *array3 = |
| [[GPBEnumArray alloc] initWithValues:kValues3 |
| count:GPBARRAYSIZE(kValues3)]; |
| XCTAssertNotNil(array3); |
| |
| // Identity |
| XCTAssertTrue([array1 isEqual:array1]); |
| // Wrong type doesn't blow up. |
| XCTAssertFalse([array1 isEqual:@"bogus"]); |
| // 1/1Prime should be different objects, but equal. |
| XCTAssertNotEqual(array1, array1prime); |
| XCTAssertEqualObjects(array1, array1prime); |
| // Equal, so they must have same hash. |
| XCTAssertEqual([array1 hash], [array1prime hash]); |
| |
| // 1/2/3 shouldn't be equal. |
| XCTAssertNotEqualObjects(array1, array2); |
| XCTAssertNotEqualObjects(array1, array3); |
| XCTAssertNotEqualObjects(array2, array3); |
| |
| [array1 release]; |
| [array1prime release]; |
| [array2 release]; |
| [array3 release]; |
| } |
| |
| - (void)testCopy { |
| const int32_t kValues[] = { 71, 72, 73, 74 }; |
| GPBEnumArray *array = |
| [[GPBEnumArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBEnumArray *array2 = [array copy]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new object but equal. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array2 release]; |
| [array release]; |
| } |
| |
| - (void)testArrayFromArray { |
| const int32_t kValues[] = { 71, 72, 73, 74 }; |
| GPBEnumArray *array = |
| [[GPBEnumArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBEnumArray *array2 = [GPBEnumArray arrayWithValueArray:array]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new pointer, but equal objects. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| [array release]; |
| } |
| |
| - (void)testAdds { |
| GPBEnumArray *array = [GPBEnumArray array]; |
| XCTAssertNotNil(array); |
| |
| XCTAssertEqual(array.count, 0U); |
| [array addValue:71]; |
| XCTAssertEqual(array.count, 1U); |
| |
| const int32_t kValues1[] = { 72, 73 }; |
| [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertEqual(array.count, 3U); |
| |
| const int32_t kValues2[] = { 74, 71 }; |
| GPBEnumArray *array2 = |
| [[GPBEnumArray alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| [array addRawValuesFromArray:array2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // Zero/nil inputs do nothing. |
| [array addValues:kValues1 count:0]; |
| XCTAssertEqual(array.count, 5U); |
| [array addValues:NULL count:5]; |
| XCTAssertEqual(array.count, 5U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 71); |
| XCTAssertEqual([array valueAtIndex:1], 72); |
| XCTAssertEqual([array valueAtIndex:2], 73); |
| XCTAssertEqual([array valueAtIndex:3], 74); |
| XCTAssertEqual([array valueAtIndex:4], 71); |
| [array2 release]; |
| } |
| |
| - (void)testInsert { |
| const int32_t kValues[] = { 71, 72, 73 }; |
| GPBEnumArray *array = |
| [[GPBEnumArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 3U); |
| |
| // First |
| [array insertValue:74 atIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| |
| // Middle |
| [array insertValue:74 atIndex:2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| // End |
| [array insertValue:74 atIndex:5]; |
| XCTAssertEqual(array.count, 6U); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array insertValue:74 atIndex:7], |
| NSException, NSRangeException); |
| |
| XCTAssertEqual([array valueAtIndex:0], 74); |
| XCTAssertEqual([array valueAtIndex:1], 71); |
| XCTAssertEqual([array valueAtIndex:2], 74); |
| XCTAssertEqual([array valueAtIndex:3], 72); |
| XCTAssertEqual([array valueAtIndex:4], 73); |
| XCTAssertEqual([array valueAtIndex:5], 74); |
| [array release]; |
| } |
| |
| - (void)testRemove { |
| const int32_t kValues[] = { 74, 71, 72, 74, 73, 74 }; |
| GPBEnumArray *array = |
| [[GPBEnumArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 6U); |
| |
| // First |
| [array removeValueAtIndex:0]; |
| XCTAssertEqual(array.count, 5U); |
| XCTAssertEqual([array valueAtIndex:0], 71); |
| |
| // Middle |
| [array removeValueAtIndex:2]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:2], 73); |
| |
| // End |
| [array removeValueAtIndex:3]; |
| XCTAssertEqual(array.count, 3U); |
| |
| XCTAssertEqual([array valueAtIndex:0], 71); |
| XCTAssertEqual([array valueAtIndex:1], 72); |
| XCTAssertEqual([array valueAtIndex:2], 73); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3], |
| NSException, NSRangeException); |
| |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInplaceMutation { |
| const int32_t kValues[] = { 71, 71, 73, 73 }; |
| GPBEnumArray *array = |
| [[GPBEnumArray alloc] initWithValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| [array replaceValueAtIndex:1 withValue:72]; |
| [array replaceValueAtIndex:3 withValue:74]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 71); |
| XCTAssertEqual([array valueAtIndex:1], 72); |
| XCTAssertEqual([array valueAtIndex:2], 73); |
| XCTAssertEqual([array valueAtIndex:3], 74); |
| |
| XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:74], |
| NSException, NSRangeException); |
| |
| [array exchangeValueAtIndex:1 withValueAtIndex:3]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 71); |
| XCTAssertEqual([array valueAtIndex:1], 74); |
| XCTAssertEqual([array valueAtIndex:2], 73); |
| XCTAssertEqual([array valueAtIndex:3], 72); |
| |
| [array exchangeValueAtIndex:2 withValueAtIndex:0]; |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 73); |
| XCTAssertEqual([array valueAtIndex:1], 74); |
| XCTAssertEqual([array valueAtIndex:2], 71); |
| XCTAssertEqual([array valueAtIndex:3], 72); |
| |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1], |
| NSException, NSRangeException); |
| XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4], |
| NSException, NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testInternalResizing { |
| const int32_t kValues[] = { 71, 72, 73, 74 }; |
| GPBEnumArray *array = |
| [GPBEnumArray arrayWithCapacity:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| |
| // Add/remove to trigger the intneral buffer to grow/shrink. |
| for (int i = 0; i < 100; ++i) { |
| [array addValues:kValues count:GPBARRAYSIZE(kValues)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| for (int i = 0; i < 100; ++i) { |
| [array removeValueAtIndex:(i * 2)]; |
| } |
| XCTAssertEqual(array.count, 304U); |
| for (int i = 0; i < 100; ++i) { |
| [array insertValue:74 atIndex:(i * 3)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| } |
| |
| @end |
| |
| //%PDDM-EXPAND-END (8 expansions) |
| |
| // clang-format on |
| |
| #pragma mark - Non macro-based Enum tests |
| |
| // These are hand written tests to cover the verification and raw methods. |
| |
| @interface GPBEnumArrayCustomTests : XCTestCase |
| @end |
| |
| @implementation GPBEnumArrayCustomTests |
| |
| - (void)testRawBasics { |
| static const int32_t kValues[] = {71, 272, 73, 374}; |
| static const int32_t kValuesFiltered[] = {71, kGPBUnrecognizedEnumeratorValue, 73, |
| kGPBUnrecognizedEnumeratorValue}; |
| XCTAssertEqual(GPBARRAYSIZE(kValues), GPBARRAYSIZE(kValuesFiltered)); |
| GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue |
| rawValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 4U); |
| GPBEnumValidationFunc func = TestingEnum_IsValidValue; |
| XCTAssertEqual(array.validationFunc, func); |
| XCTAssertEqual([array rawValueAtIndex:0], 71); |
| XCTAssertEqual([array rawValueAtIndex:1], 272); |
| XCTAssertEqual([array valueAtIndex:1], kGPBUnrecognizedEnumeratorValue); |
| XCTAssertEqual([array rawValueAtIndex:2], 73); |
| XCTAssertEqual([array rawValueAtIndex:3], 374); |
| XCTAssertEqual([array valueAtIndex:3], kGPBUnrecognizedEnumeratorValue); |
| XCTAssertThrowsSpecificNamed([array rawValueAtIndex:4], NSException, NSRangeException); |
| __block NSUInteger idx2 = 0; |
| [array enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValuesFiltered[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateRawValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValuesFiltered[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| ++idx2; |
| }]; |
| // Stopping the enumeration. |
| idx2 = 0; |
| [array enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, idx2); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 2U); |
| XCTAssertNotEqual(idx, 3U); |
| ++idx2; |
| }]; |
| idx2 = 0; |
| [array enumerateRawValuesWithOptions:NSEnumerationReverse |
| usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) { |
| XCTAssertEqual(idx, (3 - idx2)); |
| XCTAssertEqual(value, kValues[idx]); |
| XCTAssertNotEqual(stop, NULL); |
| if (idx2 == 1) *stop = YES; |
| XCTAssertNotEqual(idx, 1U); |
| XCTAssertNotEqual(idx, 0U); |
| ++idx2; |
| }]; |
| [array release]; |
| } |
| |
| - (void)testEquality { |
| const int32_t kValues1[] = {71, 72, 173}; // With unknown value |
| const int32_t kValues2[] = {71, 74, 173}; // With unknown value |
| const int32_t kValues3[] = {71, 72, 173, 74}; // With unknown value |
| GPBEnumArray *array1 = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue |
| rawValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1); |
| GPBEnumArray *array1prime = |
| [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue2 |
| rawValues:kValues1 |
| count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertNotNil(array1prime); |
| GPBEnumArray *array2 = [[GPBEnumArray alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| GPBEnumArray *array3 = [[GPBEnumArray alloc] initWithValues:kValues3 |
| count:GPBARRAYSIZE(kValues3)]; |
| XCTAssertNotNil(array3); |
| |
| // 1/1Prime should be different objects, but equal. |
| XCTAssertNotEqual(array1, array1prime); |
| XCTAssertEqualObjects(array1, array1prime); |
| // Equal, so they must have same hash. |
| XCTAssertEqual([array1 hash], [array1prime hash]); |
| // But different validation functions. |
| XCTAssertNotEqual(array1.validationFunc, array1prime.validationFunc); |
| |
| // 1/2/3 shouldn't be equal. |
| XCTAssertNotEqualObjects(array1, array2); |
| XCTAssertNotEqualObjects(array1, array3); |
| XCTAssertNotEqualObjects(array2, array3); |
| |
| [array1 release]; |
| [array1prime release]; |
| [array2 release]; |
| [array3 release]; |
| } |
| |
| - (void)testCopy { |
| const int32_t kValues[] = {71, 72}; |
| GPBEnumArray *array = [[GPBEnumArray alloc] initWithValues:kValues count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| [array addRawValue:1000]; // Unknown |
| XCTAssertEqual(array.count, 3U); |
| XCTAssertEqual([array rawValueAtIndex:0], 71); |
| XCTAssertEqual([array rawValueAtIndex:1], 72); |
| XCTAssertEqual([array rawValueAtIndex:2], 1000); |
| XCTAssertEqual([array valueAtIndex:2], kGPBUnrecognizedEnumeratorValue); |
| |
| GPBEnumArray *array2 = [array copy]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new object but equal. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| XCTAssertEqual(array.validationFunc, array2.validationFunc); |
| XCTAssertTrue([array2 isKindOfClass:[GPBEnumArray class]]); |
| XCTAssertEqual(array2.count, 3U); |
| XCTAssertEqual([array2 rawValueAtIndex:0], 71); |
| XCTAssertEqual([array2 rawValueAtIndex:1], 72); |
| XCTAssertEqual([array2 rawValueAtIndex:2], 1000); |
| XCTAssertEqual([array2 valueAtIndex:2], kGPBUnrecognizedEnumeratorValue); |
| [array2 release]; |
| [array release]; |
| } |
| |
| - (void)testArrayFromArray { |
| const int32_t kValues[] = {71, 172, 173, 74}; // Unknowns |
| GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue |
| rawValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| GPBEnumArray *array2 = [GPBEnumArray arrayWithValueArray:array]; |
| XCTAssertNotNil(array2); |
| |
| // Should be new pointer, but equal objects. |
| XCTAssertNotEqual(array, array2); |
| XCTAssertEqualObjects(array, array2); |
| XCTAssertEqual(array.validationFunc, array2.validationFunc); |
| [array release]; |
| } |
| |
| - (void)testUnknownAdds { |
| GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue]; |
| XCTAssertNotNil(array); |
| |
| XCTAssertThrowsSpecificNamed([array addValue:172], NSException, NSInvalidArgumentException); |
| XCTAssertEqual(array.count, 0U); |
| |
| const int32_t kValues1[] = {172, 173}; // Unknown |
| XCTAssertThrowsSpecificNamed([array addValues:kValues1 count:GPBARRAYSIZE(kValues1)], NSException, |
| NSInvalidArgumentException); |
| XCTAssertEqual(array.count, 0U); |
| [array release]; |
| } |
| |
| - (void)testRawAdds { |
| GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue]; |
| XCTAssertNotNil(array); |
| |
| XCTAssertEqual(array.count, 0U); |
| [array addRawValue:71]; // Valid |
| XCTAssertEqual(array.count, 1U); |
| |
| const int32_t kValues1[] = {172, 173}; // Unknown |
| [array addRawValues:kValues1 count:GPBARRAYSIZE(kValues1)]; |
| XCTAssertEqual(array.count, 3U); |
| |
| const int32_t kValues2[] = {74, 71}; |
| GPBEnumArray *array2 = [[GPBEnumArray alloc] initWithValues:kValues2 |
| count:GPBARRAYSIZE(kValues2)]; |
| XCTAssertNotNil(array2); |
| [array addRawValuesFromArray:array2]; |
| XCTAssertEqual(array.count, 5U); |
| |
| XCTAssertEqual([array rawValueAtIndex:0], 71); |
| XCTAssertEqual([array rawValueAtIndex:1], 172); |
| XCTAssertEqual([array valueAtIndex:1], kGPBUnrecognizedEnumeratorValue); |
| XCTAssertEqual([array rawValueAtIndex:2], 173); |
| XCTAssertEqual([array valueAtIndex:2], kGPBUnrecognizedEnumeratorValue); |
| XCTAssertEqual([array rawValueAtIndex:3], 74); |
| XCTAssertEqual([array rawValueAtIndex:4], 71); |
| [array release]; |
| } |
| |
| - (void)testUnknownInserts { |
| const int32_t kValues[] = {71, 72, 73}; |
| GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue |
| rawValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 3U); |
| |
| // First |
| XCTAssertThrowsSpecificNamed([array insertValue:174 atIndex:0], NSException, |
| NSInvalidArgumentException); |
| XCTAssertEqual(array.count, 3U); |
| |
| // Middle |
| XCTAssertThrowsSpecificNamed([array insertValue:274 atIndex:1], NSException, |
| NSInvalidArgumentException); |
| XCTAssertEqual(array.count, 3U); |
| |
| // End |
| XCTAssertThrowsSpecificNamed([array insertValue:374 atIndex:3], NSException, |
| NSInvalidArgumentException); |
| XCTAssertEqual(array.count, 3U); |
| [array release]; |
| } |
| |
| - (void)testRawInsert { |
| const int32_t kValues[] = {71, 72, 73}; |
| GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue |
| rawValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| XCTAssertEqual(array.count, 3U); |
| |
| // First |
| [array insertRawValue:174 atIndex:0]; // Unknown |
| XCTAssertEqual(array.count, 4U); |
| |
| // Middle |
| [array insertRawValue:274 atIndex:2]; // Unknown |
| XCTAssertEqual(array.count, 5U); |
| |
| // End |
| [array insertRawValue:374 atIndex:5]; // Unknown |
| XCTAssertEqual(array.count, 6U); |
| |
| // Too far. |
| XCTAssertThrowsSpecificNamed([array insertRawValue:74 atIndex:7], NSException, NSRangeException); |
| |
| XCTAssertEqual([array rawValueAtIndex:0], 174); |
| XCTAssertEqual([array valueAtIndex:0], kGPBUnrecognizedEnumeratorValue); |
| XCTAssertEqual([array rawValueAtIndex:1], 71); |
| XCTAssertEqual([array rawValueAtIndex:2], 274); |
| XCTAssertEqual([array valueAtIndex:2], kGPBUnrecognizedEnumeratorValue); |
| XCTAssertEqual([array rawValueAtIndex:3], 72); |
| XCTAssertEqual([array rawValueAtIndex:4], 73); |
| XCTAssertEqual([array rawValueAtIndex:5], 374); |
| XCTAssertEqual([array valueAtIndex:5], kGPBUnrecognizedEnumeratorValue); |
| [array release]; |
| } |
| |
| - (void)testUnknownInplaceMutation { |
| const int32_t kValues[] = {71, 72, 73, 74}; |
| GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue |
| rawValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:1 withValue:172], NSException, |
| NSInvalidArgumentException); |
| XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:3 withValue:274], NSException, |
| NSInvalidArgumentException); |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array valueAtIndex:0], 71); |
| XCTAssertEqual([array valueAtIndex:1], 72); |
| XCTAssertEqual([array valueAtIndex:2], 73); |
| XCTAssertEqual([array valueAtIndex:3], 74); |
| [array release]; |
| } |
| |
| - (void)testRawInplaceMutation { |
| const int32_t kValues[] = {71, 72, 73, 74}; |
| GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue |
| rawValues:kValues |
| count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| [array replaceValueAtIndex:1 withRawValue:172]; // Unknown |
| [array replaceValueAtIndex:3 withRawValue:274]; // Unknown |
| XCTAssertEqual(array.count, 4U); |
| XCTAssertEqual([array rawValueAtIndex:0], 71); |
| XCTAssertEqual([array rawValueAtIndex:1], 172); |
| XCTAssertEqual([array valueAtIndex:1], kGPBUnrecognizedEnumeratorValue); |
| XCTAssertEqual([array rawValueAtIndex:2], 73); |
| XCTAssertEqual([array rawValueAtIndex:3], 274); |
| XCTAssertEqual([array valueAtIndex:3], kGPBUnrecognizedEnumeratorValue); |
| |
| XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withRawValue:74], NSException, |
| NSRangeException); |
| [array release]; |
| } |
| |
| - (void)testRawInternalResizing { |
| const int32_t kValues[] = {71, 172, 173, 74}; // Unknown |
| GPBEnumArray *array = [[GPBEnumArray alloc] initWithValues:kValues count:GPBARRAYSIZE(kValues)]; |
| XCTAssertNotNil(array); |
| |
| // Add/remove to trigger the intneral buffer to grow/shrink. |
| for (int i = 0; i < 100; ++i) { |
| [array addRawValues:kValues count:GPBARRAYSIZE(kValues)]; |
| } |
| XCTAssertEqual(array.count, 404U); |
| for (int i = 0; i < 100; ++i) { |
| [array removeValueAtIndex:(i * 2)]; |
| } |
| XCTAssertEqual(array.count, 304U); |
| for (int i = 0; i < 100; ++i) { |
| [array insertRawValue:274 atIndex:(i * 3)]; // Unknown |
| } |
| XCTAssertEqual(array.count, 404U); |
| [array removeAll]; |
| XCTAssertEqual(array.count, 0U); |
| [array release]; |
| } |
| |
| @end |
| |
| #pragma mark - GPBAutocreatedArray Tests |
| |
| // These are hand written tests to double check some behaviors of the |
| // GPBAutocreatedArray. |
| |
| // NOTE: GPBAutocreatedArray is private to the library, users of the library |
| // should never have to directly deal with this class. |
| |
| @interface GPBAutocreatedArrayTests : XCTestCase |
| @end |
| |
| @implementation GPBAutocreatedArrayTests |
| |
| - (void)testEquality { |
| GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init]; |
| |
| XCTAssertTrue([array isEqual:@[]]); |
| XCTAssertTrue([array isEqualToArray:@[]]); |
| |
| XCTAssertFalse([array isEqual:@[ @"foo" ]]); |
| XCTAssertFalse([array isEqualToArray:@[ @"foo" ]]); |
| |
| [array addObject:@"foo"]; |
| |
| XCTAssertFalse([array isEqual:@[]]); |
| XCTAssertFalse([array isEqualToArray:@[]]); |
| XCTAssertTrue([array isEqual:@[ @"foo" ]]); |
| XCTAssertTrue([array isEqualToArray:@[ @"foo" ]]); |
| XCTAssertFalse([array isEqual:@[ @"bar" ]]); |
| XCTAssertFalse([array isEqualToArray:@[ @"bar" ]]); |
| |
| GPBAutocreatedArray *array2 = [[GPBAutocreatedArray alloc] init]; |
| |
| XCTAssertFalse([array isEqual:array2]); |
| XCTAssertFalse([array isEqualToArray:array2]); |
| |
| [array2 addObject:@"bar"]; |
| XCTAssertFalse([array isEqual:array2]); |
| XCTAssertFalse([array isEqualToArray:array2]); |
| |
| [array2 replaceObjectAtIndex:0 withObject:@"foo"]; |
| XCTAssertTrue([array isEqual:array2]); |
| XCTAssertTrue([array isEqualToArray:array2]); |
| |
| [array2 release]; |
| [array release]; |
| } |
| |
| - (void)testCopy { |
| { |
| GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init]; |
| |
| NSArray *cpy = [array copy]; |
| XCTAssertTrue(cpy != array); // Ptr compare |
| XCTAssertTrue([cpy isKindOfClass:[NSArray class]]); |
| XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]); |
| XCTAssertEqual(cpy.count, (NSUInteger)0); |
| |
| NSArray *cpy2 = [array copy]; |
| XCTAssertTrue(cpy2 != array); // Ptr compare |
| // Can't compare cpy and cpy2 because NSArray has a singleton empty |
| // array it uses, so the ptrs are the same. |
| XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]); |
| XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]); |
| XCTAssertEqual(cpy2.count, (NSUInteger)0); |
| |
| [cpy2 release]; |
| [cpy release]; |
| [array release]; |
| } |
| |
| { |
| GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init]; |
| |
| NSMutableArray *cpy = [array mutableCopy]; |
| XCTAssertTrue(cpy != array); // Ptr compare |
| XCTAssertTrue([cpy isKindOfClass:[NSMutableArray class]]); |
| XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]); |
| XCTAssertEqual(cpy.count, (NSUInteger)0); |
| |
| NSMutableArray *cpy2 = [array mutableCopy]; |
| XCTAssertTrue(cpy2 != array); // Ptr compare |
| XCTAssertTrue(cpy2 != cpy); // Ptr compare |
| XCTAssertTrue([cpy2 isKindOfClass:[NSMutableArray class]]); |
| XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]); |
| XCTAssertEqual(cpy2.count, (NSUInteger)0); |
| |
| [cpy2 release]; |
| [cpy release]; |
| [array release]; |
| } |
| |
| { |
| GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init]; |
| [array addObject:@"foo"]; |
| [array addObject:@"bar"]; |
| |
| NSArray *cpy = [array copy]; |
| XCTAssertTrue(cpy != array); // Ptr compare |
| XCTAssertTrue([cpy isKindOfClass:[NSArray class]]); |
| XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]); |
| XCTAssertEqual(cpy.count, (NSUInteger)2); |
| XCTAssertEqualObjects(cpy[0], @"foo"); |
| XCTAssertEqualObjects(cpy[1], @"bar"); |
| |
| NSArray *cpy2 = [array copy]; |
| XCTAssertTrue(cpy2 != array); // Ptr compare |
| XCTAssertTrue(cpy2 != cpy); // Ptr compare |
| XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]); |
| XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]); |
| XCTAssertEqual(cpy2.count, (NSUInteger)2); |
| XCTAssertEqualObjects(cpy2[0], @"foo"); |
| XCTAssertEqualObjects(cpy2[1], @"bar"); |
| |
| [cpy2 release]; |
| [cpy release]; |
| [array release]; |
| } |
| |
| { |
| GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init]; |
| [array addObject:@"foo"]; |
| [array addObject:@"bar"]; |
| |
| NSMutableArray *cpy = [array mutableCopy]; |
| XCTAssertTrue(cpy != array); // Ptr compare |
| XCTAssertTrue([cpy isKindOfClass:[NSArray class]]); |
| XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]); |
| XCTAssertEqual(cpy.count, (NSUInteger)2); |
| XCTAssertEqualObjects(cpy[0], @"foo"); |
| XCTAssertEqualObjects(cpy[1], @"bar"); |
| |
| NSMutableArray *cpy2 = [array mutableCopy]; |
| XCTAssertTrue(cpy2 != array); // Ptr compare |
| XCTAssertTrue(cpy2 != cpy); // Ptr compare |
| XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]); |
| XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]); |
| XCTAssertEqual(cpy2.count, (NSUInteger)2); |
| XCTAssertEqualObjects(cpy2[0], @"foo"); |
| XCTAssertEqualObjects(cpy2[1], @"bar"); |
| |
| [cpy2 release]; |
| [cpy release]; |
| [array release]; |
| } |
| } |
| |
| - (void)testIndexedSubscriptSupport { |
| // The base NSArray/NSMutableArray behaviors for *IndexedSubscript methods |
| // should still work via the methods that one has to override to make an |
| // NSMutableArray subclass. i.e. - this should "just work" and if these |
| // crash/fail, then something is wrong in how NSMutableArray is subclassed. |
| |
| GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init]; |
| |
| [array addObject:@"foo"]; |
| [array addObject:@"bar"]; |
| XCTAssertEqual(array.count, (NSUInteger)2); |
| XCTAssertEqualObjects(array[0], @"foo"); |
| XCTAssertEqualObjects(array[1], @"bar"); |
| array[0] = @"foo2"; |
| array[2] = @"baz"; |
| XCTAssertEqual(array.count, (NSUInteger)3); |
| XCTAssertEqualObjects(array[0], @"foo2"); |
| XCTAssertEqualObjects(array[1], @"bar"); |
| XCTAssertEqualObjects(array[2], @"baz"); |
| |
| [array release]; |
| } |
| |
| @end |