Home | History | Annotate | Download | only in Tests
      1 // Protocol Buffers - Google's data interchange format
      2 // Copyright 2008 Google Inc.  All rights reserved.
      3 // https://developers.google.com/protocol-buffers/
      4 //
      5 // Redistribution and use in source and binary forms, with or without
      6 // modification, are permitted provided that the following conditions are
      7 // met:
      8 //
      9 //     * Redistributions of source code must retain the above copyright
     10 // notice, this list of conditions and the following disclaimer.
     11 //     * Redistributions in binary form must reproduce the above
     12 // copyright notice, this list of conditions and the following disclaimer
     13 // in the documentation and/or other materials provided with the
     14 // distribution.
     15 //     * Neither the name of Google Inc. nor the names of its
     16 // contributors may be used to endorse or promote products derived from
     17 // this software without specific prior written permission.
     18 //
     19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 #import "GPBTestUtilities.h"
     32 
     33 #import "google/protobuf/MapUnittest.pbobjc.h"
     34 #import "google/protobuf/Unittest.pbobjc.h"
     35 #import "google/protobuf/UnittestImport.pbobjc.h"
     36 
     37 const uint32_t kGPBDefaultRepeatCount = 2;
     38 
     39 // Small category to easily turn a CString into an NSData.
     40 @interface NSData (GPBTestCase)
     41 + (NSData *)gpbtu_dataWithCString:(char *)buffer;
     42 + (instancetype)gpbtu_dataWithEmbeddedNulls;
     43 @end
     44 
     45 @implementation NSData (GPBTestCase)
     46 + (NSData *)gpbtu_dataWithCString:(char *)buffer {
     47   return [NSData dataWithBytes:buffer length:strlen(buffer)];
     48 }
     49 
     50 + (instancetype)gpbtu_dataWithUint32:(uint32_t)value {
     51   return [[[self alloc] initWithUint32_gpbtu:value] autorelease];
     52 }
     53 
     54 - (instancetype)initWithUint32_gpbtu:(uint32_t)value {
     55   value = CFSwapInt32HostToLittle(value);
     56   return [self initWithBytes:&value length:sizeof(value)];
     57 }
     58 
     59 + (instancetype)gpbtu_dataWithEmbeddedNulls {
     60   char bytes[6] = "\1\0\2\3\0\5";
     61   return [self dataWithBytes:bytes length:sizeof(bytes)];
     62 }
     63 @end
     64 
     65 @implementation GPBTestCase
     66 
     67 // Return data for name. Optionally (based on #if setting) write out dataToWrite
     68 // to replace that data. Useful for setting golden masters.
     69 - (NSData *)getDataFileNamed:(NSString *)name
     70                  dataToWrite:(NSData *)dataToWrite {
     71   NSBundle *bundle = [NSBundle bundleForClass:[self class]];
     72   NSString *path = [bundle pathForResource:[name stringByDeletingPathExtension]
     73                                     ofType:[name pathExtension]];
     74   XCTAssertNotNil(path, @"Unable to find %@", name);
     75   NSData *data = [NSData dataWithContentsOfFile:path];
     76   XCTAssertNotNil(data, @"Unable to load from %@", path);
     77 #if 0
     78   // Enable to write out golden master files.
     79   if (!path) {
     80     path = [[bundle resourcePath] stringByAppendingPathComponent:name];
     81   }
     82   NSError *error = nil;
     83   BOOL wrote = [dataToWrite writeToFile:path options:NSDataWritingAtomic error:&error];
     84   XCTAssertTrue(wrote, @"Unable to write %@ (%@)", path, error);
     85   NSLog(@"Wrote data file to %@", path);
     86 #else
     87   // Kill off the unused variable warning.
     88   dataToWrite = dataToWrite;
     89 #endif
     90   return data;
     91 }
     92 
     93 // -------------------------------------------------------------------
     94 
     95 - (void)modifyRepeatedExtensions:(TestAllExtensions *)message {
     96   [message setExtension:[UnittestRoot repeatedInt32Extension]
     97                   index:1
     98                   value:@501];
     99   [message setExtension:[UnittestRoot repeatedInt64Extension]
    100                   index:1
    101                   value:@502];
    102   [message setExtension:[UnittestRoot repeatedUint32Extension]
    103                   index:1
    104                   value:@503];
    105   [message setExtension:[UnittestRoot repeatedUint64Extension]
    106                   index:1
    107                   value:@504];
    108   [message setExtension:[UnittestRoot repeatedSint32Extension]
    109                   index:1
    110                   value:@505];
    111   [message setExtension:[UnittestRoot repeatedSint64Extension]
    112                   index:1
    113                   value:@506];
    114   [message setExtension:[UnittestRoot repeatedFixed32Extension]
    115                   index:1
    116                   value:@507];
    117   [message setExtension:[UnittestRoot repeatedFixed64Extension]
    118                   index:1
    119                   value:@508];
    120   [message setExtension:[UnittestRoot repeatedSfixed32Extension]
    121                   index:1
    122                   value:@509];
    123   [message setExtension:[UnittestRoot repeatedSfixed64Extension]
    124                   index:1
    125                   value:@510];
    126   [message setExtension:[UnittestRoot repeatedFloatExtension]
    127                   index:1
    128                   value:@511.0f];
    129   [message setExtension:[UnittestRoot repeatedDoubleExtension]
    130                   index:1
    131                   value:@512.0];
    132   [message setExtension:[UnittestRoot repeatedBoolExtension]
    133                   index:1
    134                   value:@YES];
    135   [message setExtension:[UnittestRoot repeatedStringExtension]
    136                   index:1
    137                   value:@"515"];
    138   [message setExtension:[UnittestRoot repeatedBytesExtension]
    139                   index:1
    140                   value:[NSData gpbtu_dataWithUint32:516]];
    141 
    142   RepeatedGroup_extension *repeatedGroup = [RepeatedGroup_extension message];
    143   [repeatedGroup setA:517];
    144   [message setExtension:[UnittestRoot repeatedGroupExtension]
    145                   index:1
    146                   value:repeatedGroup];
    147   TestAllTypes_NestedMessage *nestedMessage =
    148       [TestAllTypes_NestedMessage message];
    149   [nestedMessage setBb:518];
    150   [message setExtension:[UnittestRoot repeatedNestedMessageExtension]
    151                   index:1
    152                   value:nestedMessage];
    153   ForeignMessage *foreignMessage = [ForeignMessage message];
    154   [foreignMessage setC:519];
    155   [message setExtension:[UnittestRoot repeatedForeignMessageExtension]
    156                   index:1
    157                   value:foreignMessage];
    158   ImportMessage *importMessage = [ImportMessage message];
    159   [importMessage setD:520];
    160   [message setExtension:[UnittestRoot repeatedImportMessageExtension]
    161                   index:1
    162                   value:importMessage];
    163 
    164   [message setExtension:[UnittestRoot repeatedNestedEnumExtension]
    165                   index:1
    166                   value:@(TestAllTypes_NestedEnum_Foo)];
    167   [message setExtension:[UnittestRoot repeatedForeignEnumExtension]
    168                   index:1
    169                   value:@(ForeignEnum_ForeignFoo)];
    170   [message setExtension:[UnittestRoot repeatedImportEnumExtension]
    171                   index:1
    172                   value:@(ImportEnum_ImportFoo)];
    173 
    174   [message setExtension:[UnittestRoot repeatedStringPieceExtension]
    175                   index:1
    176                   value:@"524"];
    177   [message setExtension:[UnittestRoot repeatedCordExtension]
    178                   index:1
    179                   value:@"525"];
    180 }
    181 
    182 - (void)assertAllExtensionsSet:(TestAllExtensions *)message
    183                  repeatedCount:(uint32_t)count {
    184   XCTAssertTrue([message hasExtension:[UnittestRoot optionalInt32Extension]]);
    185   XCTAssertTrue([message hasExtension:[UnittestRoot optionalInt64Extension]]);
    186   XCTAssertTrue([message hasExtension:[UnittestRoot optionalUint32Extension]]);
    187   XCTAssertTrue([message hasExtension:[UnittestRoot optionalUint64Extension]]);
    188   XCTAssertTrue([message hasExtension:[UnittestRoot optionalSint32Extension]]);
    189   XCTAssertTrue([message hasExtension:[UnittestRoot optionalSint64Extension]]);
    190   XCTAssertTrue([message hasExtension:[UnittestRoot optionalFixed32Extension]]);
    191   XCTAssertTrue([message hasExtension:[UnittestRoot optionalFixed64Extension]]);
    192   XCTAssertTrue([message hasExtension:[UnittestRoot optionalSfixed32Extension]]);
    193   XCTAssertTrue([message hasExtension:[UnittestRoot optionalSfixed64Extension]]);
    194   XCTAssertTrue([message hasExtension:[UnittestRoot optionalFloatExtension]]);
    195   XCTAssertTrue([message hasExtension:[UnittestRoot optionalDoubleExtension]]);
    196   XCTAssertTrue([message hasExtension:[UnittestRoot optionalBoolExtension]]);
    197   XCTAssertTrue([message hasExtension:[UnittestRoot optionalStringExtension]]);
    198   XCTAssertTrue([message hasExtension:[UnittestRoot optionalBytesExtension]]);
    199 
    200   XCTAssertTrue([message hasExtension:[UnittestRoot optionalGroupExtension]]);
    201   XCTAssertTrue([message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
    202   XCTAssertTrue([message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
    203   XCTAssertTrue([message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
    204 
    205   XCTAssertTrue([[message getExtension:[UnittestRoot optionalGroupExtension]] hasA]);
    206   XCTAssertTrue([[message getExtension:[UnittestRoot optionalNestedMessageExtension]] hasBb]);
    207   XCTAssertTrue([[message getExtension:[UnittestRoot optionalForeignMessageExtension]] hasC]);
    208   XCTAssertTrue([[message getExtension:[UnittestRoot optionalImportMessageExtension]] hasD]);
    209 
    210   XCTAssertTrue([message hasExtension:[UnittestRoot optionalNestedEnumExtension]]);
    211   XCTAssertTrue([message hasExtension:[UnittestRoot optionalForeignEnumExtension]]);
    212   XCTAssertTrue([message hasExtension:[UnittestRoot optionalImportEnumExtension]]);
    213 
    214   XCTAssertTrue([message hasExtension:[UnittestRoot optionalStringPieceExtension]]);
    215   XCTAssertTrue([message hasExtension:[UnittestRoot optionalCordExtension]]);
    216 
    217   XCTAssertTrue([message hasExtension:[UnittestRoot defaultInt32Extension]]);
    218   XCTAssertTrue([message hasExtension:[UnittestRoot defaultInt64Extension]]);
    219   XCTAssertTrue([message hasExtension:[UnittestRoot defaultUint32Extension]]);
    220   XCTAssertTrue([message hasExtension:[UnittestRoot defaultUint64Extension]]);
    221   XCTAssertTrue([message hasExtension:[UnittestRoot defaultSint32Extension]]);
    222   XCTAssertTrue([message hasExtension:[UnittestRoot defaultSint64Extension]]);
    223   XCTAssertTrue([message hasExtension:[UnittestRoot defaultFixed32Extension]]);
    224   XCTAssertTrue([message hasExtension:[UnittestRoot defaultFixed64Extension]]);
    225   XCTAssertTrue([message hasExtension:[UnittestRoot defaultSfixed32Extension]]);
    226   XCTAssertTrue([message hasExtension:[UnittestRoot defaultSfixed64Extension]]);
    227   XCTAssertTrue([message hasExtension:[UnittestRoot defaultFloatExtension]]);
    228   XCTAssertTrue([message hasExtension:[UnittestRoot defaultDoubleExtension]]);
    229   XCTAssertTrue([message hasExtension:[UnittestRoot defaultBoolExtension]]);
    230   XCTAssertTrue([message hasExtension:[UnittestRoot defaultStringExtension]]);
    231   XCTAssertTrue([message hasExtension:[UnittestRoot defaultBytesExtension]]);
    232 
    233   XCTAssertTrue([message hasExtension:[UnittestRoot defaultNestedEnumExtension]]);
    234   XCTAssertTrue([message hasExtension:[UnittestRoot defaultForeignEnumExtension]]);
    235   XCTAssertTrue([message hasExtension:[UnittestRoot defaultImportEnumExtension]]);
    236 
    237   XCTAssertTrue([message hasExtension:[UnittestRoot defaultStringPieceExtension]]);
    238   XCTAssertTrue([message hasExtension:[UnittestRoot defaultCordExtension]]);
    239 
    240   XCTAssertEqual(101, [[message getExtension:[UnittestRoot optionalInt32Extension]] intValue]);
    241   XCTAssertEqual(102LL, [[message getExtension:[UnittestRoot optionalInt64Extension]] longLongValue]);
    242   XCTAssertEqual(103U, [[message getExtension:[UnittestRoot optionalUint32Extension]] unsignedIntValue]);
    243   XCTAssertEqual(104ULL, [[message getExtension:[UnittestRoot optionalUint64Extension]] unsignedLongLongValue]);
    244   XCTAssertEqual(105, [[message getExtension:[UnittestRoot optionalSint32Extension]] intValue]);
    245   XCTAssertEqual(106LL, [[message getExtension:[UnittestRoot optionalSint64Extension]] longLongValue]);
    246   XCTAssertEqual(107U, [[message getExtension:[UnittestRoot optionalFixed32Extension]] unsignedIntValue]);
    247   XCTAssertEqual(108ULL, [[message getExtension:[UnittestRoot optionalFixed64Extension]] unsignedLongLongValue]);
    248   XCTAssertEqual(109, [[message getExtension:[UnittestRoot optionalSfixed32Extension]] intValue]);
    249   XCTAssertEqual(110LL, [[message getExtension:[UnittestRoot optionalSfixed64Extension]] longLongValue]);
    250   XCTAssertEqualWithAccuracy(111.0f, [[message getExtension:[UnittestRoot optionalFloatExtension]] floatValue], 0.01);
    251   XCTAssertEqualWithAccuracy(112.0, [[message getExtension:[UnittestRoot optionalDoubleExtension]] doubleValue], 0.01);
    252   XCTAssertTrue([[message getExtension:[UnittestRoot optionalBoolExtension]] boolValue]);
    253   XCTAssertEqualObjects(@"115", [message getExtension:[UnittestRoot optionalStringExtension]]);
    254   XCTAssertEqualObjects([NSData gpbtu_dataWithEmbeddedNulls], [message getExtension:[UnittestRoot optionalBytesExtension]]);
    255 
    256   XCTAssertEqual(117, [(TestAllTypes_OptionalGroup*)[message getExtension:[UnittestRoot optionalGroupExtension]] a]);
    257   XCTAssertEqual(118, [(TestAllTypes_NestedMessage*)[message getExtension:[UnittestRoot optionalNestedMessageExtension]] bb]);
    258   XCTAssertEqual(119, [[message getExtension:[UnittestRoot optionalForeignMessageExtension]] c]);
    259   XCTAssertEqual(120, [[message getExtension:[UnittestRoot optionalImportMessageExtension]] d]);
    260 
    261   XCTAssertEqual(TestAllTypes_NestedEnum_Baz, [[message getExtension:[UnittestRoot optionalNestedEnumExtension]] intValue]);
    262   XCTAssertEqual(ForeignEnum_ForeignBaz, [[message getExtension:[UnittestRoot optionalForeignEnumExtension]] intValue]);
    263   XCTAssertEqual(ImportEnum_ImportBaz, [[message getExtension:[UnittestRoot optionalImportEnumExtension]] intValue]);
    264 
    265   XCTAssertEqualObjects(@"124", [message getExtension:[UnittestRoot optionalStringPieceExtension]]);
    266   XCTAssertEqualObjects(@"125", [message getExtension:[UnittestRoot optionalCordExtension]]);
    267 
    268   // -----------------------------------------------------------------
    269 
    270   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedInt32Extension]] count]);
    271   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedInt64Extension]] count]);
    272   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedUint32Extension]] count]);
    273   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedUint64Extension]] count]);
    274   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedSint32Extension]] count]);
    275   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedSint64Extension]] count]);
    276   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedFixed32Extension]] count]);
    277   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedFixed64Extension]] count]);
    278   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedSfixed32Extension]] count]);
    279   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedSfixed64Extension]] count]);
    280   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedFloatExtension]] count]);
    281   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedDoubleExtension]] count]);
    282   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedBoolExtension]] count]);
    283   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedStringExtension]] count]);
    284   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedBytesExtension]] count]);
    285 
    286   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedGroupExtension]] count]);
    287   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedNestedMessageExtension]] count]);
    288   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedForeignMessageExtension]] count]);
    289   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedImportMessageExtension]] count]);
    290   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedNestedEnumExtension]] count]);
    291   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedForeignEnumExtension]] count]);
    292   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedImportEnumExtension]] count]);
    293 
    294   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedStringPieceExtension]] count]);
    295   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedCordExtension]] count]);
    296 
    297   for (uint32_t i = 0; i < count; ++i) {
    298     id extension = [message getExtension:[UnittestRoot repeatedInt32Extension]];
    299     XCTAssertEqual((int)(201 + i * 100), [extension[i] intValue]);
    300     extension = [message getExtension:[UnittestRoot repeatedInt64Extension]];
    301     XCTAssertEqual(202 + i * 100, [extension[i] longLongValue]);
    302     extension = [message getExtension:[UnittestRoot repeatedUint32Extension]];
    303     XCTAssertEqual(203 + i * 100, [extension[i] unsignedIntValue]);
    304     extension = [message getExtension:[UnittestRoot repeatedUint64Extension]];
    305     XCTAssertEqual(204 + i * 100, [extension[i] unsignedLongLongValue]);
    306     extension = [message getExtension:[UnittestRoot repeatedSint32Extension]];
    307     XCTAssertEqual((int)(205 + i * 100), [extension[i] intValue]);
    308     extension = [message getExtension:[UnittestRoot repeatedSint64Extension]];
    309     XCTAssertEqual(206 + i * 100, [extension[i] longLongValue]);
    310     extension = [message getExtension:[UnittestRoot repeatedFixed32Extension]];
    311     XCTAssertEqual(207 + i * 100, [extension[i] unsignedIntValue]);
    312     extension = [message getExtension:[UnittestRoot repeatedFixed64Extension]];
    313     XCTAssertEqual(208 + i * 100, [extension[i] unsignedLongLongValue]);
    314     extension = [message getExtension:[UnittestRoot repeatedSfixed32Extension]];
    315     XCTAssertEqual((int)(209 + i * 100), [extension[i] intValue]);
    316     extension = [message getExtension:[UnittestRoot repeatedSfixed64Extension]];
    317     XCTAssertEqual(210 + i * 100, [extension[i] longLongValue]);
    318     extension = [message getExtension:[UnittestRoot repeatedFloatExtension]];
    319     XCTAssertEqualWithAccuracy(211 + i * 100, [extension[i] floatValue], 0.01);
    320     extension = [message getExtension:[UnittestRoot repeatedDoubleExtension]];
    321     XCTAssertEqualWithAccuracy(212 + i * 100, [extension[i] doubleValue], 0.01);
    322     extension = [message getExtension:[UnittestRoot repeatedBoolExtension]];
    323     XCTAssertEqual((i % 2) ? YES : NO, [extension[i] boolValue]);
    324 
    325     NSString *string = [[NSString alloc] initWithFormat:@"%d", 215 + i * 100];
    326     extension = [message getExtension:[UnittestRoot repeatedStringExtension]];
    327     XCTAssertEqualObjects(string, extension[i]);
    328     [string release];
    329 
    330     NSData *data = [[NSData alloc] initWithUint32_gpbtu:216 + i * 100];
    331     extension = [message getExtension:[UnittestRoot repeatedBytesExtension]];
    332     XCTAssertEqualObjects(data, extension[i]);
    333     [data release];
    334 
    335     extension = [message getExtension:[UnittestRoot repeatedGroupExtension]];
    336     XCTAssertEqual((int)(217 + i * 100), [(TestAllTypes_OptionalGroup*)extension[i] a]);
    337     extension = [message getExtension:[UnittestRoot repeatedNestedMessageExtension]];
    338     XCTAssertEqual((int)(218 + i * 100), [(TestAllTypes_NestedMessage*)extension[i] bb]);
    339     extension = [message getExtension:[UnittestRoot repeatedForeignMessageExtension]];
    340     XCTAssertEqual((int)(219 + i * 100), [extension[i] c]);
    341     extension = [message getExtension:[UnittestRoot repeatedImportMessageExtension]];
    342     XCTAssertEqual((int)(220 + i * 100), [extension[i] d]);
    343 
    344     extension = [message getExtension:[UnittestRoot repeatedNestedEnumExtension]];
    345     XCTAssertEqual((i % 2) ? TestAllTypes_NestedEnum_Bar : TestAllTypes_NestedEnum_Baz, [extension[i] intValue]);
    346     extension = [message getExtension:[UnittestRoot repeatedForeignEnumExtension]];
    347     XCTAssertEqual((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz, [extension[i] intValue]);
    348     extension = [message getExtension:[UnittestRoot repeatedImportEnumExtension]];
    349     XCTAssertEqual((i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz, [extension[i] intValue]);
    350 
    351     string = [[NSString alloc] initWithFormat:@"%d", 224 + i * 100];
    352     extension = [message getExtension:[UnittestRoot repeatedStringPieceExtension]];
    353     XCTAssertEqualObjects(string, extension[i]);
    354     [string release];
    355 
    356     string = [[NSString alloc] initWithFormat:@"%d", 225 + i * 100];
    357     extension = [message getExtension:[UnittestRoot repeatedCordExtension]];
    358     XCTAssertEqualObjects(string, extension[i]);
    359     [string release];
    360   }
    361 
    362   // -----------------------------------------------------------------
    363 
    364   XCTAssertTrue([message hasExtension:[UnittestRoot defaultInt32Extension]]);
    365   XCTAssertTrue([message hasExtension:[UnittestRoot defaultInt64Extension]]);
    366   XCTAssertTrue([message hasExtension:[UnittestRoot defaultUint32Extension]]);
    367   XCTAssertTrue([message hasExtension:[UnittestRoot defaultUint64Extension]]);
    368   XCTAssertTrue([message hasExtension:[UnittestRoot defaultSint32Extension]]);
    369   XCTAssertTrue([message hasExtension:[UnittestRoot defaultSint64Extension]]);
    370   XCTAssertTrue([message hasExtension:[UnittestRoot defaultFixed32Extension]]);
    371   XCTAssertTrue([message hasExtension:[UnittestRoot defaultFixed64Extension]]);
    372   XCTAssertTrue([message hasExtension:[UnittestRoot defaultSfixed32Extension]]);
    373   XCTAssertTrue([message hasExtension:[UnittestRoot defaultSfixed64Extension]]);
    374   XCTAssertTrue([message hasExtension:[UnittestRoot defaultFloatExtension]]);
    375   XCTAssertTrue([message hasExtension:[UnittestRoot defaultDoubleExtension]]);
    376   XCTAssertTrue([message hasExtension:[UnittestRoot defaultBoolExtension]]);
    377   XCTAssertTrue([message hasExtension:[UnittestRoot defaultStringExtension]]);
    378   XCTAssertTrue([message hasExtension:[UnittestRoot defaultBytesExtension]]);
    379 
    380   XCTAssertTrue([message hasExtension:[UnittestRoot defaultNestedEnumExtension]]);
    381   XCTAssertTrue([message hasExtension:[UnittestRoot defaultForeignEnumExtension]]);
    382   XCTAssertTrue([message hasExtension:[UnittestRoot defaultImportEnumExtension]]);
    383 
    384   XCTAssertTrue([message hasExtension:[UnittestRoot defaultStringPieceExtension]]);
    385   XCTAssertTrue([message hasExtension:[UnittestRoot defaultCordExtension]]);
    386 
    387   XCTAssertEqual(401, [[message getExtension:[UnittestRoot defaultInt32Extension]] intValue]);
    388   XCTAssertEqual(402LL, [[message getExtension:[UnittestRoot defaultInt64Extension]] longLongValue]);
    389   XCTAssertEqual(403U, [[message getExtension:[UnittestRoot defaultUint32Extension]] unsignedIntValue]);
    390   XCTAssertEqual(404ULL, [[message getExtension:[UnittestRoot defaultUint64Extension]] unsignedLongLongValue]);
    391   XCTAssertEqual(405, [[message getExtension:[UnittestRoot defaultSint32Extension]] intValue]);
    392   XCTAssertEqual(406LL, [[message getExtension:[UnittestRoot defaultSint64Extension]] longLongValue]);
    393   XCTAssertEqual(407U, [[message getExtension:[UnittestRoot defaultFixed32Extension]] unsignedIntValue]);
    394   XCTAssertEqual(408ULL, [[message getExtension:[UnittestRoot defaultFixed64Extension]] unsignedLongLongValue]);
    395   XCTAssertEqual(409, [[message getExtension:[UnittestRoot defaultSfixed32Extension]] intValue]);
    396   XCTAssertEqual(410LL,[[message getExtension:[UnittestRoot defaultSfixed64Extension]] longLongValue]);
    397   XCTAssertEqualWithAccuracy(411.0f, [[message getExtension:[UnittestRoot defaultFloatExtension]] floatValue], 0.01);
    398   XCTAssertEqualWithAccuracy(412.0, [[message getExtension:[UnittestRoot defaultDoubleExtension]] doubleValue], 0.01);
    399   XCTAssertFalse([[message getExtension:[UnittestRoot defaultBoolExtension]] boolValue]);
    400   XCTAssertEqualObjects(@"415", [message getExtension:[UnittestRoot defaultStringExtension]]);
    401   XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:416], [message getExtension:[UnittestRoot defaultBytesExtension]]);
    402 
    403   XCTAssertEqual(TestAllTypes_NestedEnum_Foo, [[message getExtension:[UnittestRoot defaultNestedEnumExtension]] intValue]);
    404   XCTAssertEqual(ForeignEnum_ForeignFoo, [[message getExtension:[UnittestRoot defaultForeignEnumExtension]] intValue]);
    405   XCTAssertEqual(ImportEnum_ImportFoo, [[message getExtension:[UnittestRoot defaultImportEnumExtension]] intValue]);
    406 
    407   XCTAssertEqualObjects(@"424", [message getExtension:[UnittestRoot defaultStringPieceExtension]]);
    408   XCTAssertEqualObjects(@"425", [message getExtension:[UnittestRoot defaultCordExtension]]);
    409 }
    410 
    411 - (void)assertRepeatedExtensionsModified:(TestAllExtensions *)message
    412                            repeatedCount:(uint32_t)count {
    413   // ModifyRepeatedFields only sets the second repeated element of each
    414   // field.  In addition to verifying this, we also verify that the first
    415   // element and size were *not* modified.
    416   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedInt32Extension]] count]);
    417   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedInt64Extension]] count]);
    418   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedUint32Extension]] count]);
    419   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedUint64Extension]] count]);
    420   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedSint32Extension]] count]);
    421   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedSint64Extension]] count]);
    422   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedFixed32Extension]] count]);
    423   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedFixed64Extension]] count]);
    424   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedSfixed32Extension]] count]);
    425   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedSfixed64Extension]] count]);
    426   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedFloatExtension]] count]);
    427   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedDoubleExtension]] count]);
    428   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedBoolExtension]] count]);
    429   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedStringExtension]] count]);
    430   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedBytesExtension]] count]);
    431 
    432   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedGroupExtension]] count]);
    433   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedNestedMessageExtension]] count]);
    434   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedForeignMessageExtension]] count]);
    435   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedImportMessageExtension]] count]);
    436   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedNestedEnumExtension]] count]);
    437   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedForeignEnumExtension]] count]);
    438   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedImportEnumExtension]] count]);
    439 
    440   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedStringPieceExtension]] count]);
    441   XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedCordExtension]] count]);
    442 
    443   XCTAssertEqual(201,[[message getExtension:[UnittestRoot repeatedInt32Extension]][0] intValue]);
    444   XCTAssertEqual(202LL, [[message getExtension:[UnittestRoot repeatedInt64Extension]][0] longLongValue]);
    445   XCTAssertEqual(203U, [[message getExtension:[UnittestRoot repeatedUint32Extension]][0] unsignedIntValue]);
    446   XCTAssertEqual(204ULL, [[message getExtension:[UnittestRoot repeatedUint64Extension]][0] unsignedLongLongValue]);
    447   XCTAssertEqual(205, [[message getExtension:[UnittestRoot repeatedSint32Extension]][0] intValue]);
    448   XCTAssertEqual(206LL, [[message getExtension:[UnittestRoot repeatedSint64Extension]][0] longLongValue]);
    449   XCTAssertEqual(207U, [[message getExtension:[UnittestRoot repeatedFixed32Extension]][0] unsignedIntValue]);
    450   XCTAssertEqual(208ULL, [[message getExtension:[UnittestRoot repeatedFixed64Extension]][0] unsignedLongLongValue]);
    451   XCTAssertEqual(209, [[message getExtension:[UnittestRoot repeatedSfixed32Extension]][0] intValue]);
    452   XCTAssertEqual(210LL, [[message getExtension:[UnittestRoot repeatedSfixed64Extension]][0] longLongValue]);
    453   XCTAssertEqualWithAccuracy(211.0f, [[message getExtension:[UnittestRoot repeatedFloatExtension]][0] floatValue], 0.01);
    454   XCTAssertEqualWithAccuracy(212.0, [[message getExtension:[UnittestRoot repeatedDoubleExtension]][0] doubleValue], 0.01);
    455   XCTAssertFalse([[message getExtension:[UnittestRoot repeatedBoolExtension]][0] boolValue]);
    456   XCTAssertEqualObjects(@"215", [message getExtension:[UnittestRoot repeatedStringExtension]][0]);
    457   XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:216], [message getExtension:[UnittestRoot repeatedBytesExtension]][0]);
    458 
    459   XCTAssertEqual(217, [(TestAllTypes_OptionalGroup*)[message getExtension:[UnittestRoot repeatedGroupExtension]][0] a]);
    460   XCTAssertEqual(218, [(TestAllTypes_NestedMessage*)[message getExtension:[UnittestRoot repeatedNestedMessageExtension]][0] bb]);
    461   XCTAssertEqual(219, [[message getExtension:[UnittestRoot repeatedForeignMessageExtension]][0] c]);
    462   XCTAssertEqual(220, [[message getExtension:[UnittestRoot repeatedImportMessageExtension]][0] d]);
    463 
    464   XCTAssertEqual(TestAllTypes_NestedEnum_Baz,
    465                  [[message getExtension:[UnittestRoot repeatedNestedEnumExtension]][0] intValue]);
    466   XCTAssertEqual(ForeignEnum_ForeignBaz,
    467                  [[message getExtension:[UnittestRoot repeatedForeignEnumExtension]][0] intValue]);
    468   XCTAssertEqual(ImportEnum_ImportBaz,
    469                  [[message getExtension:[UnittestRoot repeatedImportEnumExtension]][0] intValue]);
    470 
    471   XCTAssertEqualObjects(@"224", [message getExtension:[UnittestRoot repeatedStringPieceExtension]][0]);
    472   XCTAssertEqualObjects(@"225", [message getExtension:[UnittestRoot repeatedCordExtension]][0]);
    473 
    474   // Actually verify the second (modified) elements now.
    475   XCTAssertEqual(501, [[message getExtension:[UnittestRoot repeatedInt32Extension]][1] intValue]);
    476   XCTAssertEqual(502LL, [[message getExtension:[UnittestRoot repeatedInt64Extension]][1] longLongValue]);
    477   XCTAssertEqual(503U, [[message getExtension:[UnittestRoot repeatedUint32Extension]][1] unsignedIntValue]);
    478   XCTAssertEqual(504ULL, [[message getExtension:[UnittestRoot repeatedUint64Extension]][1] unsignedLongLongValue]);
    479   XCTAssertEqual(505, [[message getExtension:[UnittestRoot repeatedSint32Extension]][1] intValue]);
    480   XCTAssertEqual(506LL, [[message getExtension:[UnittestRoot repeatedSint64Extension]][1] longLongValue]);
    481   XCTAssertEqual(507U, [[message getExtension:[UnittestRoot repeatedFixed32Extension]][1] unsignedIntValue]);
    482   XCTAssertEqual(508ULL, [[message getExtension:[UnittestRoot repeatedFixed64Extension]][1] unsignedLongLongValue]);
    483   XCTAssertEqual(509, [[message getExtension:[UnittestRoot repeatedSfixed32Extension]][1] intValue]);
    484   XCTAssertEqual(510LL, [[message getExtension:[UnittestRoot repeatedSfixed64Extension]][1] longLongValue]);
    485   XCTAssertEqualWithAccuracy(511.0f, [[message getExtension:[UnittestRoot repeatedFloatExtension]][1] floatValue], 0.01);
    486   XCTAssertEqualWithAccuracy(512.0, [[message getExtension:[UnittestRoot repeatedDoubleExtension]][1] doubleValue], 0.01);
    487   XCTAssertTrue([[message getExtension:[UnittestRoot repeatedBoolExtension]][1] boolValue]);
    488   XCTAssertEqualObjects(@"515", [message getExtension:[UnittestRoot repeatedStringExtension]][1]);
    489   XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:516], [message getExtension:[UnittestRoot repeatedBytesExtension]][1]);
    490 
    491   XCTAssertEqual(517, [(TestAllTypes_OptionalGroup*)[message getExtension:[UnittestRoot repeatedGroupExtension]][1] a]);
    492   XCTAssertEqual(518, [(TestAllTypes_NestedMessage*)[message getExtension:[UnittestRoot repeatedNestedMessageExtension]][1] bb]);
    493   XCTAssertEqual(519, [[message getExtension:[UnittestRoot repeatedForeignMessageExtension]][1] c]);
    494   XCTAssertEqual(520, [[message getExtension:[UnittestRoot repeatedImportMessageExtension]][1] d]);
    495 
    496   XCTAssertEqual(TestAllTypes_NestedEnum_Foo,
    497                  [[message getExtension:[UnittestRoot repeatedNestedEnumExtension]][1] intValue]);
    498   XCTAssertEqual(ForeignEnum_ForeignFoo,
    499                  [[message getExtension:[UnittestRoot repeatedForeignEnumExtension]][1] intValue]);
    500   XCTAssertEqual(ImportEnum_ImportFoo,
    501                  [[message getExtension:[UnittestRoot repeatedImportEnumExtension]][1] intValue]);
    502 
    503   XCTAssertEqualObjects(@"524", [message getExtension:[UnittestRoot repeatedStringPieceExtension]][1]);
    504   XCTAssertEqualObjects(@"525", [message getExtension:[UnittestRoot repeatedCordExtension]][1]);
    505 }
    506 
    507 // -------------------------------------------------------------------
    508 
    509 - (void)assertAllFieldsSet:(TestAllTypes *)message
    510              repeatedCount:(uint32_t)count {
    511   XCTAssertTrue(message.hasOptionalInt32);
    512   XCTAssertTrue(message.hasOptionalInt64);
    513   XCTAssertTrue(message.hasOptionalUint32);
    514   XCTAssertTrue(message.hasOptionalUint64);
    515   XCTAssertTrue(message.hasOptionalSint32);
    516   XCTAssertTrue(message.hasOptionalSint64);
    517   XCTAssertTrue(message.hasOptionalFixed32);
    518   XCTAssertTrue(message.hasOptionalFixed64);
    519   XCTAssertTrue(message.hasOptionalSfixed32);
    520   XCTAssertTrue(message.hasOptionalSfixed64);
    521   XCTAssertTrue(message.hasOptionalFloat);
    522   XCTAssertTrue(message.hasOptionalDouble);
    523   XCTAssertTrue(message.hasOptionalBool);
    524   XCTAssertTrue(message.hasOptionalString);
    525   XCTAssertTrue(message.hasOptionalBytes);
    526 
    527   XCTAssertTrue(message.hasOptionalGroup);
    528   XCTAssertTrue(message.hasOptionalNestedMessage);
    529   XCTAssertTrue(message.hasOptionalForeignMessage);
    530   XCTAssertTrue(message.hasOptionalImportMessage);
    531 
    532   XCTAssertTrue(message.optionalGroup.hasA);
    533   XCTAssertTrue(message.optionalNestedMessage.hasBb);
    534   XCTAssertTrue(message.optionalForeignMessage.hasC);
    535   XCTAssertTrue(message.optionalImportMessage.hasD);
    536 
    537   XCTAssertTrue(message.hasOptionalNestedEnum);
    538   XCTAssertTrue(message.hasOptionalForeignEnum);
    539   XCTAssertTrue(message.hasOptionalImportEnum);
    540 
    541   XCTAssertTrue(message.hasOptionalStringPiece);
    542   XCTAssertTrue(message.hasOptionalCord);
    543 
    544   XCTAssertEqual(101, message.optionalInt32);
    545   XCTAssertEqual(102LL, message.optionalInt64);
    546   XCTAssertEqual(103U, message.optionalUint32);
    547   XCTAssertEqual(104ULL, message.optionalUint64);
    548   XCTAssertEqual(105, message.optionalSint32);
    549   XCTAssertEqual(106LL, message.optionalSint64);
    550   XCTAssertEqual(107U, message.optionalFixed32);
    551   XCTAssertEqual(108ULL, message.optionalFixed64);
    552   XCTAssertEqual(109, message.optionalSfixed32);
    553   XCTAssertEqual(110LL, message.optionalSfixed64);
    554   XCTAssertEqualWithAccuracy(111.0f, message.optionalFloat, 0.1);
    555   XCTAssertEqualWithAccuracy(112.0, message.optionalDouble, 0.1);
    556   XCTAssertTrue(message.optionalBool);
    557   XCTAssertEqualObjects(@"115", message.optionalString);
    558   XCTAssertEqualObjects([NSData gpbtu_dataWithEmbeddedNulls],
    559                         message.optionalBytes);
    560 
    561   XCTAssertEqual(117, message.optionalGroup.a);
    562   XCTAssertEqual(118, message.optionalNestedMessage.bb);
    563   XCTAssertEqual(119, message.optionalForeignMessage.c);
    564   XCTAssertEqual(120, message.optionalImportMessage.d);
    565 
    566   XCTAssertEqual(TestAllTypes_NestedEnum_Baz, message.optionalNestedEnum);
    567   XCTAssertEqual(ForeignEnum_ForeignBaz, message.optionalForeignEnum);
    568   XCTAssertEqual(ImportEnum_ImportBaz, message.optionalImportEnum);
    569 
    570   XCTAssertEqualObjects(@"124", message.optionalStringPiece);
    571   XCTAssertEqualObjects(@"125", message.optionalCord);
    572 
    573   // -----------------------------------------------------------------
    574 
    575   XCTAssertEqual(count, message.repeatedInt32Array.count);
    576   XCTAssertEqual(count, message.repeatedInt64Array.count);
    577   XCTAssertEqual(count, message.repeatedUint32Array.count);
    578   XCTAssertEqual(count, message.repeatedUint64Array.count);
    579   XCTAssertEqual(count, message.repeatedSint32Array.count);
    580   XCTAssertEqual(count, message.repeatedSint64Array.count);
    581   XCTAssertEqual(count, message.repeatedFixed32Array.count);
    582   XCTAssertEqual(count, message.repeatedFixed64Array.count);
    583   XCTAssertEqual(count, message.repeatedSfixed32Array.count);
    584   XCTAssertEqual(count, message.repeatedSfixed64Array.count);
    585   XCTAssertEqual(count, message.repeatedFloatArray.count);
    586   XCTAssertEqual(count, message.repeatedDoubleArray.count);
    587   XCTAssertEqual(count, message.repeatedBoolArray.count);
    588   XCTAssertEqual(count, message.repeatedStringArray.count);
    589   XCTAssertEqual(count, message.repeatedBytesArray.count);
    590 
    591   XCTAssertEqual(count, message.repeatedGroupArray.count);
    592   XCTAssertEqual(count, message.repeatedNestedMessageArray.count);
    593   XCTAssertEqual(count, message.repeatedForeignMessageArray.count);
    594   XCTAssertEqual(count, message.repeatedImportMessageArray.count);
    595   XCTAssertEqual(count, message.repeatedNestedEnumArray.count);
    596   XCTAssertEqual(count, message.repeatedForeignEnumArray.count);
    597   XCTAssertEqual(count, message.repeatedImportEnumArray.count);
    598 
    599   XCTAssertEqual(count, message.repeatedStringPieceArray.count);
    600   XCTAssertEqual(count, message.repeatedCordArray.count);
    601 
    602   XCTAssertEqual(count, message.repeatedInt32Array_Count);
    603   XCTAssertEqual(count, message.repeatedInt64Array_Count);
    604   XCTAssertEqual(count, message.repeatedUint32Array_Count);
    605   XCTAssertEqual(count, message.repeatedUint64Array_Count);
    606   XCTAssertEqual(count, message.repeatedSint32Array_Count);
    607   XCTAssertEqual(count, message.repeatedSint64Array_Count);
    608   XCTAssertEqual(count, message.repeatedFixed32Array_Count);
    609   XCTAssertEqual(count, message.repeatedFixed64Array_Count);
    610   XCTAssertEqual(count, message.repeatedSfixed32Array_Count);
    611   XCTAssertEqual(count, message.repeatedSfixed64Array_Count);
    612   XCTAssertEqual(count, message.repeatedFloatArray_Count);
    613   XCTAssertEqual(count, message.repeatedDoubleArray_Count);
    614   XCTAssertEqual(count, message.repeatedBoolArray_Count);
    615   XCTAssertEqual(count, message.repeatedStringArray_Count);
    616   XCTAssertEqual(count, message.repeatedBytesArray_Count);
    617 
    618   XCTAssertEqual(count, message.repeatedGroupArray_Count);
    619   XCTAssertEqual(count, message.repeatedNestedMessageArray_Count);
    620   XCTAssertEqual(count, message.repeatedForeignMessageArray_Count);
    621   XCTAssertEqual(count, message.repeatedImportMessageArray_Count);
    622   XCTAssertEqual(count, message.repeatedNestedEnumArray_Count);
    623   XCTAssertEqual(count, message.repeatedForeignEnumArray_Count);
    624   XCTAssertEqual(count, message.repeatedImportEnumArray_Count);
    625 
    626   XCTAssertEqual(count, message.repeatedStringPieceArray_Count);
    627   XCTAssertEqual(count, message.repeatedCordArray_Count);
    628 
    629   for (uint32_t i = 0; i < count; ++i) {
    630     XCTAssertEqual((int)(201 + i * 100),
    631                    [message.repeatedInt32Array valueAtIndex:i]);
    632     XCTAssertEqual(202 + i * 100, [message.repeatedInt64Array valueAtIndex:i]);
    633     XCTAssertEqual(203 + i * 100, [message.repeatedUint32Array valueAtIndex:i]);
    634     XCTAssertEqual(204 + i * 100, [message.repeatedUint64Array valueAtIndex:i]);
    635     XCTAssertEqual((int)(205 + i * 100),
    636                    [message.repeatedSint32Array valueAtIndex:i]);
    637     XCTAssertEqual(206 + i * 100, [message.repeatedSint64Array valueAtIndex:i]);
    638     XCTAssertEqual(207 + i * 100,
    639                    [message.repeatedFixed32Array valueAtIndex:i]);
    640     XCTAssertEqual(208 + i * 100,
    641                    [message.repeatedFixed64Array valueAtIndex:i]);
    642     XCTAssertEqual((int)(209 + i * 100),
    643                    [message.repeatedSfixed32Array valueAtIndex:i]);
    644     XCTAssertEqual(210 + i * 100,
    645                    [message.repeatedSfixed64Array valueAtIndex:i]);
    646     XCTAssertEqualWithAccuracy(
    647         211 + i * 100, [message.repeatedFloatArray valueAtIndex:i], 0.1);
    648     XCTAssertEqualWithAccuracy(
    649         212 + i * 100, [message.repeatedDoubleArray valueAtIndex:i], 0.1);
    650     XCTAssertEqual((i % 2) ? YES : NO,
    651                    [message.repeatedBoolArray valueAtIndex:i]);
    652 
    653     NSString *string = [[NSString alloc] initWithFormat:@"%d", 215 + i * 100];
    654     XCTAssertEqualObjects(string, message.repeatedStringArray[i]);
    655     [string release];
    656 
    657     NSData *data = [[NSData alloc] initWithUint32_gpbtu:216 + i * 100];
    658     XCTAssertEqualObjects(data, message.repeatedBytesArray[i]);
    659     [data release];
    660 
    661     XCTAssertEqual((int)(217 + i * 100), ((TestAllTypes_RepeatedGroup*)message.repeatedGroupArray[i]).a);
    662     XCTAssertEqual((int)(218 + i * 100), ((TestAllTypes_NestedMessage*)message.repeatedNestedMessageArray[i]).bb);
    663     XCTAssertEqual((int)(219 + i * 100), ((ForeignMessage*)message.repeatedForeignMessageArray[i]).c);
    664     XCTAssertEqual((int)(220 + i * 100), ((ImportMessage*)message.repeatedImportMessageArray[i]).d);
    665 
    666     XCTAssertEqual((i % 2) ? TestAllTypes_NestedEnum_Bar : TestAllTypes_NestedEnum_Baz, [message.repeatedNestedEnumArray valueAtIndex:i]);
    667     XCTAssertEqual((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz, [message.repeatedForeignEnumArray valueAtIndex:i]);
    668     XCTAssertEqual((i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz, [message.repeatedImportEnumArray valueAtIndex:i]);
    669 
    670     string = [[NSString alloc] initWithFormat:@"%d", 224 + i * 100];
    671     XCTAssertEqualObjects(string, message.repeatedStringPieceArray[i]);
    672     [string release];
    673 
    674     string = [[NSString alloc] initWithFormat:@"%d", 225 + i * 100];
    675     XCTAssertEqualObjects(string, message.repeatedCordArray[i]);
    676     [string release];
    677   }
    678 
    679   // -----------------------------------------------------------------
    680 
    681   XCTAssertTrue(message.hasDefaultInt32);
    682   XCTAssertTrue(message.hasDefaultInt64);
    683   XCTAssertTrue(message.hasDefaultUint32);
    684   XCTAssertTrue(message.hasDefaultUint64);
    685   XCTAssertTrue(message.hasDefaultSint32);
    686   XCTAssertTrue(message.hasDefaultSint64);
    687   XCTAssertTrue(message.hasDefaultFixed32);
    688   XCTAssertTrue(message.hasDefaultFixed64);
    689   XCTAssertTrue(message.hasDefaultSfixed32);
    690   XCTAssertTrue(message.hasDefaultSfixed64);
    691   XCTAssertTrue(message.hasDefaultFloat);
    692   XCTAssertTrue(message.hasDefaultDouble);
    693   XCTAssertTrue(message.hasDefaultBool);
    694   XCTAssertTrue(message.hasDefaultString);
    695   XCTAssertTrue(message.hasDefaultBytes);
    696 
    697   XCTAssertTrue(message.hasDefaultNestedEnum);
    698   XCTAssertTrue(message.hasDefaultForeignEnum);
    699   XCTAssertTrue(message.hasDefaultImportEnum);
    700 
    701   XCTAssertTrue(message.hasDefaultStringPiece);
    702   XCTAssertTrue(message.hasDefaultCord);
    703 
    704   XCTAssertEqual(401, message.defaultInt32);
    705   XCTAssertEqual(402LL, message.defaultInt64);
    706   XCTAssertEqual(403U, message.defaultUint32);
    707   XCTAssertEqual(404ULL, message.defaultUint64);
    708   XCTAssertEqual(405, message.defaultSint32);
    709   XCTAssertEqual(406LL, message.defaultSint64);
    710   XCTAssertEqual(407U, message.defaultFixed32);
    711   XCTAssertEqual(408ULL, message.defaultFixed64);
    712   XCTAssertEqual(409, message.defaultSfixed32);
    713   XCTAssertEqual(410LL, message.defaultSfixed64);
    714   XCTAssertEqualWithAccuracy(411.0f, message.defaultFloat, 0.1);
    715   XCTAssertEqualWithAccuracy(412.0, message.defaultDouble, 0.1);
    716   XCTAssertFalse(message.defaultBool);
    717   XCTAssertEqualObjects(@"415", message.defaultString);
    718   XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:416],
    719                         message.defaultBytes);
    720 
    721   XCTAssertEqual(TestAllTypes_NestedEnum_Foo, message.defaultNestedEnum);
    722   XCTAssertEqual(ForeignEnum_ForeignFoo, message.defaultForeignEnum);
    723   XCTAssertEqual(ImportEnum_ImportFoo, message.defaultImportEnum);
    724 
    725   XCTAssertEqualObjects(@"424", message.defaultStringPiece);
    726   XCTAssertEqualObjects(@"425", message.defaultCord);
    727 }
    728 
    729 - (void)setAllFields:(TestAllTypes *)message repeatedCount:(uint32_t)count {
    730   [message setOptionalInt32:101];
    731   [message setOptionalInt64:102];
    732   [message setOptionalUint32:103];
    733   [message setOptionalUint64:104];
    734   [message setOptionalSint32:105];
    735   [message setOptionalSint64:106];
    736   [message setOptionalFixed32:107];
    737   [message setOptionalFixed64:108];
    738   [message setOptionalSfixed32:109];
    739   [message setOptionalSfixed64:110];
    740   [message setOptionalFloat:111];
    741   [message setOptionalDouble:112];
    742   [message setOptionalBool:YES];
    743   [message setOptionalString:@"115"];
    744   [message setOptionalBytes:[NSData gpbtu_dataWithEmbeddedNulls]];
    745 
    746   TestAllTypes_OptionalGroup *allTypes = [TestAllTypes_OptionalGroup message];
    747   [allTypes setA:117];
    748   [message setOptionalGroup:allTypes];
    749   TestAllTypes_NestedMessage *nestedMessage =
    750       [TestAllTypes_NestedMessage message];
    751   [nestedMessage setBb:118];
    752   [message setOptionalNestedMessage:nestedMessage];
    753   ForeignMessage *foreignMessage = [ForeignMessage message];
    754   [foreignMessage setC:119];
    755   [message setOptionalForeignMessage:foreignMessage];
    756   ImportMessage *importMessage = [ImportMessage message];
    757   [importMessage setD:120];
    758   [message setOptionalImportMessage:importMessage];
    759 
    760   [message setOptionalNestedEnum:TestAllTypes_NestedEnum_Baz];
    761   [message setOptionalForeignEnum:ForeignEnum_ForeignBaz];
    762   [message setOptionalImportEnum:ImportEnum_ImportBaz];
    763 
    764   [message setOptionalStringPiece:@"124"];
    765   [message setOptionalCord:@"125"];
    766 
    767   // -----------------------------------------------------------------
    768 
    769   for (uint32_t i = 0; i < count; i++) {
    770     [message.repeatedInt32Array addValue:201 + i * 100];
    771     [message.repeatedInt64Array addValue:202 + i * 100];
    772     [message.repeatedUint32Array addValue:203 + i * 100];
    773     [message.repeatedUint64Array addValue:204 + i * 100];
    774     [message.repeatedSint32Array addValue:205 + i * 100];
    775     [message.repeatedSint64Array addValue:206 + i * 100];
    776     [message.repeatedFixed32Array addValue:207 + i * 100];
    777     [message.repeatedFixed64Array addValue:208 + i * 100];
    778     [message.repeatedSfixed32Array addValue:209 + i * 100];
    779     [message.repeatedSfixed64Array addValue:210 + i * 100];
    780     [message.repeatedFloatArray addValue:211 + i * 100];
    781     [message.repeatedDoubleArray addValue:212 + i * 100];
    782     [message.repeatedBoolArray addValue:(i % 2)];
    783     NSString *string = [[NSString alloc] initWithFormat:@"%d", 215 + i * 100];
    784     [message.repeatedStringArray addObject:string];
    785     [string release];
    786 
    787     NSData *data = [[NSData alloc] initWithUint32_gpbtu:216 + i * 100];
    788     [message.repeatedBytesArray addObject:data];
    789     [data release];
    790 
    791     TestAllTypes_RepeatedGroup *testAll =
    792         [[TestAllTypes_RepeatedGroup alloc] init];
    793     [testAll setA:217 + i * 100];
    794     [message.repeatedGroupArray addObject:testAll];
    795     [testAll release];
    796 
    797     nestedMessage = [[TestAllTypes_NestedMessage alloc] init];
    798     [nestedMessage setBb:218 + i * 100];
    799     [message.repeatedNestedMessageArray addObject:nestedMessage];
    800     [nestedMessage release];
    801 
    802     foreignMessage = [[ForeignMessage alloc] init];
    803     [foreignMessage setC:219 + i * 100];
    804     [message.repeatedForeignMessageArray addObject:foreignMessage];
    805     [foreignMessage release];
    806 
    807     importMessage = [[ImportMessage alloc] init];
    808     [importMessage setD:220 + i * 100];
    809     [message.repeatedImportMessageArray addObject:importMessage];
    810     [importMessage release];
    811 
    812     [message.repeatedNestedEnumArray addValue:(i % 2) ? TestAllTypes_NestedEnum_Bar : TestAllTypes_NestedEnum_Baz];
    813 
    814     [message.repeatedForeignEnumArray addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
    815     [message.repeatedImportEnumArray addValue:(i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz];
    816 
    817     string = [[NSString alloc] initWithFormat:@"%d", 224 + i * 100];
    818     [message.repeatedStringPieceArray addObject:string];
    819     [string release];
    820 
    821     string = [[NSString alloc] initWithFormat:@"%d", 225 + i * 100];
    822     [message.repeatedCordArray addObject:string];
    823     [string release];
    824   }
    825   // -----------------------------------------------------------------
    826 
    827   message.defaultInt32 = 401;
    828   message.defaultInt64 = 402;
    829   message.defaultUint32 = 403;
    830   message.defaultUint64 = 404;
    831   message.defaultSint32 = 405;
    832   message.defaultSint64 = 406;
    833   message.defaultFixed32 = 407;
    834   message.defaultFixed64 = 408;
    835   message.defaultSfixed32 = 409;
    836   message.defaultSfixed64 = 410;
    837   message.defaultFloat = 411;
    838   message.defaultDouble = 412;
    839   message.defaultBool = NO;
    840   message.defaultString = @"415";
    841   message.defaultBytes = [NSData gpbtu_dataWithUint32:416];
    842 
    843   message.defaultNestedEnum = TestAllTypes_NestedEnum_Foo;
    844   message.defaultForeignEnum = ForeignEnum_ForeignFoo;
    845   message.defaultImportEnum = ImportEnum_ImportFoo;
    846 
    847   message.defaultStringPiece = @"424";
    848   message.defaultCord = @"425";
    849 }
    850 
    851 - (void)clearAllFields:(TestAllTypes *)message {
    852   message.hasOptionalInt32 = NO;
    853   message.hasOptionalInt64 = NO;
    854   message.hasOptionalUint32 = NO;
    855   message.hasOptionalUint64 = NO;
    856   message.hasOptionalSint32 = NO;
    857   message.hasOptionalSint64 = NO;
    858   message.hasOptionalFixed32 = NO;
    859   message.hasOptionalFixed64 = NO;
    860   message.hasOptionalSfixed32 = NO;
    861   message.hasOptionalSfixed64 = NO;
    862   message.hasOptionalFloat = NO;
    863   message.hasOptionalDouble = NO;
    864   message.hasOptionalBool = NO;
    865   message.hasOptionalString = NO;
    866   message.hasOptionalBytes = NO;
    867 
    868   message.hasOptionalGroup = NO;
    869   message.hasOptionalNestedMessage = NO;
    870   message.hasOptionalForeignMessage = NO;
    871   message.hasOptionalImportMessage = NO;
    872 
    873   message.hasOptionalNestedEnum = NO;
    874   message.hasOptionalForeignEnum = NO;
    875   message.hasOptionalImportEnum = NO;
    876 
    877   message.hasOptionalStringPiece = NO;
    878   message.hasOptionalCord = NO;
    879 
    880   // -----------------------------------------------------------------
    881 
    882   [message.repeatedInt32Array removeAll];
    883   [message.repeatedInt64Array removeAll];
    884   [message.repeatedUint32Array removeAll];
    885   [message.repeatedUint64Array removeAll];
    886   [message.repeatedSint32Array removeAll];
    887   [message.repeatedSint64Array removeAll];
    888   [message.repeatedFixed32Array removeAll];
    889   [message.repeatedFixed64Array removeAll];
    890   [message.repeatedSfixed32Array removeAll];
    891   [message.repeatedSfixed64Array removeAll];
    892   [message.repeatedFloatArray removeAll];
    893   [message.repeatedDoubleArray removeAll];
    894   [message.repeatedBoolArray removeAll];
    895   [message.repeatedStringArray removeAllObjects];
    896   [message.repeatedBytesArray removeAllObjects];
    897 
    898   [message.repeatedGroupArray removeAllObjects];
    899   [message.repeatedNestedMessageArray removeAllObjects];
    900   [message.repeatedForeignMessageArray removeAllObjects];
    901   [message.repeatedImportMessageArray removeAllObjects];
    902 
    903   [message.repeatedNestedEnumArray removeAll];
    904   [message.repeatedForeignEnumArray removeAll];
    905   [message.repeatedImportEnumArray removeAll];
    906 
    907   [message.repeatedStringPieceArray removeAllObjects];
    908   [message.repeatedCordArray removeAllObjects];
    909 
    910   // -----------------------------------------------------------------
    911 
    912   message.hasDefaultInt32 = NO;
    913   message.hasDefaultInt64 = NO;
    914   message.hasDefaultUint32 = NO;
    915   message.hasDefaultUint64 = NO;
    916   message.hasDefaultSint32 = NO;
    917   message.hasDefaultSint64 = NO;
    918   message.hasDefaultFixed32 = NO;
    919   message.hasDefaultFixed64 = NO;
    920   message.hasDefaultSfixed32 = NO;
    921   message.hasDefaultSfixed64 = NO;
    922   message.hasDefaultFloat = NO;
    923   message.hasDefaultDouble = NO;
    924   message.hasDefaultBool = NO;
    925   message.hasDefaultString = NO;
    926   message.hasDefaultBytes = NO;
    927 
    928   message.hasDefaultNestedEnum = NO;
    929   message.hasDefaultForeignEnum = NO;
    930   message.hasDefaultImportEnum = NO;
    931 
    932   message.hasDefaultStringPiece = NO;
    933   message.hasDefaultCord = NO;
    934 }
    935 
    936 - (void)setAllExtensions:(TestAllExtensions *)message
    937            repeatedCount:(uint32_t)count {
    938   [message setExtension:[UnittestRoot optionalInt32Extension] value:@101];
    939   [message setExtension:[UnittestRoot optionalInt64Extension] value:@102L];
    940   [message setExtension:[UnittestRoot optionalUint32Extension] value:@103];
    941   [message setExtension:[UnittestRoot optionalUint64Extension] value:@104L];
    942   [message setExtension:[UnittestRoot optionalSint32Extension] value:@105];
    943   [message setExtension:[UnittestRoot optionalSint64Extension] value:@106L];
    944   [message setExtension:[UnittestRoot optionalFixed32Extension] value:@107];
    945   [message setExtension:[UnittestRoot optionalFixed64Extension] value:@108L];
    946   [message setExtension:[UnittestRoot optionalSfixed32Extension] value:@109];
    947   [message setExtension:[UnittestRoot optionalSfixed64Extension] value:@110L];
    948   [message setExtension:[UnittestRoot optionalFloatExtension] value:@111.0f];
    949   [message setExtension:[UnittestRoot optionalDoubleExtension] value:@112.0];
    950   [message setExtension:[UnittestRoot optionalBoolExtension] value:@YES];
    951   [message setExtension:[UnittestRoot optionalStringExtension] value:@"115"];
    952   [message setExtension:[UnittestRoot optionalBytesExtension]
    953                   value:[NSData gpbtu_dataWithEmbeddedNulls]];
    954 
    955   OptionalGroup_extension *optionalGroup = [OptionalGroup_extension message];
    956   [optionalGroup setA:117];
    957   [message setExtension:[UnittestRoot optionalGroupExtension]
    958                   value:optionalGroup];
    959   TestAllTypes_NestedMessage *nestedMessage =
    960       [TestAllTypes_NestedMessage message];
    961   [nestedMessage setBb:118];
    962   [message setExtension:[UnittestRoot optionalNestedMessageExtension]
    963                   value:nestedMessage];
    964   ForeignMessage *foreignMessage = [ForeignMessage message];
    965   [foreignMessage setC:119];
    966   [message setExtension:[UnittestRoot optionalForeignMessageExtension]
    967                   value:foreignMessage];
    968   ImportMessage *importMessage = [ImportMessage message];
    969   [importMessage setD:120];
    970   [message setExtension:[UnittestRoot optionalImportMessageExtension]
    971                   value:importMessage];
    972 
    973   [message setExtension:[UnittestRoot optionalNestedEnumExtension]
    974                   value:@(TestAllTypes_NestedEnum_Baz)];
    975   [message setExtension:[UnittestRoot optionalForeignEnumExtension]
    976                   value:@(ForeignEnum_ForeignBaz)];
    977   [message setExtension:[UnittestRoot optionalImportEnumExtension]
    978                   value:@(ImportEnum_ImportBaz)];
    979 
    980   [message setExtension:[UnittestRoot optionalStringPieceExtension]
    981                   value:@"124"];
    982   [message setExtension:[UnittestRoot optionalCordExtension] value:@"125"];
    983 
    984   for (uint32_t i = 0; i < count; ++i) {
    985     [message addExtension:[UnittestRoot repeatedInt32Extension]
    986                     value:@(201 + i * 100)];
    987     [message addExtension:[UnittestRoot repeatedInt64Extension]
    988                     value:@(202 + i * 100)];
    989     [message addExtension:[UnittestRoot repeatedUint32Extension]
    990                     value:@(203 + i * 100)];
    991     [message addExtension:[UnittestRoot repeatedUint64Extension]
    992                     value:@(204 + i * 100)];
    993     [message addExtension:[UnittestRoot repeatedSint32Extension]
    994                     value:@(205 + i * 100)];
    995     [message addExtension:[UnittestRoot repeatedSint64Extension]
    996                     value:@(206 + i * 100)];
    997     [message addExtension:[UnittestRoot repeatedFixed32Extension]
    998                     value:@(207 + i * 100)];
    999     [message addExtension:[UnittestRoot repeatedFixed64Extension]
   1000                     value:@(208 + i * 100)];
   1001     [message addExtension:[UnittestRoot repeatedSfixed32Extension]
   1002                     value:@(209 + i * 100)];
   1003     [message addExtension:[UnittestRoot repeatedSfixed64Extension]
   1004                     value:@(210 + i * 100)];
   1005     [message addExtension:[UnittestRoot repeatedFloatExtension]
   1006                     value:@(211 + i * 100)];
   1007     [message addExtension:[UnittestRoot repeatedDoubleExtension]
   1008                     value:@(212 + i * 100)];
   1009     [message addExtension:[UnittestRoot repeatedBoolExtension]
   1010                     value:@((i % 2) ? YES : NO)];
   1011     NSString *string = [[NSString alloc] initWithFormat:@"%d", 215 + i * 100];
   1012     [message addExtension:[UnittestRoot repeatedStringExtension] value:string];
   1013     [string release];
   1014     NSData *data = [[NSData alloc] initWithUint32_gpbtu:216 + i * 100];
   1015     [message addExtension:[UnittestRoot repeatedBytesExtension] value:data];
   1016     [data release];
   1017 
   1018     RepeatedGroup_extension *repeatedGroup =
   1019         [[RepeatedGroup_extension alloc] init];
   1020     [repeatedGroup setA:217 + i * 100];
   1021     [message addExtension:[UnittestRoot repeatedGroupExtension]
   1022                     value:repeatedGroup];
   1023     [repeatedGroup release];
   1024     nestedMessage = [[TestAllTypes_NestedMessage alloc] init];
   1025     [nestedMessage setBb:218 + i * 100];
   1026     [message addExtension:[UnittestRoot repeatedNestedMessageExtension]
   1027                     value:nestedMessage];
   1028     [nestedMessage release];
   1029     foreignMessage = [[ForeignMessage alloc] init];
   1030     [foreignMessage setC:219 + i * 100];
   1031     [message addExtension:[UnittestRoot repeatedForeignMessageExtension]
   1032                     value:foreignMessage];
   1033     [foreignMessage release];
   1034     importMessage = [[ImportMessage alloc] init];
   1035     [importMessage setD:220 + i * 100];
   1036     [message addExtension:[UnittestRoot repeatedImportMessageExtension]
   1037                     value:importMessage];
   1038     [importMessage release];
   1039     [message addExtension:[UnittestRoot repeatedNestedEnumExtension]
   1040                     value:@((i % 2) ? TestAllTypes_NestedEnum_Bar
   1041                                     : TestAllTypes_NestedEnum_Baz)];
   1042     [message addExtension:[UnittestRoot repeatedForeignEnumExtension]
   1043                     value:@((i % 2) ? ForeignEnum_ForeignBar
   1044                                     : ForeignEnum_ForeignBaz)];
   1045     [message
   1046         addExtension:[UnittestRoot repeatedImportEnumExtension]
   1047                value:@((i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz)];
   1048 
   1049     string = [[NSString alloc] initWithFormat:@"%d", 224 + i * 100];
   1050     [message addExtension:[UnittestRoot repeatedStringPieceExtension]
   1051                     value:string];
   1052     [string release];
   1053 
   1054     string = [[NSString alloc] initWithFormat:@"%d", 225 + i * 100];
   1055     [message addExtension:[UnittestRoot repeatedCordExtension] value:string];
   1056     [string release];
   1057   }
   1058 
   1059   // -----------------------------------------------------------------
   1060 
   1061   [message setExtension:[UnittestRoot defaultInt32Extension] value:@401];
   1062   [message setExtension:[UnittestRoot defaultInt64Extension] value:@402L];
   1063   [message setExtension:[UnittestRoot defaultUint32Extension] value:@403];
   1064   [message setExtension:[UnittestRoot defaultUint64Extension] value:@404L];
   1065   [message setExtension:[UnittestRoot defaultSint32Extension] value:@405];
   1066   [message setExtension:[UnittestRoot defaultSint64Extension] value:@406L];
   1067   [message setExtension:[UnittestRoot defaultFixed32Extension] value:@407];
   1068   [message setExtension:[UnittestRoot defaultFixed64Extension] value:@408L];
   1069   [message setExtension:[UnittestRoot defaultSfixed32Extension] value:@409];
   1070   [message setExtension:[UnittestRoot defaultSfixed64Extension] value:@410L];
   1071   [message setExtension:[UnittestRoot defaultFloatExtension] value:@411.0f];
   1072   [message setExtension:[UnittestRoot defaultDoubleExtension] value:@412.0];
   1073   [message setExtension:[UnittestRoot defaultBoolExtension] value:@NO];
   1074   [message setExtension:[UnittestRoot defaultStringExtension] value:@"415"];
   1075   [message setExtension:[UnittestRoot defaultBytesExtension]
   1076                   value:[NSData gpbtu_dataWithUint32:416]];
   1077 
   1078   [message setExtension:[UnittestRoot defaultNestedEnumExtension]
   1079                   value:@(TestAllTypes_NestedEnum_Foo)];
   1080   [message setExtension:[UnittestRoot defaultForeignEnumExtension]
   1081                   value:@(ForeignEnum_ForeignFoo)];
   1082   [message setExtension:[UnittestRoot defaultImportEnumExtension]
   1083                   value:@(ImportEnum_ImportFoo)];
   1084 
   1085   [message setExtension:[UnittestRoot defaultStringPieceExtension]
   1086                   value:@"424"];
   1087   [message setExtension:[UnittestRoot defaultCordExtension] value:@"425"];
   1088 }
   1089 
   1090 - (void)setAllMapFields:(TestMap *)message numEntries:(uint32_t)count {
   1091   for (uint32_t i = 0; i < count; i++) {
   1092     [message.mapInt32Int32 setValue:(i + 1) forKey:100 + i * 100];
   1093     [message.mapInt64Int64 setValue:(i + 1) forKey:101 + i * 100];
   1094     [message.mapUint32Uint32 setValue:(i + 1) forKey:102 + i * 100];
   1095     [message.mapUint64Uint64 setValue:(i + 1) forKey:103 + i * 100];
   1096     [message.mapSint32Sint32 setValue:(i + 1) forKey:104 + i * 100];
   1097     [message.mapSint64Sint64 setValue:(i + 1) forKey:105 + i * 100];
   1098     [message.mapFixed32Fixed32 setValue:(i + 1) forKey:106 + i * 100];
   1099     [message.mapFixed64Fixed64 setValue:(i + 1) forKey:107 + i * 100];
   1100     [message.mapSfixed32Sfixed32 setValue:(i + 1) forKey:108 + i * 100];
   1101     [message.mapSfixed64Sfixed64 setValue:(i + 1) forKey:109 + i * 100];
   1102     [message.mapInt32Float setValue:(i + 1) forKey:110 + i * 100];
   1103     [message.mapInt32Double setValue:(i + 1) forKey:111 + i * 100];
   1104     [message.mapBoolBool setValue:((i % 2) == 1) forKey:((i % 2) == 0)];
   1105 
   1106     NSString *keyStr = [[NSString alloc] initWithFormat:@"%d", 112 + i * 100];
   1107     NSString *dataStr = [[NSString alloc] initWithFormat:@"%d", i + 1];
   1108     [message.mapStringString setObject:dataStr forKey:keyStr];
   1109     [keyStr release];
   1110     [dataStr release];
   1111 
   1112     NSData *data = [[NSData alloc] initWithUint32_gpbtu:i + 1];
   1113     [message.mapInt32Bytes setObject:data forKey:113 + i * 100];
   1114     [data release];
   1115 
   1116     [message.mapInt32Enum
   1117         setValue:(i % 2) ? MapEnum_MapEnumBar : MapEnum_MapEnumBaz
   1118           forKey:114 + i * 100];
   1119 
   1120     ForeignMessage *subMsg = [[ForeignMessage alloc] init];
   1121     subMsg.c = i + 1;
   1122     [message.mapInt32ForeignMessage setObject:subMsg forKey:115 + i * 100];
   1123     [subMsg release];
   1124   }
   1125 }
   1126 
   1127 - (void)setAllTestPackedFields:(TestPackedTypes *)message {
   1128   // Must match -setAllTestUnpackedFields:
   1129   [message.packedInt32Array addValue:101];
   1130   [message.packedInt64Array addValue:102];
   1131   [message.packedUint32Array addValue:103];
   1132   [message.packedUint64Array addValue:104];
   1133   [message.packedSint32Array addValue:105];
   1134   [message.packedSint64Array addValue:106];
   1135   [message.packedFixed32Array addValue:107];
   1136   [message.packedFixed64Array addValue:108];
   1137   [message.packedSfixed32Array addValue:109];
   1138   [message.packedSfixed64Array addValue:110];
   1139   [message.packedFloatArray addValue:111.f];
   1140   [message.packedDoubleArray addValue:112.];
   1141   [message.packedBoolArray addValue:YES];
   1142   [message.packedEnumArray addValue:ForeignEnum_ForeignBar];
   1143 
   1144   [message.packedInt32Array addValue:201];
   1145   [message.packedInt64Array addValue:302];
   1146   [message.packedUint32Array addValue:203];
   1147   [message.packedUint64Array addValue:204];
   1148   [message.packedSint32Array addValue:205];
   1149   [message.packedSint64Array addValue:206];
   1150   [message.packedFixed32Array addValue:207];
   1151   [message.packedFixed64Array addValue:208];
   1152   [message.packedSfixed32Array addValue:209];
   1153   [message.packedSfixed64Array addValue:210];
   1154   [message.packedFloatArray addValue:211.f];
   1155   [message.packedDoubleArray addValue:212.];
   1156   [message.packedBoolArray addValue:NO];
   1157   [message.packedEnumArray addValue:ForeignEnum_ForeignBaz];
   1158 }
   1159 
   1160 - (void)setAllTestUnpackedFields:(TestUnpackedTypes *)message {
   1161   // Must match -setAllTestPackedFields:
   1162   [message.unpackedInt32Array addValue:101];
   1163   [message.unpackedInt64Array addValue:102];
   1164   [message.unpackedUint32Array addValue:103];
   1165   [message.unpackedUint64Array addValue:104];
   1166   [message.unpackedSint32Array addValue:105];
   1167   [message.unpackedSint64Array addValue:106];
   1168   [message.unpackedFixed32Array addValue:107];
   1169   [message.unpackedFixed64Array addValue:108];
   1170   [message.unpackedSfixed32Array addValue:109];
   1171   [message.unpackedSfixed64Array addValue:110];
   1172   [message.unpackedFloatArray addValue:111.f];
   1173   [message.unpackedDoubleArray addValue:112.];
   1174   [message.unpackedBoolArray addValue:YES];
   1175   [message.unpackedEnumArray addValue:ForeignEnum_ForeignBar];
   1176 
   1177   [message.unpackedInt32Array addValue:201];
   1178   [message.unpackedInt64Array addValue:302];
   1179   [message.unpackedUint32Array addValue:203];
   1180   [message.unpackedUint64Array addValue:204];
   1181   [message.unpackedSint32Array addValue:205];
   1182   [message.unpackedSint64Array addValue:206];
   1183   [message.unpackedFixed32Array addValue:207];
   1184   [message.unpackedFixed64Array addValue:208];
   1185   [message.unpackedSfixed32Array addValue:209];
   1186   [message.unpackedSfixed64Array addValue:210];
   1187   [message.unpackedFloatArray addValue:211.f];
   1188   [message.unpackedDoubleArray addValue:212.];
   1189   [message.unpackedBoolArray addValue:NO];
   1190   [message.unpackedEnumArray addValue:ForeignEnum_ForeignBaz];
   1191 }
   1192 
   1193 - (GPBExtensionRegistry *)extensionRegistry {
   1194   return [UnittestRoot extensionRegistry];
   1195 }
   1196 
   1197 - (TestAllTypes *)allSetRepeatedCount:(uint32_t)count {
   1198   TestAllTypes *message = [TestAllTypes message];
   1199   [self setAllFields:message repeatedCount:count];
   1200   return message;
   1201 }
   1202 
   1203 - (TestAllExtensions *)allExtensionsSetRepeatedCount:(uint32_t)count {
   1204   TestAllExtensions *message = [TestAllExtensions message];
   1205   [self setAllExtensions:message repeatedCount:count];
   1206   return message;
   1207 }
   1208 
   1209 - (TestPackedTypes *)packedSetRepeatedCount:(uint32_t)count {
   1210   TestPackedTypes *message = [TestPackedTypes message];
   1211   [self setPackedFields:message repeatedCount:count];
   1212   return message;
   1213 }
   1214 
   1215 - (TestPackedExtensions *)packedExtensionsSetRepeatedCount:(uint32_t)count {
   1216   TestPackedExtensions *message = [TestPackedExtensions message];
   1217   [self setPackedExtensions:message repeatedCount:count];
   1218   return message;
   1219 }
   1220 
   1221 // -------------------------------------------------------------------
   1222 
   1223 - (void)assertClear:(TestAllTypes *)message {
   1224   // hasBlah() should initially be NO for all optional fields.
   1225   XCTAssertFalse(message.hasOptionalInt32);
   1226   XCTAssertFalse(message.hasOptionalInt64);
   1227   XCTAssertFalse(message.hasOptionalUint32);
   1228   XCTAssertFalse(message.hasOptionalUint64);
   1229   XCTAssertFalse(message.hasOptionalSint32);
   1230   XCTAssertFalse(message.hasOptionalSint64);
   1231   XCTAssertFalse(message.hasOptionalFixed32);
   1232   XCTAssertFalse(message.hasOptionalFixed64);
   1233   XCTAssertFalse(message.hasOptionalSfixed32);
   1234   XCTAssertFalse(message.hasOptionalSfixed64);
   1235   XCTAssertFalse(message.hasOptionalFloat);
   1236   XCTAssertFalse(message.hasOptionalDouble);
   1237   XCTAssertFalse(message.hasOptionalBool);
   1238   XCTAssertFalse(message.hasOptionalString);
   1239   XCTAssertFalse(message.hasOptionalBytes);
   1240 
   1241   XCTAssertFalse(message.hasOptionalGroup);
   1242   XCTAssertFalse(message.hasOptionalNestedMessage);
   1243   XCTAssertFalse(message.hasOptionalForeignMessage);
   1244   XCTAssertFalse(message.hasOptionalImportMessage);
   1245 
   1246   XCTAssertFalse(message.hasOptionalNestedEnum);
   1247   XCTAssertFalse(message.hasOptionalForeignEnum);
   1248   XCTAssertFalse(message.hasOptionalImportEnum);
   1249 
   1250   XCTAssertFalse(message.hasOptionalStringPiece);
   1251   XCTAssertFalse(message.hasOptionalCord);
   1252 
   1253   // Optional fields without defaults are set to zero or something like it.
   1254   XCTAssertEqual(0, message.optionalInt32);
   1255   XCTAssertEqual(0LL, message.optionalInt64);
   1256   XCTAssertEqual(0U, message.optionalUint32);
   1257   XCTAssertEqual(0ULL, message.optionalUint64);
   1258   XCTAssertEqual(0, message.optionalSint32);
   1259   XCTAssertEqual(0LL, message.optionalSint64);
   1260   XCTAssertEqual(0U, message.optionalFixed32);
   1261   XCTAssertEqual(0ULL, message.optionalFixed64);
   1262   XCTAssertEqual(0, message.optionalSfixed32);
   1263   XCTAssertEqual(0LL, message.optionalSfixed64);
   1264   XCTAssertEqual(0.0f, message.optionalFloat);
   1265   XCTAssertEqual(0.0, message.optionalDouble);
   1266   XCTAssertFalse(message.optionalBool);
   1267   XCTAssertEqualObjects(message.optionalString, @"");
   1268   XCTAssertEqualObjects(message.optionalBytes, GPBEmptyNSData());
   1269 
   1270   // Embedded messages should also be clear.
   1271   XCTAssertFalse(message.hasOptionalGroup);
   1272   XCTAssertFalse(message.hasOptionalNestedMessage);
   1273   XCTAssertFalse(message.hasOptionalForeignMessage);
   1274   XCTAssertFalse(message.hasOptionalImportMessage);
   1275 
   1276   // Enums without defaults are set to the first value in the enum.
   1277   XCTAssertEqual(TestAllTypes_NestedEnum_Foo, message.optionalNestedEnum);
   1278   XCTAssertEqual(ForeignEnum_ForeignFoo, message.optionalForeignEnum);
   1279   XCTAssertEqual(ImportEnum_ImportFoo, message.optionalImportEnum);
   1280 
   1281   XCTAssertEqualObjects(message.optionalStringPiece, @"");
   1282   XCTAssertEqualObjects(message.optionalCord, @"");
   1283 
   1284   // Repeated fields are empty.
   1285 
   1286   XCTAssertEqual(0U, message.repeatedInt32Array.count);
   1287   XCTAssertEqual(0U, message.repeatedInt64Array.count);
   1288   XCTAssertEqual(0U, message.repeatedUint32Array.count);
   1289   XCTAssertEqual(0U, message.repeatedUint64Array.count);
   1290   XCTAssertEqual(0U, message.repeatedSint32Array.count);
   1291   XCTAssertEqual(0U, message.repeatedSint64Array.count);
   1292   XCTAssertEqual(0U, message.repeatedFixed32Array.count);
   1293   XCTAssertEqual(0U, message.repeatedFixed64Array.count);
   1294   XCTAssertEqual(0U, message.repeatedSfixed32Array.count);
   1295   XCTAssertEqual(0U, message.repeatedSfixed64Array.count);
   1296   XCTAssertEqual(0U, message.repeatedFloatArray.count);
   1297   XCTAssertEqual(0U, message.repeatedDoubleArray.count);
   1298   XCTAssertEqual(0U, message.repeatedBoolArray.count);
   1299   XCTAssertEqual(0U, message.repeatedStringArray.count);
   1300   XCTAssertEqual(0U, message.repeatedBytesArray.count);
   1301 
   1302   XCTAssertEqual(0U, message.repeatedGroupArray.count);
   1303   XCTAssertEqual(0U, message.repeatedNestedMessageArray.count);
   1304   XCTAssertEqual(0U, message.repeatedForeignMessageArray.count);
   1305   XCTAssertEqual(0U, message.repeatedImportMessageArray.count);
   1306   XCTAssertEqual(0U, message.repeatedNestedEnumArray.count);
   1307   XCTAssertEqual(0U, message.repeatedForeignEnumArray.count);
   1308   XCTAssertEqual(0U, message.repeatedImportEnumArray.count);
   1309 
   1310   XCTAssertEqual(0U, message.repeatedStringPieceArray.count);
   1311   XCTAssertEqual(0U, message.repeatedCordArray.count);
   1312 
   1313   XCTAssertEqual(0U, message.repeatedInt32Array_Count);
   1314   XCTAssertEqual(0U, message.repeatedInt64Array_Count);
   1315   XCTAssertEqual(0U, message.repeatedUint32Array_Count);
   1316   XCTAssertEqual(0U, message.repeatedUint64Array_Count);
   1317   XCTAssertEqual(0U, message.repeatedSint32Array_Count);
   1318   XCTAssertEqual(0U, message.repeatedSint64Array_Count);
   1319   XCTAssertEqual(0U, message.repeatedFixed32Array_Count);
   1320   XCTAssertEqual(0U, message.repeatedFixed64Array_Count);
   1321   XCTAssertEqual(0U, message.repeatedSfixed32Array_Count);
   1322   XCTAssertEqual(0U, message.repeatedSfixed64Array_Count);
   1323   XCTAssertEqual(0U, message.repeatedFloatArray_Count);
   1324   XCTAssertEqual(0U, message.repeatedDoubleArray_Count);
   1325   XCTAssertEqual(0U, message.repeatedBoolArray_Count);
   1326   XCTAssertEqual(0U, message.repeatedStringArray_Count);
   1327   XCTAssertEqual(0U, message.repeatedBytesArray_Count);
   1328 
   1329   XCTAssertEqual(0U, message.repeatedGroupArray_Count);
   1330   XCTAssertEqual(0U, message.repeatedNestedMessageArray_Count);
   1331   XCTAssertEqual(0U, message.repeatedForeignMessageArray_Count);
   1332   XCTAssertEqual(0U, message.repeatedImportMessageArray_Count);
   1333   XCTAssertEqual(0U, message.repeatedNestedEnumArray_Count);
   1334   XCTAssertEqual(0U, message.repeatedForeignEnumArray_Count);
   1335   XCTAssertEqual(0U, message.repeatedImportEnumArray_Count);
   1336 
   1337   XCTAssertEqual(0U, message.repeatedStringPieceArray_Count);
   1338   XCTAssertEqual(0U, message.repeatedCordArray_Count);
   1339 
   1340   // hasBlah() should also be NO for all default fields.
   1341   XCTAssertFalse(message.hasDefaultInt32);
   1342   XCTAssertFalse(message.hasDefaultInt64);
   1343   XCTAssertFalse(message.hasDefaultUint32);
   1344   XCTAssertFalse(message.hasDefaultUint64);
   1345   XCTAssertFalse(message.hasDefaultSint32);
   1346   XCTAssertFalse(message.hasDefaultSint64);
   1347   XCTAssertFalse(message.hasDefaultFixed32);
   1348   XCTAssertFalse(message.hasDefaultFixed64);
   1349   XCTAssertFalse(message.hasDefaultSfixed32);
   1350   XCTAssertFalse(message.hasDefaultSfixed64);
   1351   XCTAssertFalse(message.hasDefaultFloat);
   1352   XCTAssertFalse(message.hasDefaultDouble);
   1353   XCTAssertFalse(message.hasDefaultBool);
   1354   XCTAssertFalse(message.hasDefaultString);
   1355   XCTAssertFalse(message.hasDefaultBytes);
   1356 
   1357   XCTAssertFalse(message.hasDefaultNestedEnum);
   1358   XCTAssertFalse(message.hasDefaultForeignEnum);
   1359   XCTAssertFalse(message.hasDefaultImportEnum);
   1360 
   1361   XCTAssertFalse(message.hasDefaultStringPiece);
   1362   XCTAssertFalse(message.hasDefaultCord);
   1363 
   1364   // Fields with defaults have their default values (duh).
   1365   XCTAssertEqual(41, message.defaultInt32);
   1366   XCTAssertEqual(42LL, message.defaultInt64);
   1367   XCTAssertEqual(43U, message.defaultUint32);
   1368   XCTAssertEqual(44ULL, message.defaultUint64);
   1369   XCTAssertEqual(-45, message.defaultSint32);
   1370   XCTAssertEqual(46LL, message.defaultSint64);
   1371   XCTAssertEqual(47U, message.defaultFixed32);
   1372   XCTAssertEqual(48ULL, message.defaultFixed64);
   1373   XCTAssertEqual(49, message.defaultSfixed32);
   1374   XCTAssertEqual(-50LL, message.defaultSfixed64);
   1375   XCTAssertEqualWithAccuracy(51.5f, message.defaultFloat, 0.1);
   1376   XCTAssertEqualWithAccuracy(52e3, message.defaultDouble, 0.1);
   1377   XCTAssertTrue(message.defaultBool);
   1378   XCTAssertEqualObjects(@"hello", message.defaultString);
   1379   XCTAssertEqualObjects([NSData gpbtu_dataWithCString:"world"],
   1380                         message.defaultBytes);
   1381 
   1382   XCTAssertEqual(TestAllTypes_NestedEnum_Bar, message.defaultNestedEnum);
   1383   XCTAssertEqual(ForeignEnum_ForeignBar, message.defaultForeignEnum);
   1384   XCTAssertEqual(ImportEnum_ImportBar, message.defaultImportEnum);
   1385 
   1386   XCTAssertEqualObjects(@"abc", message.defaultStringPiece);
   1387   XCTAssertEqualObjects(@"123", message.defaultCord);
   1388 }
   1389 
   1390 - (void)assertExtensionsClear:(TestAllExtensions *)message {
   1391   // hasBlah() should initially be NO for all optional fields.
   1392   XCTAssertFalse([message hasExtension:[UnittestRoot optionalInt32Extension]]);
   1393   XCTAssertFalse([message hasExtension:[UnittestRoot optionalInt64Extension]]);
   1394   XCTAssertFalse([message hasExtension:[UnittestRoot optionalUint32Extension]]);
   1395   XCTAssertFalse([message hasExtension:[UnittestRoot optionalUint64Extension]]);
   1396   XCTAssertFalse([message hasExtension:[UnittestRoot optionalSint32Extension]]);
   1397   XCTAssertFalse([message hasExtension:[UnittestRoot optionalSint64Extension]]);
   1398   XCTAssertFalse([message hasExtension:[UnittestRoot optionalFixed32Extension]]);
   1399   XCTAssertFalse([message hasExtension:[UnittestRoot optionalFixed64Extension]]);
   1400   XCTAssertFalse([message hasExtension:[UnittestRoot optionalSfixed32Extension]]);
   1401   XCTAssertFalse([message hasExtension:[UnittestRoot optionalSfixed64Extension]]);
   1402   XCTAssertFalse([message hasExtension:[UnittestRoot optionalFloatExtension]]);
   1403   XCTAssertFalse([message hasExtension:[UnittestRoot optionalDoubleExtension]]);
   1404   XCTAssertFalse([message hasExtension:[UnittestRoot optionalBoolExtension]]);
   1405   XCTAssertFalse([message hasExtension:[UnittestRoot optionalStringExtension]]);
   1406   XCTAssertFalse([message hasExtension:[UnittestRoot optionalBytesExtension]]);
   1407 
   1408   XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
   1409   XCTAssertFalse([message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
   1410   XCTAssertFalse([message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
   1411   XCTAssertFalse([message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
   1412 
   1413   XCTAssertFalse([message hasExtension:[UnittestRoot optionalNestedEnumExtension]]);
   1414   XCTAssertFalse([message hasExtension:[UnittestRoot optionalForeignEnumExtension]]);
   1415   XCTAssertFalse([message hasExtension:[UnittestRoot optionalImportEnumExtension]]);
   1416 
   1417   XCTAssertFalse([message hasExtension:[UnittestRoot optionalStringPieceExtension]]);
   1418   XCTAssertFalse([message hasExtension:[UnittestRoot optionalCordExtension]]);
   1419 
   1420   // Optional fields without defaults are set to zero or something like it.
   1421   XCTAssertEqual(0, [[message getExtension:[UnittestRoot optionalInt32Extension]] intValue]);
   1422   XCTAssertEqual(0LL,[[message getExtension:[UnittestRoot optionalInt64Extension]] longLongValue]);
   1423   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot optionalUint32Extension]] unsignedIntValue]);
   1424   XCTAssertEqual(0ULL, [[message getExtension:[UnittestRoot optionalUint64Extension]] unsignedLongLongValue]);
   1425   XCTAssertEqual(0, [[message getExtension:[UnittestRoot optionalSint32Extension]] intValue]);
   1426   XCTAssertEqual(0LL, [[message getExtension:[UnittestRoot optionalSint64Extension]] longLongValue]);
   1427   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot optionalFixed32Extension]] unsignedIntValue]);
   1428   XCTAssertEqual(0ULL, [[message getExtension:[UnittestRoot optionalFixed64Extension]] unsignedLongLongValue]);
   1429   XCTAssertEqual(0, [[message getExtension:[UnittestRoot optionalSfixed32Extension]] intValue]);
   1430   XCTAssertEqual(0LL, [[message getExtension:[UnittestRoot optionalSfixed64Extension]] longLongValue]);
   1431   XCTAssertEqualWithAccuracy(0.0f, [[message getExtension:[UnittestRoot optionalFloatExtension]] floatValue], 0.01);
   1432   XCTAssertEqualWithAccuracy(0.0, [[message getExtension:[UnittestRoot optionalDoubleExtension]] doubleValue], 0.01);
   1433   XCTAssertFalse([[message getExtension:[UnittestRoot optionalBoolExtension]] boolValue]);
   1434   XCTAssertEqualObjects(@"", [message getExtension:[UnittestRoot optionalStringExtension]]);
   1435   XCTAssertEqualObjects(GPBEmptyNSData(), [message getExtension:[UnittestRoot optionalBytesExtension]]);
   1436 
   1437   // Embedded messages should also be clear.
   1438 
   1439   XCTAssertFalse([[message getExtension:[UnittestRoot optionalGroupExtension]] hasA]);
   1440   XCTAssertFalse([[message getExtension:[UnittestRoot optionalNestedMessageExtension]] hasBb]);
   1441   XCTAssertFalse([[message getExtension:[UnittestRoot optionalForeignMessageExtension]] hasC]);
   1442   XCTAssertFalse([[message getExtension:[UnittestRoot optionalImportMessageExtension]] hasD]);
   1443 
   1444   XCTAssertEqual(0, [(TestAllTypes_OptionalGroup*)[message getExtension:[UnittestRoot optionalGroupExtension]] a]);
   1445   XCTAssertEqual(0, [(TestAllTypes_NestedMessage*)[message getExtension:[UnittestRoot optionalNestedMessageExtension]] bb]);
   1446   XCTAssertEqual(0, [[message getExtension:[UnittestRoot optionalForeignMessageExtension]] c]);
   1447   XCTAssertEqual(0, [[message getExtension:[UnittestRoot optionalImportMessageExtension]] d]);
   1448 
   1449   // Enums without defaults are set to the first value in the enum.
   1450   XCTAssertEqual(TestAllTypes_NestedEnum_Foo,
   1451                [[message getExtension:[UnittestRoot optionalNestedEnumExtension]] intValue]);
   1452   XCTAssertEqual(ForeignEnum_ForeignFoo,
   1453                [[message getExtension:[UnittestRoot optionalForeignEnumExtension]] intValue]);
   1454   XCTAssertEqual(ImportEnum_ImportFoo,
   1455                [[message getExtension:[UnittestRoot optionalImportEnumExtension]] intValue]);
   1456 
   1457   XCTAssertEqualObjects(@"", [message getExtension:[UnittestRoot optionalStringPieceExtension]]);
   1458   XCTAssertEqualObjects(@"", [message getExtension:[UnittestRoot optionalCordExtension]]);
   1459 
   1460   // Repeated fields are empty.
   1461   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedInt32Extension]] count]);
   1462   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedInt64Extension]] count]);
   1463   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedUint32Extension]] count]);
   1464   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedUint64Extension]] count]);
   1465   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedSint32Extension]] count]);
   1466   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedSint64Extension]] count]);
   1467   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedFixed32Extension]] count]);
   1468   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedFixed64Extension]] count]);
   1469   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedSfixed32Extension]] count]);
   1470   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedSfixed64Extension]] count]);
   1471   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedFloatExtension]] count]);
   1472   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedDoubleExtension]] count]);
   1473   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedBoolExtension]] count]);
   1474   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedStringExtension]] count]);
   1475   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedBytesExtension]] count]);
   1476 
   1477   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedGroupExtension]] count]);
   1478   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedNestedMessageExtension]] count]);
   1479   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedForeignMessageExtension]] count]);
   1480   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedImportMessageExtension]] count]);
   1481   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedNestedEnumExtension]] count]);
   1482   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedForeignEnumExtension]] count]);
   1483   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedImportEnumExtension]] count]);
   1484 
   1485   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedStringPieceExtension]] count]);
   1486   XCTAssertEqual(0U, [[message getExtension:[UnittestRoot repeatedCordExtension]] count]);
   1487 
   1488   // hasBlah() should also be NO for all default fields.
   1489   XCTAssertFalse([message hasExtension:[UnittestRoot defaultInt32Extension]]);
   1490   XCTAssertFalse([message hasExtension:[UnittestRoot defaultInt64Extension]]);
   1491   XCTAssertFalse([message hasExtension:[UnittestRoot defaultUint32Extension]]);
   1492   XCTAssertFalse([message hasExtension:[UnittestRoot defaultUint64Extension]]);
   1493   XCTAssertFalse([message hasExtension:[UnittestRoot defaultSint32Extension]]);
   1494   XCTAssertFalse([message hasExtension:[UnittestRoot defaultSint64Extension]]);
   1495   XCTAssertFalse([message hasExtension:[UnittestRoot defaultFixed32Extension]]);
   1496   XCTAssertFalse([message hasExtension:[UnittestRoot defaultFixed64Extension]]);
   1497   XCTAssertFalse([message hasExtension:[UnittestRoot defaultSfixed32Extension]]);
   1498   XCTAssertFalse([message hasExtension:[UnittestRoot defaultSfixed64Extension]]);
   1499   XCTAssertFalse([message hasExtension:[UnittestRoot defaultFloatExtension]]);
   1500   XCTAssertFalse([message hasExtension:[UnittestRoot defaultDoubleExtension]]);
   1501   XCTAssertFalse([message hasExtension:[UnittestRoot defaultBoolExtension]]);
   1502   XCTAssertFalse([message hasExtension:[UnittestRoot defaultStringExtension]]);
   1503   XCTAssertFalse([message hasExtension:[UnittestRoot defaultBytesExtension]]);
   1504 
   1505   XCTAssertFalse([message hasExtension:[UnittestRoot defaultNestedEnumExtension]]);
   1506   XCTAssertFalse([message hasExtension:[UnittestRoot defaultForeignEnumExtension]]);
   1507   XCTAssertFalse([message hasExtension:[UnittestRoot defaultImportEnumExtension]]);
   1508 
   1509   XCTAssertFalse([message hasExtension:[UnittestRoot defaultStringPieceExtension]]);
   1510   XCTAssertFalse([message hasExtension:[UnittestRoot defaultCordExtension]]);
   1511 
   1512   // Fields with defaults have their default values (duh).
   1513   XCTAssertEqual( 41, [[message getExtension:[UnittestRoot defaultInt32Extension]] intValue]);
   1514   XCTAssertEqual( 42LL, [[message getExtension:[UnittestRoot defaultInt64Extension]] longLongValue]);
   1515   XCTAssertEqual( 43U, [[message getExtension:[UnittestRoot defaultUint32Extension]] unsignedIntValue]);
   1516   XCTAssertEqual( 44ULL, [[message getExtension:[UnittestRoot defaultUint64Extension]] unsignedLongLongValue]);
   1517   XCTAssertEqual(-45, [[message getExtension:[UnittestRoot defaultSint32Extension]] intValue]);
   1518   XCTAssertEqual( 46LL, [[message getExtension:[UnittestRoot defaultSint64Extension]] longLongValue]);
   1519   XCTAssertEqual( 47, [[message getExtension:[UnittestRoot defaultFixed32Extension]] intValue]);
   1520   XCTAssertEqual( 48ULL, [[message getExtension:[UnittestRoot defaultFixed64Extension]] unsignedLongLongValue]);
   1521   XCTAssertEqual( 49, [[message getExtension:[UnittestRoot defaultSfixed32Extension]] intValue]);
   1522   XCTAssertEqual(-50LL, [[message getExtension:[UnittestRoot defaultSfixed64Extension]] longLongValue]);
   1523   XCTAssertEqualWithAccuracy( 51.5f, [[message getExtension:[UnittestRoot defaultFloatExtension]] floatValue], 0.01);
   1524   XCTAssertEqualWithAccuracy( 52e3, [[message getExtension:[UnittestRoot defaultDoubleExtension]] doubleValue], 0.01);
   1525   XCTAssertTrue([[message getExtension:[UnittestRoot defaultBoolExtension]] boolValue]);
   1526   XCTAssertEqualObjects(@"hello", [message getExtension:[UnittestRoot defaultStringExtension]]);
   1527   XCTAssertEqualObjects([NSData gpbtu_dataWithCString:"world"], [message getExtension:[UnittestRoot defaultBytesExtension]]);
   1528 
   1529   XCTAssertEqual(TestAllTypes_NestedEnum_Bar,
   1530                [[message getExtension:[UnittestRoot defaultNestedEnumExtension]] intValue]);
   1531   XCTAssertEqual(ForeignEnum_ForeignBar,
   1532                [[message getExtension:[UnittestRoot defaultForeignEnumExtension]] intValue]);
   1533   XCTAssertEqual(ImportEnum_ImportBar,
   1534                [[message getExtension:[UnittestRoot defaultImportEnumExtension]] intValue]);
   1535 
   1536   XCTAssertEqualObjects(@"abc", [message getExtension:[UnittestRoot defaultStringPieceExtension]]);
   1537   XCTAssertEqualObjects(@"123", [message getExtension:[UnittestRoot defaultCordExtension]]);
   1538 }
   1539 
   1540 - (void)modifyRepeatedFields:(TestAllTypes *)message {
   1541   [message.repeatedInt32Array replaceValueAtIndex:1 withValue:501];
   1542   [message.repeatedInt64Array replaceValueAtIndex:1 withValue:502];
   1543   [message.repeatedUint32Array replaceValueAtIndex:1 withValue:503];
   1544   [message.repeatedUint64Array replaceValueAtIndex:1 withValue:504];
   1545   [message.repeatedSint32Array replaceValueAtIndex:1 withValue:505];
   1546   [message.repeatedSint64Array replaceValueAtIndex:1 withValue:506];
   1547   [message.repeatedFixed32Array replaceValueAtIndex:1 withValue:507];
   1548   [message.repeatedFixed64Array replaceValueAtIndex:1 withValue:508];
   1549   [message.repeatedSfixed32Array replaceValueAtIndex:1 withValue:509];
   1550   [message.repeatedSfixed64Array replaceValueAtIndex:1 withValue:510];
   1551   [message.repeatedFloatArray replaceValueAtIndex:1 withValue:511];
   1552   [message.repeatedDoubleArray replaceValueAtIndex:1 withValue:512];
   1553   [message.repeatedBoolArray replaceValueAtIndex:1 withValue:YES];
   1554   [message.repeatedStringArray replaceObjectAtIndex:1 withObject:@"515"];
   1555 
   1556   NSData *data = [[NSData alloc] initWithUint32_gpbtu:516];
   1557   [message.repeatedBytesArray replaceObjectAtIndex:1 withObject:data];
   1558   [data release];
   1559 
   1560   TestAllTypes_RepeatedGroup *testAll =
   1561       [[TestAllTypes_RepeatedGroup alloc] init];
   1562   [testAll setA:517];
   1563   [message.repeatedGroupArray replaceObjectAtIndex:1 withObject:testAll];
   1564   [testAll release];
   1565 
   1566   TestAllTypes_NestedMessage *nestedMessage =
   1567       [[TestAllTypes_NestedMessage alloc] init];
   1568   [nestedMessage setBb:518];
   1569   [message.repeatedNestedMessageArray replaceObjectAtIndex:1
   1570                                                 withObject:nestedMessage];
   1571   [nestedMessage release];
   1572 
   1573   ForeignMessage *foreignMessage = [[ForeignMessage alloc] init];
   1574   [foreignMessage setC:519];
   1575   [message.repeatedForeignMessageArray replaceObjectAtIndex:1
   1576                                                  withObject:foreignMessage];
   1577   [foreignMessage release];
   1578 
   1579   ImportMessage *importMessage = [[ImportMessage alloc] init];
   1580   [importMessage setD:520];
   1581   [message.repeatedImportMessageArray replaceObjectAtIndex:1
   1582                                                 withObject:importMessage];
   1583   [importMessage release];
   1584 
   1585   [message.repeatedNestedEnumArray replaceValueAtIndex:1 withValue:TestAllTypes_NestedEnum_Foo];
   1586   [message.repeatedForeignEnumArray replaceValueAtIndex:1 withValue:ForeignEnum_ForeignFoo];
   1587   [message.repeatedImportEnumArray replaceValueAtIndex:1 withValue:ImportEnum_ImportFoo];
   1588 
   1589   [message.repeatedStringPieceArray replaceObjectAtIndex:1 withObject:@"524"];
   1590   [message.repeatedCordArray replaceObjectAtIndex:1 withObject:@"525"];
   1591 }
   1592 
   1593 - (void)assertRepeatedFieldsModified:(TestAllTypes *)message
   1594                        repeatedCount:(uint32_t)count {
   1595   // ModifyRepeatedFields only sets the second repeated element of each
   1596   // field.  In addition to verifying this, we also verify that the first
   1597   // element and size were *not* modified.
   1598 
   1599   XCTAssertEqual(count, message.repeatedInt32Array.count);
   1600   XCTAssertEqual(count, message.repeatedInt64Array.count);
   1601   XCTAssertEqual(count, message.repeatedUint32Array.count);
   1602   XCTAssertEqual(count, message.repeatedUint64Array.count);
   1603   XCTAssertEqual(count, message.repeatedSint32Array.count);
   1604   XCTAssertEqual(count, message.repeatedSint64Array.count);
   1605   XCTAssertEqual(count, message.repeatedFixed32Array.count);
   1606   XCTAssertEqual(count, message.repeatedFixed64Array.count);
   1607   XCTAssertEqual(count, message.repeatedSfixed32Array.count);
   1608   XCTAssertEqual(count, message.repeatedSfixed64Array.count);
   1609   XCTAssertEqual(count, message.repeatedFloatArray.count);
   1610   XCTAssertEqual(count, message.repeatedDoubleArray.count);
   1611   XCTAssertEqual(count, message.repeatedBoolArray.count);
   1612   XCTAssertEqual(count, message.repeatedStringArray.count);
   1613   XCTAssertEqual(count, message.repeatedBytesArray.count);
   1614 
   1615   XCTAssertEqual(count, message.repeatedGroupArray.count);
   1616   XCTAssertEqual(count, message.repeatedNestedMessageArray.count);
   1617   XCTAssertEqual(count, message.repeatedForeignMessageArray.count);
   1618   XCTAssertEqual(count, message.repeatedImportMessageArray.count);
   1619   XCTAssertEqual(count, message.repeatedNestedEnumArray.count);
   1620   XCTAssertEqual(count, message.repeatedForeignEnumArray.count);
   1621   XCTAssertEqual(count, message.repeatedImportEnumArray.count);
   1622 
   1623   XCTAssertEqual(count, message.repeatedStringPieceArray.count);
   1624   XCTAssertEqual(count, message.repeatedCordArray.count);
   1625 
   1626   XCTAssertEqual(count, message.repeatedInt32Array_Count);
   1627   XCTAssertEqual(count, message.repeatedInt64Array_Count);
   1628   XCTAssertEqual(count, message.repeatedUint32Array_Count);
   1629   XCTAssertEqual(count, message.repeatedUint64Array_Count);
   1630   XCTAssertEqual(count, message.repeatedSint32Array_Count);
   1631   XCTAssertEqual(count, message.repeatedSint64Array_Count);
   1632   XCTAssertEqual(count, message.repeatedFixed32Array_Count);
   1633   XCTAssertEqual(count, message.repeatedFixed64Array_Count);
   1634   XCTAssertEqual(count, message.repeatedSfixed32Array_Count);
   1635   XCTAssertEqual(count, message.repeatedSfixed64Array_Count);
   1636   XCTAssertEqual(count, message.repeatedFloatArray_Count);
   1637   XCTAssertEqual(count, message.repeatedDoubleArray_Count);
   1638   XCTAssertEqual(count, message.repeatedBoolArray_Count);
   1639   XCTAssertEqual(count, message.repeatedStringArray_Count);
   1640   XCTAssertEqual(count, message.repeatedBytesArray_Count);
   1641 
   1642   XCTAssertEqual(count, message.repeatedGroupArray_Count);
   1643   XCTAssertEqual(count, message.repeatedNestedMessageArray_Count);
   1644   XCTAssertEqual(count, message.repeatedForeignMessageArray_Count);
   1645   XCTAssertEqual(count, message.repeatedImportMessageArray_Count);
   1646   XCTAssertEqual(count, message.repeatedNestedEnumArray_Count);
   1647   XCTAssertEqual(count, message.repeatedForeignEnumArray_Count);
   1648   XCTAssertEqual(count, message.repeatedImportEnumArray_Count);
   1649 
   1650   XCTAssertEqual(count, message.repeatedStringPieceArray_Count);
   1651   XCTAssertEqual(count, message.repeatedCordArray_Count);
   1652 
   1653   XCTAssertEqual(201, [message.repeatedInt32Array valueAtIndex:0]);
   1654   XCTAssertEqual(202LL, [message.repeatedInt64Array valueAtIndex:0]);
   1655   XCTAssertEqual(203U, [message.repeatedUint32Array valueAtIndex:0]);
   1656   XCTAssertEqual(204ULL, [message.repeatedUint64Array valueAtIndex:0]);
   1657   XCTAssertEqual(205, [message.repeatedSint32Array valueAtIndex:0]);
   1658   XCTAssertEqual(206LL, [message.repeatedSint64Array valueAtIndex:0]);
   1659   XCTAssertEqual(207U, [message.repeatedFixed32Array valueAtIndex:0]);
   1660   XCTAssertEqual(208ULL, [message.repeatedFixed64Array valueAtIndex:0]);
   1661   XCTAssertEqual(209, [message.repeatedSfixed32Array valueAtIndex:0]);
   1662   XCTAssertEqual(210LL, [message.repeatedSfixed64Array valueAtIndex:0]);
   1663   XCTAssertEqualWithAccuracy(211.0f, [message.repeatedFloatArray valueAtIndex:0], 0.01);
   1664   XCTAssertEqualWithAccuracy(212.0, [message.repeatedDoubleArray valueAtIndex:0], 0.01);
   1665   XCTAssertFalse([message.repeatedBoolArray valueAtIndex:0]);
   1666   XCTAssertEqualObjects(@"215", message.repeatedStringArray[0]);
   1667   XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:216],
   1668                         message.repeatedBytesArray[0]);
   1669 
   1670   XCTAssertEqual(217, ((TestAllTypes_RepeatedGroup*)message.repeatedGroupArray[0]).a);
   1671   XCTAssertEqual(218, ((TestAllTypes_NestedMessage*)message.repeatedNestedMessageArray[0]).bb);
   1672   XCTAssertEqual(219, ((ForeignMessage*)message.repeatedForeignMessageArray[0]).c);
   1673   XCTAssertEqual(220, ((ImportMessage*)message.repeatedImportMessageArray[0]).d);
   1674 
   1675   XCTAssertEqual(TestAllTypes_NestedEnum_Baz, [message.repeatedNestedEnumArray valueAtIndex:0]);
   1676   XCTAssertEqual(ForeignEnum_ForeignBaz, [message.repeatedForeignEnumArray valueAtIndex:0]);
   1677   XCTAssertEqual(ImportEnum_ImportBaz, [message.repeatedImportEnumArray valueAtIndex:0]);
   1678 
   1679   XCTAssertEqualObjects(@"224", message.repeatedStringPieceArray[0]);
   1680   XCTAssertEqualObjects(@"225", message.repeatedCordArray[0]);
   1681 
   1682   // Actually verify the second (modified) elements now.
   1683   XCTAssertEqual(501, [message.repeatedInt32Array valueAtIndex:1]);
   1684   XCTAssertEqual(502LL, [message.repeatedInt64Array valueAtIndex:1]);
   1685   XCTAssertEqual(503U, [message.repeatedUint32Array valueAtIndex:1]);
   1686   XCTAssertEqual(504ULL, [message.repeatedUint64Array valueAtIndex:1]);
   1687   XCTAssertEqual(505, [message.repeatedSint32Array valueAtIndex:1]);
   1688   XCTAssertEqual(506LL, [message.repeatedSint64Array valueAtIndex:1]);
   1689   XCTAssertEqual(507U, [message.repeatedFixed32Array valueAtIndex:1]);
   1690   XCTAssertEqual(508ULL, [message.repeatedFixed64Array valueAtIndex:1]);
   1691   XCTAssertEqual(509, [message.repeatedSfixed32Array valueAtIndex:1]);
   1692   XCTAssertEqual(510LL, [message.repeatedSfixed64Array valueAtIndex:1]);
   1693   XCTAssertEqualWithAccuracy(511.0f, [message.repeatedFloatArray valueAtIndex:1], 0.01);
   1694   XCTAssertEqualWithAccuracy(512.0, [message.repeatedDoubleArray valueAtIndex:1], 0.01);
   1695   XCTAssertTrue([message.repeatedBoolArray valueAtIndex:1]);
   1696   XCTAssertEqualObjects(@"515", message.repeatedStringArray[1]);
   1697   XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:516],
   1698                         message.repeatedBytesArray[1]);
   1699 
   1700   XCTAssertEqual(517, ((TestAllTypes_RepeatedGroup*)message.repeatedGroupArray[1]).a);
   1701   XCTAssertEqual(518, ((TestAllTypes_NestedMessage*)message.repeatedNestedMessageArray[1]).bb);
   1702   XCTAssertEqual(519, ((ForeignMessage*)message.repeatedForeignMessageArray[1]).c);
   1703   XCTAssertEqual(520, ((ImportMessage*)message.repeatedImportMessageArray[1]).d);
   1704 
   1705   XCTAssertEqual(TestAllTypes_NestedEnum_Foo, [message.repeatedNestedEnumArray valueAtIndex:1]);
   1706   XCTAssertEqual(ForeignEnum_ForeignFoo, [message.repeatedForeignEnumArray valueAtIndex:1]);
   1707   XCTAssertEqual(ImportEnum_ImportFoo, [message.repeatedImportEnumArray valueAtIndex:1]);
   1708 
   1709   XCTAssertEqualObjects(@"524", message.repeatedStringPieceArray[1]);
   1710   XCTAssertEqualObjects(@"525", message.repeatedCordArray[1]);
   1711 }
   1712 
   1713 - (void)setPackedFields:(TestPackedTypes *)message
   1714           repeatedCount:(uint32_t)count {
   1715   // Must match -setUnpackedFields:repeatedCount:
   1716   // Must match -setPackedExtensions:repeatedCount:
   1717   // Must match -setUnpackedExtensions:repeatedCount:
   1718   for (uint32_t i = 0; i < count; ++i) {
   1719     [message.packedInt32Array addValue:601 + i * 100];
   1720   }
   1721   for (uint32_t i = 0; i < count; ++i) {
   1722     [message.packedInt64Array addValue:602 + i * 100];
   1723   }
   1724   for (uint32_t i = 0; i < count; ++i) {
   1725     [message.packedUint32Array addValue:603 + i * 100];
   1726   }
   1727   for (uint32_t i = 0; i < count; ++i) {
   1728     [message.packedUint64Array addValue:604 + i * 100];
   1729   }
   1730   for (uint32_t i = 0; i < count; ++i) {
   1731     [message.packedSint32Array addValue:605 + i * 100];
   1732   }
   1733   for (uint32_t i = 0; i < count; ++i) {
   1734     [message.packedSint64Array addValue:606 + i * 100];
   1735   }
   1736   for (uint32_t i = 0; i < count; ++i) {
   1737     [message.packedFixed32Array addValue:607 + i * 100];
   1738   }
   1739   for (uint32_t i = 0; i < count; ++i) {
   1740     [message.packedFixed64Array addValue:608 + i * 100];
   1741   }
   1742   for (uint32_t i = 0; i < count; ++i) {
   1743     [message.packedSfixed32Array addValue:609 + i * 100];
   1744   }
   1745   for (uint32_t i = 0; i < count; ++i) {
   1746     [message.packedSfixed64Array addValue:610 + i * 100];
   1747   }
   1748   for (uint32_t i = 0; i < count; ++i) {
   1749     [message.packedFloatArray addValue:611 + i * 100];
   1750   }
   1751   for (uint32_t i = 0; i < count; ++i) {
   1752     [message.packedDoubleArray addValue:612 + i * 100];
   1753   }
   1754   for (uint32_t i = 0; i < count; ++i) {
   1755     [message.packedBoolArray addValue:(i % 2) ? YES : NO];
   1756   }
   1757   for (uint32_t i = 0; i < count; ++i) {
   1758     [message.packedEnumArray
   1759         addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
   1760   }
   1761 }
   1762 
   1763 - (void)setUnpackedFields:(TestUnpackedTypes *)message
   1764             repeatedCount:(uint32_t)count {
   1765   // Must match -setPackedFields:repeatedCount:
   1766   // Must match -setPackedExtensions:repeatedCount:
   1767   // Must match -setUnpackedExtensions:repeatedCount:
   1768   for (uint32_t i = 0; i < count; ++i) {
   1769     [message.unpackedInt32Array addValue:601 + i * 100];
   1770   }
   1771   for (uint32_t i = 0; i < count; ++i) {
   1772     [message.unpackedInt64Array addValue:602 + i * 100];
   1773   }
   1774   for (uint32_t i = 0; i < count; ++i) {
   1775     [message.unpackedUint32Array addValue:603 + i * 100];
   1776   }
   1777   for (uint32_t i = 0; i < count; ++i) {
   1778     [message.unpackedUint64Array addValue:604 + i * 100];
   1779   }
   1780   for (uint32_t i = 0; i < count; ++i) {
   1781     [message.unpackedSint32Array addValue:605 + i * 100];
   1782   }
   1783   for (uint32_t i = 0; i < count; ++i) {
   1784     [message.unpackedSint64Array addValue:606 + i * 100];
   1785   }
   1786   for (uint32_t i = 0; i < count; ++i) {
   1787     [message.unpackedFixed32Array addValue:607 + i * 100];
   1788   }
   1789   for (uint32_t i = 0; i < count; ++i) {
   1790     [message.unpackedFixed64Array addValue:608 + i * 100];
   1791   }
   1792   for (uint32_t i = 0; i < count; ++i) {
   1793     [message.unpackedSfixed32Array addValue:609 + i * 100];
   1794   }
   1795   for (uint32_t i = 0; i < count; ++i) {
   1796     [message.unpackedSfixed64Array addValue:610 + i * 100];
   1797   }
   1798   for (uint32_t i = 0; i < count; ++i) {
   1799     [message.unpackedFloatArray addValue:611 + i * 100];
   1800   }
   1801   for (uint32_t i = 0; i < count; ++i) {
   1802     [message.unpackedDoubleArray addValue:612 + i * 100];
   1803   }
   1804   for (uint32_t i = 0; i < count; ++i) {
   1805     [message.unpackedBoolArray addValue:(i % 2) ? YES : NO];
   1806   }
   1807   for (uint32_t i = 0; i < count; ++i) {
   1808     [message.unpackedEnumArray
   1809         addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
   1810   }
   1811 }
   1812 
   1813 - (void)assertPackedFieldsSet:(TestPackedTypes *)message
   1814                 repeatedCount:(uint32_t)count {
   1815   XCTAssertEqual(count, message.packedInt32Array.count);
   1816   XCTAssertEqual(count, message.packedInt64Array.count);
   1817   XCTAssertEqual(count, message.packedUint32Array.count);
   1818   XCTAssertEqual(count, message.packedUint64Array.count);
   1819   XCTAssertEqual(count, message.packedSint32Array.count);
   1820   XCTAssertEqual(count, message.packedSint64Array.count);
   1821   XCTAssertEqual(count, message.packedFixed32Array.count);
   1822   XCTAssertEqual(count, message.packedFixed64Array.count);
   1823   XCTAssertEqual(count, message.packedSfixed32Array.count);
   1824   XCTAssertEqual(count, message.packedSfixed64Array.count);
   1825   XCTAssertEqual(count, message.packedFloatArray.count);
   1826   XCTAssertEqual(count, message.packedDoubleArray.count);
   1827   XCTAssertEqual(count, message.packedBoolArray.count);
   1828   XCTAssertEqual(count, message.packedEnumArray.count);
   1829   for (uint32_t i = 0; i < count; ++i) {
   1830     XCTAssertEqual((int)(601 + i * 100),
   1831                    [message.packedInt32Array valueAtIndex:i]);
   1832     XCTAssertEqual(602 + i * 100, [message.packedInt64Array valueAtIndex:i]);
   1833     XCTAssertEqual(603 + i * 100, [message.packedUint32Array valueAtIndex:i]);
   1834     XCTAssertEqual(604 + i * 100, [message.packedUint64Array valueAtIndex:i]);
   1835     XCTAssertEqual((int)(605 + i * 100),
   1836                    [message.packedSint32Array valueAtIndex:i]);
   1837     XCTAssertEqual(606 + i * 100, [message.packedSint64Array valueAtIndex:i]);
   1838     XCTAssertEqual(607 + i * 100, [message.packedFixed32Array valueAtIndex:i]);
   1839     XCTAssertEqual(608 + i * 100, [message.packedFixed64Array valueAtIndex:i]);
   1840     XCTAssertEqual((int)(609 + i * 100),
   1841                    [message.packedSfixed32Array valueAtIndex:i]);
   1842     XCTAssertEqual(610 + i * 100, [message.packedSfixed64Array valueAtIndex:i]);
   1843     XCTAssertEqualWithAccuracy(611 + i * 100,
   1844                                [message.packedFloatArray valueAtIndex:i], 0.01);
   1845     XCTAssertEqualWithAccuracy(
   1846         612 + i * 100, [message.packedDoubleArray valueAtIndex:i], 0.01);
   1847     XCTAssertEqual((i % 2) ? YES : NO,
   1848                    [message.packedBoolArray valueAtIndex:i]);
   1849     XCTAssertEqual((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz,
   1850                    [message.packedEnumArray valueAtIndex:i]);
   1851   }
   1852 }
   1853 
   1854 - (void)setPackedExtensions:(TestPackedExtensions *)message
   1855               repeatedCount:(uint32_t)count {
   1856   // Must match -setPackedFields:repeatedCount:
   1857   // Must match -setUnpackedFields:repeatedCount:
   1858   // Must match -setUnpackedExtensions:repeatedCount:
   1859   for (uint32_t i = 0; i < count; i++) {
   1860     [message addExtension:[UnittestRoot packedInt32Extension]
   1861                     value:@(601 + i * 100)];
   1862     [message addExtension:[UnittestRoot packedInt64Extension]
   1863                     value:@(602 + i * 100)];
   1864     [message addExtension:[UnittestRoot packedUint32Extension]
   1865                     value:@(603 + i * 100)];
   1866     [message addExtension:[UnittestRoot packedUint64Extension]
   1867                     value:@(604 + i * 100)];
   1868     [message addExtension:[UnittestRoot packedSint32Extension]
   1869                     value:@(605 + i * 100)];
   1870     [message addExtension:[UnittestRoot packedSint64Extension]
   1871                     value:@(606 + i * 100)];
   1872     [message addExtension:[UnittestRoot packedFixed32Extension]
   1873                     value:@(607 + i * 100)];
   1874     [message addExtension:[UnittestRoot packedFixed64Extension]
   1875                     value:@(608 + i * 100)];
   1876     [message addExtension:[UnittestRoot packedSfixed32Extension]
   1877                     value:@(609 + i * 100)];
   1878     [message addExtension:[UnittestRoot packedSfixed64Extension]
   1879                     value:@(610 + i * 100)];
   1880     [message addExtension:[UnittestRoot packedFloatExtension]
   1881                     value:@(611 + i * 100)];
   1882     [message addExtension:[UnittestRoot packedDoubleExtension]
   1883                     value:@(612 + i * 100)];
   1884     [message addExtension:[UnittestRoot packedBoolExtension]
   1885                     value:@((i % 2) ? YES : NO)];
   1886     [message addExtension:[UnittestRoot packedEnumExtension]
   1887                     value:@((i % 2) ? ForeignEnum_ForeignBar
   1888                                     : ForeignEnum_ForeignBaz)];
   1889   }
   1890 }
   1891 
   1892 - (void)setUnpackedExtensions:(TestUnpackedExtensions *)message
   1893                 repeatedCount:(uint32_t)count {
   1894   // Must match -setPackedFields:repeatedCount:
   1895   // Must match -setUnpackedFields:repeatedCount:
   1896   // Must match -setPackedExtensions:repeatedCount:
   1897   for (uint32_t i = 0; i < count; i++) {
   1898     [message addExtension:[UnittestRoot unpackedInt32Extension]
   1899                     value:@(601 + i * 100)];
   1900     [message addExtension:[UnittestRoot unpackedInt64Extension]
   1901                     value:@(602 + i * 100)];
   1902     [message addExtension:[UnittestRoot unpackedUint32Extension]
   1903                     value:@(603 + i * 100)];
   1904     [message addExtension:[UnittestRoot unpackedUint64Extension]
   1905                     value:@(604 + i * 100)];
   1906     [message addExtension:[UnittestRoot unpackedSint32Extension]
   1907                     value:@(605 + i * 100)];
   1908     [message addExtension:[UnittestRoot unpackedSint64Extension]
   1909                     value:@(606 + i * 100)];
   1910     [message addExtension:[UnittestRoot unpackedFixed32Extension]
   1911                     value:@(607 + i * 100)];
   1912     [message addExtension:[UnittestRoot unpackedFixed64Extension]
   1913                     value:@(608 + i * 100)];
   1914     [message addExtension:[UnittestRoot unpackedSfixed32Extension]
   1915                     value:@(609 + i * 100)];
   1916     [message addExtension:[UnittestRoot unpackedSfixed64Extension]
   1917                     value:@(610 + i * 100)];
   1918     [message addExtension:[UnittestRoot unpackedFloatExtension]
   1919                     value:@(611 + i * 100)];
   1920     [message addExtension:[UnittestRoot unpackedDoubleExtension]
   1921                     value:@(612 + i * 100)];
   1922     [message addExtension:[UnittestRoot unpackedBoolExtension]
   1923                     value:@((i % 2) ? YES : NO)];
   1924     [message addExtension:[UnittestRoot unpackedEnumExtension]
   1925                     value:@((i % 2) ? ForeignEnum_ForeignBar
   1926                          : ForeignEnum_ForeignBaz)];
   1927   }
   1928 }
   1929 
   1930 - (void)assertPackedExtensionsSet:(TestPackedExtensions *)message
   1931                     repeatedCount:(uint32_t)count{
   1932   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedInt32Extension]] count]);
   1933   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedInt64Extension]] count]);
   1934   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedUint32Extension]] count]);
   1935   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedUint64Extension]] count]);
   1936   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedSint32Extension]] count]);
   1937   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedSint64Extension]] count]);
   1938   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedFixed32Extension]] count]);
   1939   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedFixed64Extension]] count]);
   1940   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedSfixed32Extension]] count]);
   1941   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedSfixed64Extension]] count]);
   1942   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedFloatExtension]] count]);
   1943   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedDoubleExtension]] count]);
   1944   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedBoolExtension]] count]);
   1945   XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedEnumExtension]] count]);
   1946 
   1947   for (uint32_t i = 0; i < count; ++i) {
   1948     id extension = [message getExtension:[UnittestRoot packedInt32Extension]];
   1949     XCTAssertEqual((int)(601 + i * 100), [extension[i] intValue]);
   1950     extension = [message getExtension:[UnittestRoot packedInt64Extension]];
   1951     XCTAssertEqual(602 + i * 100, [extension[i] longLongValue]);
   1952     extension = [message getExtension:[UnittestRoot packedUint32Extension]];
   1953     XCTAssertEqual(603 + i * 100, [extension[i] unsignedIntValue]);
   1954     extension = [message getExtension:[UnittestRoot packedUint64Extension]];
   1955     XCTAssertEqual(604 + i * 100, [extension[i] unsignedLongLongValue]);
   1956     extension = [message getExtension:[UnittestRoot packedSint32Extension]];
   1957     XCTAssertEqual((int)(605 + i * 100), [extension[i] intValue]);
   1958     extension = [message getExtension:[UnittestRoot packedSint64Extension]];
   1959     XCTAssertEqual(606 + i * 100, [extension[i] longLongValue]);
   1960     extension = [message getExtension:[UnittestRoot packedFixed32Extension]];
   1961     XCTAssertEqual(607 + i * 100, [extension[i] unsignedIntValue]);
   1962     extension = [message getExtension:[UnittestRoot packedFixed64Extension]];
   1963     XCTAssertEqual(608 + i * 100, [extension[i] unsignedLongLongValue]);
   1964     extension = [message getExtension:[UnittestRoot packedSfixed32Extension]];
   1965     XCTAssertEqual((int)(609 + i * 100), [extension[i] intValue]);
   1966     extension = [message getExtension:[UnittestRoot packedSfixed64Extension]];
   1967     XCTAssertEqual(610 + i * 100, [extension[i] longLongValue]);
   1968     extension = [message getExtension:[UnittestRoot packedFloatExtension]];
   1969     XCTAssertEqualWithAccuracy(611 + i * 100, [extension[i] floatValue], 0.01);
   1970     extension = [message getExtension:[UnittestRoot packedDoubleExtension]];
   1971     XCTAssertEqualWithAccuracy(612 + i * 100, [extension[i] doubleValue], 0.01);
   1972     extension = [message getExtension:[UnittestRoot packedBoolExtension]];
   1973     XCTAssertEqual((i % 2) ? YES : NO, [extension[i] boolValue]);
   1974     extension = [message getExtension:[UnittestRoot packedEnumExtension]];
   1975     XCTAssertEqual((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz,
   1976                    [extension[i] intValue]);
   1977   }
   1978 }
   1979 
   1980 - (void)assertAllFieldsKVCMatch:(TestAllTypes *)message {
   1981   XCTAssertEqualObjects([message valueForKey:@"hasOptionalInt32"], @YES);
   1982   XCTAssertEqualObjects(@(message.optionalInt32), [message valueForKey:@"optionalInt32"]);
   1983   XCTAssertEqualObjects([message valueForKey:@"hasOptionalInt64"], @YES);
   1984   XCTAssertEqualObjects(@(message.optionalInt64), [message valueForKey:@"optionalInt64"]);
   1985   XCTAssertEqualObjects([message valueForKey:@"hasOptionalUint32"], @YES);
   1986   XCTAssertEqualObjects(@(message.optionalUint32), [message valueForKey:@"optionalUint32"]);
   1987   XCTAssertEqualObjects([message valueForKey:@"hasOptionalUint64"], @YES);
   1988   XCTAssertEqualObjects(@(message.optionalUint64), [message valueForKey:@"optionalUint64"]);
   1989   XCTAssertEqualObjects([message valueForKey:@"hasOptionalSint32"], @YES);
   1990   XCTAssertEqualObjects(@(message.optionalSint32), [message valueForKey:@"optionalSint32"]);
   1991   XCTAssertEqualObjects([message valueForKey:@"hasOptionalSint64"], @YES);
   1992   XCTAssertEqualObjects(@(message.optionalSint64), [message valueForKey:@"optionalSint64"]);
   1993   XCTAssertEqualObjects([message valueForKey:@"hasOptionalFixed32"], @YES);
   1994   XCTAssertEqualObjects(@(message.optionalFixed32), [message valueForKey:@"optionalFixed32"]);
   1995   XCTAssertEqualObjects([message valueForKey:@"hasOptionalFixed64"], @YES);
   1996   XCTAssertEqualObjects(@(message.optionalFixed64), [message valueForKey:@"optionalFixed64"]);
   1997   XCTAssertEqualObjects([message valueForKey:@"hasOptionalSfixed32"], @YES);
   1998   XCTAssertEqualObjects(@(message.optionalSfixed32), [message valueForKey:@"optionalSfixed32"]);
   1999   XCTAssertEqualObjects([message valueForKey:@"hasOptionalSfixed64"], @YES);
   2000   XCTAssertEqualObjects(@(message.optionalSfixed64), [message valueForKey:@"optionalSfixed64"]);
   2001   XCTAssertEqualObjects([message valueForKey:@"hasOptionalFloat"], @YES);
   2002   XCTAssertEqualObjects(@(message.optionalFloat), [message valueForKey:@"optionalFloat"]);
   2003   XCTAssertEqualObjects([message valueForKey:@"hasOptionalDouble"], @YES);
   2004   XCTAssertEqualObjects(@(message.optionalDouble), [message valueForKey:@"optionalDouble"]);
   2005   XCTAssertEqualObjects([message valueForKey:@"hasOptionalBool"], @YES);
   2006   XCTAssertEqualObjects(@(message.optionalBool), [message valueForKey:@"optionalBool"]);
   2007   XCTAssertEqualObjects([message valueForKey:@"hasOptionalString"], @YES);
   2008   XCTAssertEqualObjects(message.optionalString, [message valueForKey:@"optionalString"]);
   2009   XCTAssertEqualObjects([message valueForKey:@"hasOptionalBytes"], @YES);
   2010   XCTAssertEqualObjects(message.optionalBytes, [message valueForKey:@"optionalBytes"]);
   2011 
   2012   XCTAssertEqualObjects([message valueForKey:@"hasOptionalGroup"], @YES);
   2013   XCTAssertNotNil(message.optionalGroup);
   2014   XCTAssertEqualObjects([message valueForKeyPath:@"optionalGroup.hasA"], @YES);
   2015   XCTAssertEqualObjects(@(message.optionalGroup.a), [message valueForKeyPath:@"optionalGroup.a"]);
   2016   XCTAssertEqualObjects([message valueForKey:@"hasOptionalNestedMessage"], @YES);
   2017   XCTAssertNotNil(message.optionalNestedMessage);
   2018   XCTAssertEqualObjects([message valueForKeyPath:@"optionalNestedMessage.hasBb"], @YES);
   2019   XCTAssertEqualObjects(@(message.optionalNestedMessage.bb), [message valueForKeyPath:@"optionalNestedMessage.bb"]);
   2020   XCTAssertEqualObjects([message valueForKey:@"hasOptionalForeignMessage"], @YES);
   2021   XCTAssertNotNil(message.optionalForeignMessage);
   2022   XCTAssertEqualObjects([message valueForKeyPath:@"optionalForeignMessage.hasC"], @YES);
   2023   XCTAssertEqualObjects(@(message.optionalForeignMessage.c), [message valueForKeyPath:@"optionalForeignMessage.c"]);
   2024   XCTAssertEqualObjects([message valueForKey:@"hasOptionalImportMessage"], @YES);
   2025   XCTAssertNotNil(message.optionalForeignMessage);
   2026   XCTAssertEqualObjects([message valueForKeyPath:@"optionalImportMessage.hasD"], @YES);
   2027   XCTAssertEqualObjects(@(message.optionalImportMessage.d), [message valueForKeyPath:@"optionalImportMessage.d"]);
   2028 
   2029   XCTAssertEqualObjects([message valueForKey:@"hasOptionalNestedEnum"], @YES);
   2030   XCTAssertEqualObjects(@(message.optionalNestedEnum), [message valueForKey:@"optionalNestedEnum"]);
   2031   XCTAssertEqualObjects([message valueForKey:@"hasOptionalForeignEnum"], @YES);
   2032   XCTAssertEqualObjects(@(message.optionalForeignEnum), [message valueForKey:@"optionalForeignEnum"]);
   2033   XCTAssertEqualObjects([message valueForKey:@"hasOptionalImportEnum"], @YES);
   2034   XCTAssertEqualObjects(@(message.optionalImportEnum), [message valueForKey:@"optionalImportEnum"]);
   2035 
   2036   XCTAssertEqualObjects([message valueForKey:@"hasOptionalStringPiece"], @YES);
   2037   XCTAssertEqualObjects(message.optionalStringPiece, [message valueForKey:@"optionalStringPiece"]);
   2038   XCTAssertEqualObjects([message valueForKey:@"hasOptionalCord"], @YES);
   2039   XCTAssertEqualObjects(message.optionalCord, [message valueForKey:@"optionalCord"]);
   2040 
   2041   // -----------------------------------------------------------------
   2042 
   2043   // GPBArray interface for repeated
   2044 
   2045   XCTAssertEqualObjects(message.repeatedInt32Array, [message valueForKey:@"repeatedInt32Array"]);
   2046   XCTAssertEqualObjects(message.repeatedInt64Array, [message valueForKey:@"repeatedInt64Array"]);
   2047   XCTAssertEqualObjects(message.repeatedUint32Array, [message valueForKey:@"repeatedUint32Array"]);
   2048   XCTAssertEqualObjects(message.repeatedUint64Array, [message valueForKey:@"repeatedUint64Array"]);
   2049   XCTAssertEqualObjects(message.repeatedSint32Array, [message valueForKey:@"repeatedSint32Array"]);
   2050   XCTAssertEqualObjects(message.repeatedSint64Array, [message valueForKey:@"repeatedSint64Array"]);
   2051   XCTAssertEqualObjects(message.repeatedFixed32Array, [message valueForKey:@"repeatedFixed32Array"]);
   2052   XCTAssertEqualObjects(message.repeatedFixed64Array, [message valueForKey:@"repeatedFixed64Array"]);
   2053   XCTAssertEqualObjects(message.repeatedSfixed32Array, [message valueForKey:@"repeatedSfixed32Array"]);
   2054   XCTAssertEqualObjects(message.repeatedSfixed64Array, [message valueForKey:@"repeatedSfixed64Array"]);
   2055   XCTAssertEqualObjects(message.repeatedFloatArray, [message valueForKey:@"repeatedFloatArray"]);
   2056   XCTAssertEqualObjects(message.repeatedDoubleArray, [message valueForKey:@"repeatedDoubleArray"]);
   2057   XCTAssertEqualObjects(message.repeatedBoolArray, [message valueForKey:@"repeatedBoolArray"]);
   2058   XCTAssertEqualObjects(message.repeatedStringArray, [message valueForKey:@"repeatedStringArray"]);
   2059   XCTAssertEqualObjects(message.repeatedBytesArray, [message valueForKey:@"repeatedBytesArray"]);
   2060 
   2061   XCTAssertEqualObjects(message.repeatedGroupArray, [message valueForKey:@"repeatedGroupArray"]);
   2062   XCTAssertEqualObjects(message.repeatedNestedMessageArray, [message valueForKey:@"repeatedNestedMessageArray"]);
   2063   XCTAssertEqualObjects(message.repeatedForeignMessageArray, [message valueForKey:@"repeatedForeignMessageArray"]);
   2064   XCTAssertEqualObjects(message.repeatedImportMessageArray, [message valueForKey:@"repeatedImportMessageArray"]);
   2065 
   2066   XCTAssertEqualObjects(message.repeatedNestedEnumArray, [message valueForKey:@"repeatedNestedEnumArray"]);
   2067   XCTAssertEqualObjects(message.repeatedForeignEnumArray, [message valueForKey:@"repeatedForeignEnumArray"]);
   2068   XCTAssertEqualObjects(message.repeatedImportEnumArray, [message valueForKey:@"repeatedImportEnumArray"]);
   2069 
   2070   XCTAssertEqualObjects(message.repeatedStringPieceArray, [message valueForKey:@"repeatedStringPieceArray"]);
   2071   XCTAssertEqualObjects(message.repeatedCordArray, [message valueForKey:@"repeatedCordArray"]);
   2072 
   2073   XCTAssertEqualObjects(@(message.repeatedInt32Array_Count), [message valueForKey:@"repeatedInt32Array_Count"]);
   2074   XCTAssertEqualObjects(@(message.repeatedInt64Array_Count), [message valueForKey:@"repeatedInt64Array_Count"]);
   2075   XCTAssertEqualObjects(@(message.repeatedUint32Array_Count), [message valueForKey:@"repeatedUint32Array_Count"]);
   2076   XCTAssertEqualObjects(@(message.repeatedUint64Array_Count), [message valueForKey:@"repeatedUint64Array_Count"]);
   2077   XCTAssertEqualObjects(@(message.repeatedSint32Array_Count), [message valueForKey:@"repeatedSint32Array_Count"]);
   2078   XCTAssertEqualObjects(@(message.repeatedSint64Array_Count), [message valueForKey:@"repeatedSint64Array_Count"]);
   2079   XCTAssertEqualObjects(@(message.repeatedFixed32Array_Count), [message valueForKey:@"repeatedFixed32Array_Count"]);
   2080   XCTAssertEqualObjects(@(message.repeatedFixed64Array_Count), [message valueForKey:@"repeatedFixed64Array_Count"]);
   2081   XCTAssertEqualObjects(@(message.repeatedSfixed32Array_Count), [message valueForKey:@"repeatedSfixed32Array_Count"]);
   2082   XCTAssertEqualObjects(@(message.repeatedSfixed64Array_Count), [message valueForKey:@"repeatedSfixed64Array_Count"]);
   2083   XCTAssertEqualObjects(@(message.repeatedFloatArray_Count), [message valueForKey:@"repeatedFloatArray_Count"]);
   2084   XCTAssertEqualObjects(@(message.repeatedDoubleArray_Count), [message valueForKey:@"repeatedDoubleArray_Count"]);
   2085   XCTAssertEqualObjects(@(message.repeatedBoolArray_Count), [message valueForKey:@"repeatedBoolArray_Count"]);
   2086   XCTAssertEqualObjects(@(message.repeatedStringArray_Count), [message valueForKey:@"repeatedStringArray_Count"]);
   2087   XCTAssertEqualObjects(@(message.repeatedBytesArray_Count), [message valueForKey:@"repeatedBytesArray_Count"]);
   2088 
   2089   XCTAssertEqualObjects(@(message.repeatedGroupArray_Count), [message valueForKey:@"repeatedGroupArray_Count"]);
   2090   XCTAssertEqualObjects(@(message.repeatedNestedMessageArray_Count), [message valueForKey:@"repeatedNestedMessageArray_Count"]);
   2091   XCTAssertEqualObjects(@(message.repeatedForeignMessageArray_Count), [message valueForKey:@"repeatedForeignMessageArray_Count"]);
   2092   XCTAssertEqualObjects(@(message.repeatedImportMessageArray_Count), [message valueForKey:@"repeatedImportMessageArray_Count"]);
   2093 
   2094   XCTAssertEqualObjects(@(message.repeatedNestedEnumArray_Count), [message valueForKey:@"repeatedNestedEnumArray_Count"]);
   2095   XCTAssertEqualObjects(@(message.repeatedForeignEnumArray_Count), [message valueForKey:@"repeatedForeignEnumArray_Count"]);
   2096   XCTAssertEqualObjects(@(message.repeatedImportEnumArray_Count), [message valueForKey:@"repeatedImportEnumArray_Count"]);
   2097 
   2098   XCTAssertEqualObjects(@(message.repeatedStringPieceArray_Count), [message valueForKey:@"repeatedStringPieceArray_Count"]);
   2099   XCTAssertEqualObjects(@(message.repeatedCordArray_Count), [message valueForKey:@"repeatedCordArray_Count"]);
   2100 
   2101   // -----------------------------------------------------------------
   2102 
   2103   XCTAssertEqualObjects([message valueForKey:@"hasDefaultInt32"], @YES);
   2104   XCTAssertEqualObjects(@(message.defaultInt32), [message valueForKey:@"defaultInt32"]);
   2105   XCTAssertEqualObjects([message valueForKey:@"hasDefaultInt64"], @YES);
   2106   XCTAssertEqualObjects(@(message.defaultInt64), [message valueForKey:@"defaultInt64"]);
   2107   XCTAssertEqualObjects([message valueForKey:@"hasDefaultUint32"], @YES);
   2108   XCTAssertEqualObjects(@(message.defaultUint32), [message valueForKey:@"defaultUint32"]);
   2109   XCTAssertEqualObjects([message valueForKey:@"hasDefaultUint64"], @YES);
   2110   XCTAssertEqualObjects(@(message.defaultUint64), [message valueForKey:@"defaultUint64"]);
   2111   XCTAssertEqualObjects([message valueForKey:@"hasDefaultSint32"], @YES);
   2112   XCTAssertEqualObjects(@(message.defaultSint32), [message valueForKey:@"defaultSint32"]);
   2113   XCTAssertEqualObjects([message valueForKey:@"hasDefaultSint64"], @YES);
   2114   XCTAssertEqualObjects(@(message.defaultSint64), [message valueForKey:@"defaultSint64"]);
   2115   XCTAssertEqualObjects([message valueForKey:@"hasDefaultFixed32"], @YES);
   2116   XCTAssertEqualObjects(@(message.defaultFixed32), [message valueForKey:@"defaultFixed32"]);
   2117   XCTAssertEqualObjects([message valueForKey:@"hasDefaultFixed64"], @YES);
   2118   XCTAssertEqualObjects(@(message.defaultFixed64), [message valueForKey:@"defaultFixed64"]);
   2119   XCTAssertEqualObjects([message valueForKey:@"hasDefaultSfixed32"], @YES);
   2120   XCTAssertEqualObjects(@(message.defaultSfixed32), [message valueForKey:@"defaultSfixed32"]);
   2121   XCTAssertEqualObjects([message valueForKey:@"hasDefaultSfixed64"], @YES);
   2122   XCTAssertEqualObjects(@(message.defaultSfixed64), [message valueForKey:@"defaultSfixed64"]);
   2123   XCTAssertEqualObjects([message valueForKey:@"hasDefaultFloat"], @YES);
   2124   XCTAssertEqualObjects(@(message.defaultFloat), [message valueForKey:@"defaultFloat"]);
   2125   XCTAssertEqualObjects([message valueForKey:@"hasDefaultDouble"], @YES);
   2126   XCTAssertEqualObjects(@(message.defaultDouble), [message valueForKey:@"defaultDouble"]);
   2127   XCTAssertEqualObjects([message valueForKey:@"hasDefaultBool"], @YES);
   2128   XCTAssertEqualObjects(@(message.defaultBool), [message valueForKey:@"defaultBool"]);
   2129   XCTAssertEqualObjects([message valueForKey:@"hasDefaultString"], @YES);
   2130   XCTAssertEqualObjects(message.defaultString, [message valueForKey:@"defaultString"]);
   2131   XCTAssertEqualObjects([message valueForKey:@"hasDefaultBytes"], @YES);
   2132   XCTAssertEqualObjects(message.defaultBytes, [message valueForKey:@"defaultBytes"]);
   2133 
   2134   XCTAssertEqualObjects([message valueForKey:@"hasDefaultNestedEnum"], @YES);
   2135   XCTAssertEqualObjects(@(message.defaultNestedEnum), [message valueForKey:@"defaultNestedEnum"]);
   2136   XCTAssertEqualObjects([message valueForKey:@"hasDefaultForeignEnum"], @YES);
   2137   XCTAssertEqualObjects(@(message.defaultForeignEnum), [message valueForKey:@"defaultForeignEnum"]);
   2138   XCTAssertEqualObjects([message valueForKey:@"hasDefaultImportEnum"], @YES);
   2139   XCTAssertEqualObjects(@(message.defaultImportEnum), [message valueForKey:@"defaultImportEnum"]);
   2140 
   2141   XCTAssertEqualObjects([message valueForKey:@"hasDefaultStringPiece"], @YES);
   2142   XCTAssertEqualObjects(message.defaultStringPiece, [message valueForKey:@"defaultStringPiece"]);
   2143   XCTAssertEqualObjects([message valueForKey:@"hasDefaultCord"], @YES);
   2144   XCTAssertEqualObjects(message.defaultCord, [message valueForKey:@"defaultCord"]);
   2145 }
   2146 
   2147 - (void)setAllFieldsViaKVC:(TestAllTypes *)message
   2148              repeatedCount:(uint32_t)count {
   2149   [message setValue:@101 forKey:@"optionalInt32"];
   2150   [message setValue:@102 forKey:@"optionalInt64"];
   2151   [message setValue:@103 forKey:@"optionalUint32"];
   2152   [message setValue:@104 forKey:@"optionalUint64"];
   2153   [message setValue:@105 forKey:@"optionalSint32"];
   2154   [message setValue:@106 forKey:@"optionalSint64"];
   2155   [message setValue:@107 forKey:@"optionalFixed32"];
   2156   [message setValue:@108 forKey:@"optionalFixed64"];
   2157   [message setValue:@109 forKey:@"optionalSfixed32"];
   2158   [message setValue:@110 forKey:@"optionalSfixed64"];
   2159   [message setValue:@111 forKey:@"optionalFloat"];
   2160   [message setValue:@112 forKey:@"optionalDouble"];
   2161   [message setValue:@YES forKey:@"optionalBool"];
   2162   [message setValue:@"115" forKey:@"optionalString"];
   2163   [message setValue:[NSData gpbtu_dataWithEmbeddedNulls]
   2164              forKey:@"optionalBytes"];
   2165 
   2166   TestAllTypes_OptionalGroup *allTypes = [TestAllTypes_OptionalGroup message];
   2167   [allTypes setValue:@117 forKey:@"a"];
   2168   [message setValue:allTypes forKey:@"optionalGroup"];
   2169   TestAllTypes_NestedMessage *nestedMessage =
   2170       [TestAllTypes_NestedMessage message];
   2171   [nestedMessage setValue:@118 forKey:@"bb"];
   2172   [message setValue:nestedMessage forKey:@"optionalNestedMessage"];
   2173   ForeignMessage *foreignMessage = [ForeignMessage message];
   2174   [foreignMessage setValue:@119 forKey:@"c"];
   2175   [message setValue:foreignMessage forKey:@"optionalForeignMessage"];
   2176   ImportMessage *importMessage = [ImportMessage message];
   2177   [importMessage setValue:@120 forKey:@"d"];
   2178   [message setValue:importMessage forKey:@"optionalImportMessage"];
   2179 
   2180   [message setValue:@(TestAllTypes_NestedEnum_Baz)
   2181              forKey:@"optionalNestedEnum"];
   2182   [message setValue:@(ForeignEnum_ForeignBaz) forKey:@"optionalForeignEnum"];
   2183   [message setValue:@(ImportEnum_ImportBaz) forKey:@"optionalImportEnum"];
   2184 
   2185   [message setValue:@"124" forKey:@"optionalStringPiece"];
   2186   [message setValue:@"125" forKey:@"optionalCord"];
   2187 
   2188   // -----------------------------------------------------------------
   2189 
   2190   {
   2191     GPBInt32Array *scratch = [GPBInt32Array array];
   2192     for (uint32_t i = 0; i < count; ++i) {
   2193       [scratch addValue:201 + i * 100];
   2194     }
   2195     [message setValue:scratch forKey:@"repeatedInt32Array"];
   2196   }
   2197   {
   2198     GPBInt64Array *scratch = [GPBInt64Array array];
   2199     for (uint32_t i = 0; i < count; ++i) {
   2200       [scratch addValue:202 + i * 100];
   2201     }
   2202     [message setValue:scratch forKey:@"repeatedInt64Array"];
   2203   }
   2204   {
   2205     GPBUInt32Array *scratch = [GPBUInt32Array array];
   2206     for (uint32_t i = 0; i < count; ++i) {
   2207       [scratch addValue:203 + i * 100];
   2208     }
   2209     [message setValue:scratch forKey:@"repeatedUint32Array"];
   2210   }
   2211   {
   2212     GPBUInt64Array *scratch = [GPBUInt64Array array];
   2213     for (uint32_t i = 0; i < count; ++i) {
   2214       [scratch addValue:204 + i * 100];
   2215     }
   2216     [message setValue:scratch forKey:@"repeatedUint64Array"];
   2217   }
   2218   {
   2219     GPBInt32Array *scratch = [GPBInt32Array array];
   2220     for (uint32_t i = 0; i < count; ++i) {
   2221       [scratch addValue:205 + i * 100];
   2222     }
   2223     [message setValue:scratch forKey:@"repeatedSint32Array"];
   2224   }
   2225   {
   2226     GPBInt64Array *scratch = [GPBInt64Array array];
   2227     for (uint32_t i = 0; i < count; ++i) {
   2228       [scratch addValue:206 + i * 100];
   2229     }
   2230     [message setValue:scratch forKey:@"repeatedSint64Array"];
   2231   }
   2232   {
   2233     GPBUInt32Array *scratch = [GPBUInt32Array array];
   2234     for (uint32_t i = 0; i < count; ++i) {
   2235       [scratch addValue:207 + i * 100];
   2236     }
   2237     [message setValue:scratch forKey:@"repeatedFixed32Array"];
   2238   }
   2239   {
   2240     GPBUInt64Array *scratch = [GPBUInt64Array array];
   2241     for (uint32_t i = 0; i < count; ++i) {
   2242       [scratch addValue:208 + i * 100];
   2243     }
   2244     [message setValue:scratch forKey:@"repeatedFixed64Array"];
   2245   }
   2246   {
   2247     GPBInt32Array *scratch = [GPBInt32Array array];
   2248     for (uint32_t i = 0; i < count; ++i) {
   2249       [scratch addValue:209 + i * 100];
   2250     }
   2251     [message setValue:scratch forKey:@"repeatedSfixed32Array"];
   2252   }
   2253   {
   2254     GPBInt64Array *scratch = [GPBInt64Array array];
   2255     for (uint32_t i = 0; i < count; ++i) {
   2256       [scratch addValue:210 + i * 100];
   2257     }
   2258     [message setValue:scratch forKey:@"repeatedSfixed64Array"];
   2259   }
   2260   {
   2261     GPBFloatArray *scratch = [GPBFloatArray array];
   2262     for (uint32_t i = 0; i < count; ++i) {
   2263       [scratch addValue:211 + i * 100];
   2264     }
   2265     [message setValue:scratch forKey:@"repeatedFloatArray"];
   2266   }
   2267   {
   2268     GPBDoubleArray *scratch = [GPBDoubleArray array];
   2269     for (uint32_t i = 0; i < count; ++i) {
   2270       [scratch addValue:212 + i * 100];
   2271     }
   2272     [message setValue:scratch forKey:@"repeatedDoubleArray"];
   2273   }
   2274   {
   2275     GPBBoolArray *scratch = [GPBBoolArray array];
   2276     for (uint32_t i = 0; i < count; ++i) {
   2277       [scratch addValue:(i % 2) ? YES : NO];
   2278     }
   2279     [message setValue:scratch forKey:@"repeatedBoolArray"];
   2280   }
   2281 
   2282   NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:count];
   2283   for (uint32_t i = 0; i < count; ++i) {
   2284     NSString *string = [[NSString alloc] initWithFormat:@"%d", 215 + i * 100];
   2285     [array addObject:string];
   2286     [string release];
   2287   }
   2288   [message setValue:array forKey:@"repeatedStringArray"];
   2289   [array release];
   2290 
   2291   array = [[NSMutableArray alloc] initWithCapacity:count];
   2292   for (uint32_t i = 0; i < count; ++i) {
   2293     NSData *data = [[NSData alloc] initWithUint32_gpbtu:216 + i * 100];
   2294     [array addObject:data];
   2295     [data release];
   2296   }
   2297   [message setValue:array forKey:@"repeatedBytesArray"];
   2298   [array release];
   2299 
   2300   array = [[NSMutableArray alloc] initWithCapacity:count];
   2301   for (uint32_t i = 0; i < count; ++i) {
   2302     TestAllTypes_RepeatedGroup *testAll =
   2303         [[TestAllTypes_RepeatedGroup alloc] init];
   2304     [testAll setA:217 + i * 100];
   2305     [array addObject:testAll];
   2306     [testAll release];
   2307   }
   2308   [message setValue:array forKey:@"repeatedGroupArray"];
   2309   [array release];
   2310 
   2311   array = [[NSMutableArray alloc] initWithCapacity:count];
   2312   for (uint32_t i = 0; i < count; ++i) {
   2313     nestedMessage = [[TestAllTypes_NestedMessage alloc] init];
   2314     [nestedMessage setBb:218 + i * 100];
   2315     [array addObject:nestedMessage];
   2316     [nestedMessage release];
   2317   }
   2318   [message setValue:array forKey:@"repeatedNestedMessageArray"];
   2319   [array release];
   2320 
   2321   array = [[NSMutableArray alloc] initWithCapacity:count];
   2322   for (uint32_t i = 0; i < count; ++i) {
   2323     foreignMessage = [[ForeignMessage alloc] init];
   2324     [foreignMessage setC:219 + i * 100];
   2325     [array addObject:foreignMessage];
   2326     [foreignMessage release];
   2327   }
   2328   [message setValue:array forKey:@"repeatedForeignMessageArray"];
   2329   [array release];
   2330 
   2331   array = [[NSMutableArray alloc] initWithCapacity:count];
   2332   for (uint32_t i = 0; i < count; ++i) {
   2333     importMessage = [[ImportMessage alloc] init];
   2334     [importMessage setD:220 + i * 100];
   2335     [array addObject:importMessage];
   2336     [importMessage release];
   2337   }
   2338   [message setValue:array forKey:@"repeatedImportMessageArray"];
   2339   [array release];
   2340 
   2341   {
   2342     GPBEnumArray *scratch = [GPBEnumArray
   2343         arrayWithValidationFunction:TestAllTypes_NestedEnum_IsValidValue];
   2344     for (uint32_t i = 0; i < count; ++i) {
   2345       [scratch addValue:(i % 2) ? TestAllTypes_NestedEnum_Bar
   2346                                 : TestAllTypes_NestedEnum_Baz];
   2347     }
   2348     [message setValue:scratch forKey:@"repeatedNestedEnumArray"];
   2349   }
   2350   {
   2351     GPBEnumArray *scratch =
   2352         [GPBEnumArray arrayWithValidationFunction:ForeignEnum_IsValidValue];
   2353     for (uint32_t i = 0; i < count; ++i) {
   2354       [scratch
   2355           addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
   2356     }
   2357     [message setValue:scratch forKey:@"repeatedForeignEnumArray"];
   2358   }
   2359   {
   2360     GPBEnumArray *scratch =
   2361         [GPBEnumArray arrayWithValidationFunction:ImportEnum_IsValidValue];
   2362     for (uint32_t i = 0; i < count; ++i) {
   2363       [scratch addValue:(i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz];
   2364     }
   2365     [message setValue:scratch forKey:@"repeatedImportEnumArray"];
   2366   }
   2367 
   2368   array = [[NSMutableArray alloc] initWithCapacity:count];
   2369   for (uint32_t i = 0; i < count; ++i) {
   2370     NSString *string = [[NSString alloc] initWithFormat:@"%d", 224 + i * 100];
   2371     [array addObject:string];
   2372     [string release];
   2373   }
   2374   [message setValue:array forKey:@"repeatedStringPieceArray"];
   2375   [array release];
   2376 
   2377   array = [[NSMutableArray alloc] initWithCapacity:count];
   2378   for (uint32_t i = 0; i < count; ++i) {
   2379     NSString *string = [[NSString alloc] initWithFormat:@"%d", 225 + i * 100];
   2380     [array addObject:string];
   2381     [string release];
   2382   }
   2383   [message setValue:array forKey:@"repeatedCordArray"];
   2384   [array release];
   2385 
   2386   // -----------------------------------------------------------------
   2387 
   2388   [message setValue:@401 forKey:@"defaultInt32"];
   2389   [message setValue:@402 forKey:@"defaultInt64"];
   2390   [message setValue:@403 forKey:@"defaultUint32"];
   2391   [message setValue:@404 forKey:@"defaultUint64"];
   2392   [message setValue:@405 forKey:@"defaultSint32"];
   2393   [message setValue:@406 forKey:@"defaultSint64"];
   2394   [message setValue:@407 forKey:@"defaultFixed32"];
   2395   [message setValue:@408 forKey:@"defaultFixed64"];
   2396   [message setValue:@409 forKey:@"defaultSfixed32"];
   2397   [message setValue:@410 forKey:@"defaultSfixed64"];
   2398   [message setValue:@411 forKey:@"defaultFloat"];
   2399   [message setValue:@412 forKey:@"defaultDouble"];
   2400   [message setValue:@NO forKey:@"defaultBool"];
   2401   [message setValue:@"415" forKey:@"defaultString"];
   2402   [message setValue:[NSData gpbtu_dataWithUint32:416] forKey:@"defaultBytes"];
   2403 
   2404   [message setValue:@(TestAllTypes_NestedEnum_Foo) forKey:@"defaultNestedEnum"];
   2405   [message setValue:@(ForeignEnum_ForeignFoo) forKey:@"defaultForeignEnum"];
   2406   [message setValue:@(ImportEnum_ImportFoo) forKey:@"defaultImportEnum"];
   2407 
   2408   [message setValue:@"424" forKey:@"defaultStringPiece"];
   2409   [message setValue:@"425" forKey:@"defaultCord"];
   2410 }
   2411 
   2412 - (void)assertClearKVC:(TestAllTypes *)message {
   2413   XCTAssertEqualObjects([message valueForKey:@"hasOptionalInt32"], @NO);
   2414   XCTAssertEqualObjects([message valueForKey:@"hasOptionalInt64"], @NO);
   2415   XCTAssertEqualObjects([message valueForKey:@"hasOptionalUint32"], @NO);
   2416   XCTAssertEqualObjects([message valueForKey:@"hasOptionalUint64"], @NO);
   2417   XCTAssertEqualObjects([message valueForKey:@"hasOptionalSint32"], @NO);
   2418   XCTAssertEqualObjects([message valueForKey:@"hasOptionalSint64"], @NO);
   2419   XCTAssertEqualObjects([message valueForKey:@"hasOptionalFixed32"], @NO);
   2420   XCTAssertEqualObjects([message valueForKey:@"hasOptionalFixed64"], @NO);
   2421   XCTAssertEqualObjects([message valueForKey:@"hasOptionalSfixed32"], @NO);
   2422   XCTAssertEqualObjects([message valueForKey:@"hasOptionalSfixed64"], @NO);
   2423   XCTAssertEqualObjects([message valueForKey:@"hasOptionalFloat"], @NO);
   2424   XCTAssertEqualObjects([message valueForKey:@"hasOptionalDouble"], @NO);
   2425   XCTAssertEqualObjects([message valueForKey:@"hasOptionalBool"], @NO);
   2426   XCTAssertEqualObjects([message valueForKey:@"hasOptionalString"], @NO);
   2427   XCTAssertEqualObjects([message valueForKey:@"hasOptionalBytes"], @NO);
   2428 
   2429   XCTAssertEqualObjects([message valueForKey:@"hasOptionalGroup"], @NO);
   2430   XCTAssertEqualObjects([message valueForKey:@"hasOptionalNestedMessage"], @NO);
   2431   XCTAssertEqualObjects([message valueForKey:@"hasOptionalForeignMessage"],
   2432                         @NO);
   2433   XCTAssertEqualObjects([message valueForKey:@"hasOptionalImportMessage"], @NO);
   2434 
   2435   XCTAssertEqualObjects([message valueForKey:@"hasOptionalNestedEnum"], @NO);
   2436   XCTAssertEqualObjects([message valueForKey:@"hasOptionalForeignEnum"], @NO);
   2437   XCTAssertEqualObjects([message valueForKey:@"hasOptionalImportEnum"], @NO);
   2438 
   2439   XCTAssertEqualObjects([message valueForKey:@"hasOptionalStringPiece"], @NO);
   2440   XCTAssertEqualObjects([message valueForKey:@"hasOptionalCord"], @NO);
   2441 
   2442   // Optional fields without defaults are set to zero or something like it.
   2443   XCTAssertEqualObjects([message valueForKey:@"optionalInt32"], @0);
   2444   XCTAssertEqualObjects([message valueForKey:@"optionalInt64"], @0);
   2445   XCTAssertEqualObjects([message valueForKey:@"optionalUint32"], @0);
   2446   XCTAssertEqualObjects([message valueForKey:@"optionalUint64"], @0);
   2447   XCTAssertEqualObjects([message valueForKey:@"optionalSint32"], @0);
   2448   XCTAssertEqualObjects([message valueForKey:@"optionalSint64"], @0);
   2449   XCTAssertEqualObjects([message valueForKey:@"optionalFixed32"], @0);
   2450   XCTAssertEqualObjects([message valueForKey:@"optionalFixed64"], @0);
   2451   XCTAssertEqualObjects([message valueForKey:@"optionalSfixed32"], @0);
   2452   XCTAssertEqualObjects([message valueForKey:@"optionalSfixed64"], @0);
   2453   XCTAssertEqualObjects([message valueForKey:@"optionalFloat"], @0);
   2454   XCTAssertEqualObjects([message valueForKey:@"optionalDouble"], @0);
   2455   XCTAssertEqualObjects([message valueForKey:@"optionalBool"], @NO);
   2456   XCTAssertEqualObjects([message valueForKey:@"optionalString"], @"");
   2457   XCTAssertEqualObjects([message valueForKey:@"optionalBytes"],
   2458                         GPBEmptyNSData());
   2459 
   2460   // Embedded messages should also be exist, but be clear.
   2461   XCTAssertNotNil([message valueForKeyPath:@"optionalGroup"]);
   2462   XCTAssertNotNil([message valueForKeyPath:@"optionalNestedMessage"]);
   2463   XCTAssertNotNil([message valueForKeyPath:@"optionalForeignMessage"]);
   2464   XCTAssertNotNil([message valueForKeyPath:@"optionalImportMessage"]);
   2465   XCTAssertEqualObjects([message valueForKeyPath:@"optionalGroup.hasA"], @NO);
   2466   XCTAssertEqualObjects(
   2467       [message valueForKeyPath:@"optionalNestedMessage.hasBb"], @NO);
   2468   XCTAssertEqualObjects(
   2469       [message valueForKeyPath:@"optionalForeignMessage.hasC"], @NO);
   2470   XCTAssertEqualObjects([message valueForKeyPath:@"optionalImportMessage.hasD"],
   2471                         @NO);
   2472 
   2473   XCTAssertEqualObjects([message valueForKeyPath:@"optionalGroup.a"], @0);
   2474   XCTAssertEqualObjects([message valueForKeyPath:@"optionalNestedMessage.bb"],
   2475                         @0);
   2476   XCTAssertEqualObjects([message valueForKeyPath:@"optionalForeignMessage.c"],
   2477                         @0);
   2478   XCTAssertEqualObjects([message valueForKeyPath:@"optionalImportMessage.d"],
   2479                         @0);
   2480 
   2481   // Enums without defaults are set to the first value in the enum.
   2482   XCTAssertEqualObjects([message valueForKey:@"optionalNestedEnum"],
   2483                         @(TestAllTypes_NestedEnum_Foo));
   2484   XCTAssertEqualObjects([message valueForKey:@"optionalForeignEnum"],
   2485                         @(ForeignEnum_ForeignFoo));
   2486   XCTAssertEqualObjects([message valueForKey:@"optionalImportEnum"],
   2487                         @(ImportEnum_ImportFoo));
   2488 
   2489   XCTAssertEqualObjects([message valueForKey:@"optionalStringPiece"], @"");
   2490   XCTAssertEqualObjects([message valueForKey:@"optionalCord"], @"");
   2491 
   2492   // NSArray interface for repeated doesn't have has*, nil means no value.
   2493 
   2494   XCTAssertEqualObjects([message valueForKey:@"hasDefaultInt32"], @NO);
   2495   XCTAssertEqualObjects([message valueForKey:@"hasDefaultInt64"], @NO);
   2496   XCTAssertEqualObjects([message valueForKey:@"hasDefaultUint32"], @NO);
   2497   XCTAssertEqualObjects([message valueForKey:@"hasDefaultUint64"], @NO);
   2498   XCTAssertEqualObjects([message valueForKey:@"hasDefaultSint32"], @NO);
   2499   XCTAssertEqualObjects([message valueForKey:@"hasDefaultSint64"], @NO);
   2500   XCTAssertEqualObjects([message valueForKey:@"hasDefaultFixed32"], @NO);
   2501   XCTAssertEqualObjects([message valueForKey:@"hasDefaultFixed64"], @NO);
   2502   XCTAssertEqualObjects([message valueForKey:@"hasDefaultSfixed32"], @NO);
   2503   XCTAssertEqualObjects([message valueForKey:@"hasDefaultSfixed64"], @NO);
   2504   XCTAssertEqualObjects([message valueForKey:@"hasDefaultFloat"], @NO);
   2505   XCTAssertEqualObjects([message valueForKey:@"hasDefaultDouble"], @NO);
   2506   XCTAssertEqualObjects([message valueForKey:@"hasDefaultBool"], @NO);
   2507   XCTAssertEqualObjects([message valueForKey:@"hasDefaultString"], @NO);
   2508   XCTAssertEqualObjects([message valueForKey:@"hasDefaultBytes"], @NO);
   2509 
   2510   XCTAssertEqualObjects([message valueForKey:@"hasDefaultNestedEnum"], @NO);
   2511   XCTAssertEqualObjects([message valueForKey:@"hasDefaultForeignEnum"], @NO);
   2512   XCTAssertEqualObjects([message valueForKey:@"hasDefaultImportEnum"], @NO);
   2513 
   2514   XCTAssertEqualObjects([message valueForKey:@"hasDefaultStringPiece"], @NO);
   2515   XCTAssertEqualObjects([message valueForKey:@"hasDefaultCord"], @NO);
   2516 
   2517   // Fields with defaults have their default values (duh).
   2518   XCTAssertEqualObjects([message valueForKey:@"defaultInt32"], @41);
   2519   XCTAssertEqualObjects([message valueForKey:@"defaultInt64"], @42);
   2520   XCTAssertEqualObjects([message valueForKey:@"defaultUint32"], @43);
   2521   XCTAssertEqualObjects([message valueForKey:@"defaultUint64"], @44);
   2522   XCTAssertEqualObjects([message valueForKey:@"defaultSint32"], @-45);
   2523   XCTAssertEqualObjects([message valueForKey:@"defaultSint64"], @46);
   2524   XCTAssertEqualObjects([message valueForKey:@"defaultFixed32"], @47);
   2525   XCTAssertEqualObjects([message valueForKey:@"defaultFixed64"], @48);
   2526   XCTAssertEqualObjects([message valueForKey:@"defaultSfixed32"], @49);
   2527   XCTAssertEqualObjects([message valueForKey:@"defaultSfixed64"], @-50);
   2528   XCTAssertEqualObjects([message valueForKey:@"defaultFloat"], @51.5);
   2529   XCTAssertEqualObjects([message valueForKey:@"defaultDouble"], @52e3);
   2530   XCTAssertEqualObjects([message valueForKey:@"defaultBool"], @YES);
   2531   XCTAssertEqualObjects([message valueForKey:@"defaultString"], @"hello");
   2532   XCTAssertEqualObjects([message valueForKey:@"defaultBytes"],
   2533                         [NSData gpbtu_dataWithCString:"world"]);
   2534 
   2535   XCTAssertEqualObjects([message valueForKey:@"defaultNestedEnum"],
   2536                         @(TestAllTypes_NestedEnum_Bar));
   2537   XCTAssertEqualObjects([message valueForKey:@"defaultForeignEnum"],
   2538                         @(ForeignEnum_ForeignBar));
   2539   XCTAssertEqualObjects([message valueForKey:@"defaultImportEnum"],
   2540                         @(ImportEnum_ImportBar));
   2541 
   2542   XCTAssertEqualObjects([message valueForKey:@"defaultStringPiece"], @"abc");
   2543   XCTAssertEqualObjects([message valueForKey:@"defaultCord"], @"123");
   2544 }
   2545 
   2546 @end
   2547