|  | @@ -39,6 +39,7 @@
 | 
	
		
			
				|  |  |  // 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
 | 
	
	
		
			
				|  | @@ -72,6 +73,10 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |                                           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
 | 
	
	
		
			
				|  | @@ -177,6 +182,8 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  //%    XCTAssertNotEqual(idx, 0U);
 | 
	
		
			
				|  |  |  //%    ++idx2;
 | 
	
		
			
				|  |  |  //%  }];
 | 
	
		
			
				|  |  | +//%  // Ensure description doesn't choke.
 | 
	
		
			
				|  |  | +//%  XCTAssertTrue(array.description.length > 10);
 | 
	
		
			
				|  |  |  //%  [array release];
 | 
	
		
			
				|  |  |  //%}
 | 
	
		
			
				|  |  |  //%
 | 
	
	
		
			
				|  | @@ -201,6 +208,10 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  //%            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);
 | 
	
	
		
			
				|  | @@ -271,6 +282,12 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  //%  [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);
 | 
	
	
		
			
				|  | @@ -391,9 +408,9 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  //%- (void)testInternalResizing {
 | 
	
		
			
				|  |  |  //%  const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 };
 | 
	
		
			
				|  |  |  //%  GPB##NAME##Array *array =
 | 
	
		
			
				|  |  | -//%      [[GPB##NAME##Array alloc] initWithValues:kValues
 | 
	
		
			
				|  |  | -//%            NAME$S                     count:GPBARRAYSIZE(kValues)];
 | 
	
		
			
				|  |  | +//%      [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) {
 | 
	
	
		
			
				|  | @@ -410,7 +427,6 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  //%  XCTAssertEqual(array.count, 404U);
 | 
	
		
			
				|  |  |  //%  [array removeAll];
 | 
	
		
			
				|  |  |  //%  XCTAssertEqual(array.count, 0U);
 | 
	
		
			
				|  |  | -//%  [array release];
 | 
	
		
			
				|  |  |  //%}
 | 
	
		
			
				|  |  |  //%
 | 
	
		
			
				|  |  |  //%@end
 | 
	
	
		
			
				|  | @@ -510,6 +526,8 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |      XCTAssertNotEqual(idx, 0U);
 | 
	
		
			
				|  |  |      ++idx2;
 | 
	
		
			
				|  |  |    }];
 | 
	
		
			
				|  |  | +  // Ensure description doesn't choke.
 | 
	
		
			
				|  |  | +  XCTAssertTrue(array.description.length > 10);
 | 
	
		
			
				|  |  |    [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -534,6 +552,10 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |                                        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);
 | 
	
	
		
			
				|  | @@ -604,6 +626,12 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    [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);
 | 
	
	
		
			
				|  | @@ -724,9 +752,9 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  - (void)testInternalResizing {
 | 
	
		
			
				|  |  |    const int32_t kValues[] = { 1, 2, 3, 4 };
 | 
	
		
			
				|  |  |    GPBInt32Array *array =
 | 
	
		
			
				|  |  | -      [[GPBInt32Array alloc] initWithValues:kValues
 | 
	
		
			
				|  |  | -                                      count:GPBARRAYSIZE(kValues)];
 | 
	
		
			
				|  |  | +      [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) {
 | 
	
	
		
			
				|  | @@ -743,7 +771,6 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 404U);
 | 
	
		
			
				|  |  |    [array removeAll];
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 0U);
 | 
	
		
			
				|  |  | -  [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @end
 | 
	
	
		
			
				|  | @@ -843,6 +870,8 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |      XCTAssertNotEqual(idx, 0U);
 | 
	
		
			
				|  |  |      ++idx2;
 | 
	
		
			
				|  |  |    }];
 | 
	
		
			
				|  |  | +  // Ensure description doesn't choke.
 | 
	
		
			
				|  |  | +  XCTAssertTrue(array.description.length > 10);
 | 
	
		
			
				|  |  |    [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -867,6 +896,10 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |                                         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);
 | 
	
	
		
			
				|  | @@ -937,6 +970,12 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    [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);
 | 
	
	
		
			
				|  | @@ -1057,9 +1096,9 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  - (void)testInternalResizing {
 | 
	
		
			
				|  |  |    const uint32_t kValues[] = { 11U, 12U, 13U, 14U };
 | 
	
		
			
				|  |  |    GPBUInt32Array *array =
 | 
	
		
			
				|  |  | -      [[GPBUInt32Array alloc] initWithValues:kValues
 | 
	
		
			
				|  |  | -                                       count:GPBARRAYSIZE(kValues)];
 | 
	
		
			
				|  |  | +      [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) {
 | 
	
	
		
			
				|  | @@ -1076,7 +1115,6 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 404U);
 | 
	
		
			
				|  |  |    [array removeAll];
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 0U);
 | 
	
		
			
				|  |  | -  [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @end
 | 
	
	
		
			
				|  | @@ -1176,6 +1214,8 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |      XCTAssertNotEqual(idx, 0U);
 | 
	
		
			
				|  |  |      ++idx2;
 | 
	
		
			
				|  |  |    }];
 | 
	
		
			
				|  |  | +  // Ensure description doesn't choke.
 | 
	
		
			
				|  |  | +  XCTAssertTrue(array.description.length > 10);
 | 
	
		
			
				|  |  |    [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1200,6 +1240,10 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |                                        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);
 | 
	
	
		
			
				|  | @@ -1270,6 +1314,12 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    [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);
 | 
	
	
		
			
				|  | @@ -1390,9 +1440,9 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  - (void)testInternalResizing {
 | 
	
		
			
				|  |  |    const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL };
 | 
	
		
			
				|  |  |    GPBInt64Array *array =
 | 
	
		
			
				|  |  | -      [[GPBInt64Array alloc] initWithValues:kValues
 | 
	
		
			
				|  |  | -                                      count:GPBARRAYSIZE(kValues)];
 | 
	
		
			
				|  |  | +      [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) {
 | 
	
	
		
			
				|  | @@ -1409,7 +1459,6 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 404U);
 | 
	
		
			
				|  |  |    [array removeAll];
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 0U);
 | 
	
		
			
				|  |  | -  [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @end
 | 
	
	
		
			
				|  | @@ -1509,6 +1558,8 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |      XCTAssertNotEqual(idx, 0U);
 | 
	
		
			
				|  |  |      ++idx2;
 | 
	
		
			
				|  |  |    }];
 | 
	
		
			
				|  |  | +  // Ensure description doesn't choke.
 | 
	
		
			
				|  |  | +  XCTAssertTrue(array.description.length > 10);
 | 
	
		
			
				|  |  |    [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1533,6 +1584,10 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |                                         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);
 | 
	
	
		
			
				|  | @@ -1603,6 +1658,12 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    [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);
 | 
	
	
		
			
				|  | @@ -1723,9 +1784,9 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  - (void)testInternalResizing {
 | 
	
		
			
				|  |  |    const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL };
 | 
	
		
			
				|  |  |    GPBUInt64Array *array =
 | 
	
		
			
				|  |  | -      [[GPBUInt64Array alloc] initWithValues:kValues
 | 
	
		
			
				|  |  | -                                       count:GPBARRAYSIZE(kValues)];
 | 
	
		
			
				|  |  | +      [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) {
 | 
	
	
		
			
				|  | @@ -1742,7 +1803,6 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 404U);
 | 
	
		
			
				|  |  |    [array removeAll];
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 0U);
 | 
	
		
			
				|  |  | -  [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @end
 | 
	
	
		
			
				|  | @@ -1842,6 +1902,8 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |      XCTAssertNotEqual(idx, 0U);
 | 
	
		
			
				|  |  |      ++idx2;
 | 
	
		
			
				|  |  |    }];
 | 
	
		
			
				|  |  | +  // Ensure description doesn't choke.
 | 
	
		
			
				|  |  | +  XCTAssertTrue(array.description.length > 10);
 | 
	
		
			
				|  |  |    [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1866,6 +1928,10 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |                                        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);
 | 
	
	
		
			
				|  | @@ -1936,6 +2002,12 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    [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);
 | 
	
	
		
			
				|  | @@ -2056,9 +2128,9 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  - (void)testInternalResizing {
 | 
	
		
			
				|  |  |    const float kValues[] = { 51.f, 52.f, 53.f, 54.f };
 | 
	
		
			
				|  |  |    GPBFloatArray *array =
 | 
	
		
			
				|  |  | -      [[GPBFloatArray alloc] initWithValues:kValues
 | 
	
		
			
				|  |  | -                                      count:GPBARRAYSIZE(kValues)];
 | 
	
		
			
				|  |  | +      [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) {
 | 
	
	
		
			
				|  | @@ -2075,7 +2147,6 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 404U);
 | 
	
		
			
				|  |  |    [array removeAll];
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 0U);
 | 
	
		
			
				|  |  | -  [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @end
 | 
	
	
		
			
				|  | @@ -2175,6 +2246,8 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |      XCTAssertNotEqual(idx, 0U);
 | 
	
		
			
				|  |  |      ++idx2;
 | 
	
		
			
				|  |  |    }];
 | 
	
		
			
				|  |  | +  // Ensure description doesn't choke.
 | 
	
		
			
				|  |  | +  XCTAssertTrue(array.description.length > 10);
 | 
	
		
			
				|  |  |    [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2199,6 +2272,10 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |                                         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);
 | 
	
	
		
			
				|  | @@ -2269,6 +2346,12 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    [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.);
 | 
	
	
		
			
				|  | @@ -2389,9 +2472,9 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  - (void)testInternalResizing {
 | 
	
		
			
				|  |  |    const double kValues[] = { 61., 62., 63., 64. };
 | 
	
		
			
				|  |  |    GPBDoubleArray *array =
 | 
	
		
			
				|  |  | -      [[GPBDoubleArray alloc] initWithValues:kValues
 | 
	
		
			
				|  |  | -                                       count:GPBARRAYSIZE(kValues)];
 | 
	
		
			
				|  |  | +      [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) {
 | 
	
	
		
			
				|  | @@ -2408,7 +2491,6 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 404U);
 | 
	
		
			
				|  |  |    [array removeAll];
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 0U);
 | 
	
		
			
				|  |  | -  [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @end
 | 
	
	
		
			
				|  | @@ -2508,6 +2590,8 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |      XCTAssertNotEqual(idx, 0U);
 | 
	
		
			
				|  |  |      ++idx2;
 | 
	
		
			
				|  |  |    }];
 | 
	
		
			
				|  |  | +  // Ensure description doesn't choke.
 | 
	
		
			
				|  |  | +  XCTAssertTrue(array.description.length > 10);
 | 
	
		
			
				|  |  |    [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2532,6 +2616,10 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |                                       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);
 | 
	
	
		
			
				|  | @@ -2602,6 +2690,12 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    [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);
 | 
	
	
		
			
				|  | @@ -2722,9 +2816,9 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  - (void)testInternalResizing {
 | 
	
		
			
				|  |  |    const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE };
 | 
	
		
			
				|  |  |    GPBBoolArray *array =
 | 
	
		
			
				|  |  | -      [[GPBBoolArray alloc] initWithValues:kValues
 | 
	
		
			
				|  |  | -                                     count:GPBARRAYSIZE(kValues)];
 | 
	
		
			
				|  |  | +      [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) {
 | 
	
	
		
			
				|  | @@ -2741,7 +2835,6 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 404U);
 | 
	
		
			
				|  |  |    [array removeAll];
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 0U);
 | 
	
		
			
				|  |  | -  [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @end
 | 
	
	
		
			
				|  | @@ -2841,6 +2934,8 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |      XCTAssertNotEqual(idx, 0U);
 | 
	
		
			
				|  |  |      ++idx2;
 | 
	
		
			
				|  |  |    }];
 | 
	
		
			
				|  |  | +  // Ensure description doesn't choke.
 | 
	
		
			
				|  |  | +  XCTAssertTrue(array.description.length > 10);
 | 
	
		
			
				|  |  |    [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2865,6 +2960,10 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |                                       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);
 | 
	
	
		
			
				|  | @@ -2935,6 +3034,12 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    [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);
 | 
	
	
		
			
				|  | @@ -3055,9 +3160,9 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |  - (void)testInternalResizing {
 | 
	
		
			
				|  |  |    const int32_t kValues[] = { 71, 72, 73, 74 };
 | 
	
		
			
				|  |  |    GPBEnumArray *array =
 | 
	
		
			
				|  |  | -      [[GPBEnumArray alloc] initWithValues:kValues
 | 
	
		
			
				|  |  | -                                     count:GPBARRAYSIZE(kValues)];
 | 
	
		
			
				|  |  | +      [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) {
 | 
	
	
		
			
				|  | @@ -3074,7 +3179,6 @@ static BOOL TestingEnum_IsValidValue2(int32_t value) {
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 404U);
 | 
	
		
			
				|  |  |    [array removeAll];
 | 
	
		
			
				|  |  |    XCTAssertEqual(array.count, 0U);
 | 
	
		
			
				|  |  | -  [array release];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @end
 |