Home | History | Annotate | Download | only in Tests
      1 // Protocol Buffers - Google's data interchange format
      2 // Copyright 2015 Google Inc.  All rights reserved.
      3 // https://developers.google.com/protocol-buffers/
      4 //
      5 // Redistribution and use in source and binary forms, with or without
      6 // modification, are permitted provided that the following conditions are
      7 // met:
      8 //
      9 //     * Redistributions of source code must retain the above copyright
     10 // notice, this list of conditions and the following disclaimer.
     11 //     * Redistributions in binary form must reproduce the above
     12 // copyright notice, this list of conditions and the following disclaimer
     13 // in the documentation and/or other materials provided with the
     14 // distribution.
     15 //     * Neither the name of Google Inc. nor the names of its
     16 // contributors may be used to endorse or promote products derived from
     17 // this software without specific prior written permission.
     18 //
     19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 #import "GPBTestUtilities.h"
     32 
     33 #import <objc/runtime.h>
     34 
     35 #import "GPBMessage.h"
     36 
     37 #import "google/protobuf/MapProto2Unittest.pbobjc.h"
     38 #import "google/protobuf/MapUnittest.pbobjc.h"
     39 #import "google/protobuf/Unittest.pbobjc.h"
     40 #import "google/protobuf/UnittestDropUnknownFields.pbobjc.h"
     41 #import "google/protobuf/UnittestPreserveUnknownEnum.pbobjc.h"
     42 #import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
     43 #import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
     44 
     45 static NSData *DataFromCStr(const char *str) {
     46   return [NSData dataWithBytes:str length:strlen(str)];
     47 }
     48 
     49 @interface MessageSerializationTests : GPBTestCase
     50 @end
     51 
     52 @implementation MessageSerializationTests
     53 
     54 // TODO(thomasvl): Pull tests over from GPBMessageTests that are serialization
     55 // specific.
     56 
     57 - (void)testProto3SerializationHandlingDefaults {
     58   // Proto2 covered in other tests.
     59 
     60   Message3 *msg = [[Message3 alloc] init];
     61 
     62   // Add defaults, no output.
     63 
     64   NSData *data = [msg data];
     65   XCTAssertEqual([data length], 0U);
     66 
     67   // All zeros, still nothing.
     68 
     69   msg.optionalInt32 = 0;
     70   msg.optionalInt64 = 0;
     71   msg.optionalUint32 = 0;
     72   msg.optionalUint64 = 0;
     73   msg.optionalSint32 = 0;
     74   msg.optionalSint64 = 0;
     75   msg.optionalFixed32 = 0;
     76   msg.optionalFixed64 = 0;
     77   msg.optionalSfixed32 = 0;
     78   msg.optionalSfixed64 = 0;
     79   msg.optionalFloat = 0.0f;
     80   msg.optionalDouble = 0.0;
     81   msg.optionalBool = NO;
     82   msg.optionalString = @"";
     83   msg.optionalBytes = [NSData data];
     84   msg.optionalEnum = Message3_Enum_Foo;  // first value
     85 
     86   data = [msg data];
     87   XCTAssertEqual([data length], 0U);
     88 
     89   // The two that also take nil as nothing.
     90 
     91   msg.optionalString = nil;
     92   msg.optionalBytes = nil;
     93 
     94   data = [msg data];
     95   XCTAssertEqual([data length], 0U);
     96 
     97   // Set one field...
     98 
     99   msg.optionalInt32 = 1;
    100 
    101   data = [msg data];
    102   const uint8_t expectedBytes[] = {0x08, 0x01};
    103   NSData *expected = [NSData dataWithBytes:expectedBytes length:2];
    104   XCTAssertEqualObjects(data, expected);
    105 
    106   // Back to zero...
    107 
    108   msg.optionalInt32 = 0;
    109 
    110   data = [msg data];
    111   XCTAssertEqual([data length], 0U);
    112 
    113   [msg release];
    114 }
    115 
    116 - (void)testProto3DroppingUnknownFields {
    117   DropUnknownsFooWithExtraFields *fooWithExtras =
    118       [[DropUnknownsFooWithExtraFields alloc] init];
    119 
    120   fooWithExtras.int32Value = 1;
    121   fooWithExtras.enumValue = DropUnknownsFooWithExtraFields_NestedEnum_Baz;
    122   fooWithExtras.extraInt32Value = 2;
    123 
    124   NSData *data = [fooWithExtras data];
    125   XCTAssertNotNil(data);
    126   DropUnknownsFoo *foo = [DropUnknownsFoo parseFromData:data error:NULL];
    127 
    128   XCTAssertEqual(foo.int32Value, 1);
    129   XCTAssertEqual(foo.enumValue, DropUnknownsFoo_NestedEnum_Baz);
    130   // Nothing should end up in the unknowns.
    131   XCTAssertEqual([foo.unknownFields countOfFields], 0U);
    132 
    133   [fooWithExtras release];
    134   data = [foo data];
    135   fooWithExtras =
    136       [DropUnknownsFooWithExtraFields parseFromData:data error:NULL];
    137   XCTAssertEqual(fooWithExtras.int32Value, 1);
    138   XCTAssertEqual(fooWithExtras.enumValue,
    139                  DropUnknownsFooWithExtraFields_NestedEnum_Baz);
    140   // And the extra value is gone (back to the default).
    141   XCTAssertEqual(fooWithExtras.extraInt32Value, 0);
    142   XCTAssertEqual([foo.unknownFields countOfFields], 0U);
    143 }
    144 
    145 - (void)testProto2UnknownEnumToUnknownField {
    146   Message3 *orig = [[Message3 alloc] init];
    147 
    148   orig.optionalEnum = Message3_Enum_Extra3;
    149   orig.repeatedEnumArray =
    150       [GPBEnumArray arrayWithValidationFunction:Message3_Enum_IsValidValue
    151                                        rawValue:Message3_Enum_Extra3];
    152   orig.oneofEnum = Message3_Enum_Extra3;
    153 
    154   NSData *data = [orig data];
    155   XCTAssertNotNil(data);
    156   Message2 *msg = [[Message2 alloc] initWithData:data error:NULL];
    157 
    158   // None of the fields should be set.
    159 
    160   XCTAssertFalse(msg.hasOptionalEnum);
    161   XCTAssertEqual(msg.repeatedEnumArray.count, 0U);
    162   XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
    163 
    164   // All the values should be in unknown fields.
    165 
    166   GPBUnknownFieldSet *unknownFields = msg.unknownFields;
    167 
    168   XCTAssertEqual([unknownFields countOfFields], 3U);
    169   XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OptionalEnum]);
    170   XCTAssertTrue(
    171       [unknownFields hasField:Message2_FieldNumber_RepeatedEnumArray]);
    172   XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OneofEnum]);
    173 
    174   GPBUnknownField *field =
    175       [unknownFields getField:Message2_FieldNumber_OptionalEnum];
    176   XCTAssertEqual(field.varintList.count, 1U);
    177   XCTAssertEqual([field.varintList valueAtIndex:0],
    178                  (uint64_t)Message3_Enum_Extra3);
    179 
    180   field = [unknownFields getField:Message2_FieldNumber_RepeatedEnumArray];
    181   XCTAssertEqual(field.varintList.count, 1U);
    182   XCTAssertEqual([field.varintList valueAtIndex:0], (uint64_t)Message3_Enum_Extra3);
    183 
    184   field = [unknownFields getField:Message2_FieldNumber_OneofEnum];
    185   XCTAssertEqual(field.varintList.count, 1U);
    186   XCTAssertEqual([field.varintList valueAtIndex:0],
    187                  (uint64_t)Message3_Enum_Extra3);
    188 
    189   [msg release];
    190   [orig release];
    191 }
    192 
    193 - (void)testProto3UnknownEnumPreserving {
    194   UnknownEnumsMyMessagePlusExtra *orig =
    195       [UnknownEnumsMyMessagePlusExtra message];
    196 
    197   orig.e = UnknownEnumsMyEnumPlusExtra_EExtra;
    198   orig.repeatedEArray = [GPBEnumArray
    199       arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
    200                          rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
    201   orig.repeatedPackedEArray = [GPBEnumArray
    202       arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
    203                          rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
    204   orig.oneofE1 = UnknownEnumsMyEnumPlusExtra_EExtra;
    205 
    206   // Everything should be there via raw values.
    207 
    208   NSData *data = [orig data];
    209   XCTAssertNotNil(data);
    210   UnknownEnumsMyMessage *msg =
    211       [UnknownEnumsMyMessage parseFromData:data error:NULL];
    212 
    213   XCTAssertEqual(msg.e, UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
    214   XCTAssertEqual(UnknownEnumsMyMessage_E_RawValue(msg),
    215                  UnknownEnumsMyEnumPlusExtra_EExtra);
    216   XCTAssertEqual(msg.repeatedEArray.count, 1U);
    217   XCTAssertEqual([msg.repeatedEArray valueAtIndex:0],
    218                  UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
    219   XCTAssertEqual([msg.repeatedEArray rawValueAtIndex:0],
    220                  (UnknownEnumsMyEnum)UnknownEnumsMyEnumPlusExtra_EExtra);
    221   XCTAssertEqual(msg.repeatedPackedEArray.count, 1U);
    222   XCTAssertEqual([msg.repeatedPackedEArray valueAtIndex:0],
    223                  UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
    224   XCTAssertEqual([msg.repeatedPackedEArray rawValueAtIndex:0],
    225                  (UnknownEnumsMyEnum)UnknownEnumsMyEnumPlusExtra_EExtra);
    226   XCTAssertEqual(msg.oneofE1,
    227                  UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
    228   XCTAssertEqual(UnknownEnumsMyMessage_OneofE1_RawValue(msg),
    229                  UnknownEnumsMyEnumPlusExtra_EExtra);
    230 
    231   // Everything should go out and come back.
    232 
    233   data = [msg data];
    234   orig = [UnknownEnumsMyMessagePlusExtra parseFromData:data error:NULL];
    235 
    236   XCTAssertEqual(orig.e, UnknownEnumsMyEnumPlusExtra_EExtra);
    237   XCTAssertEqual(orig.repeatedEArray.count, 1U);
    238   XCTAssertEqual([orig.repeatedEArray valueAtIndex:0],
    239                  UnknownEnumsMyEnumPlusExtra_EExtra);
    240   XCTAssertEqual(orig.repeatedPackedEArray.count, 1U);
    241   XCTAssertEqual([orig.repeatedPackedEArray valueAtIndex:0],
    242                  UnknownEnumsMyEnumPlusExtra_EExtra);
    243   XCTAssertEqual(orig.oneofE1, UnknownEnumsMyEnumPlusExtra_EExtra);
    244 }
    245 
    246 //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF(MESSAGE, FIELD, VALUE)
    247 //%TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, )
    248 //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, EQ_SUFFIX)
    249 //%  {  // oneof##FIELD
    250 //%    MESSAGE *orig = [[MESSAGE alloc] init];
    251 //%    orig.oneof##FIELD = VALUE;
    252 //%    XCTAssertEqual(orig.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD);
    253 //%    NSData *data = [orig data];
    254 //%    XCTAssertNotNil(data);
    255 //%    MESSAGE *msg = [MESSAGE parseFromData:data error:NULL];
    256 //%    XCTAssertEqual(msg.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD);
    257 //%    XCTAssertEqual##EQ_SUFFIX(msg.oneof##FIELD, VALUE);
    258 //%    [orig release];
    259 //%  }
    260 //%
    261 //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOFS(SYNTAX, BOOL_NON_DEFAULT)
    262 //%- (void)testProto##SYNTAX##RoundTripOneof {
    263 //%
    264 //%GROUP_INIT##SYNTAX()  Message##SYNTAX *subMessage = [[Message##SYNTAX alloc] init];
    265 //%  XCTAssertNotNil(subMessage);
    266 //%  subMessage.optionalInt32 = 666;
    267 //%
    268 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Int32, 1)
    269 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Int64, 2)
    270 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Uint32, 3U)
    271 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Uint64, 4U)
    272 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sint32, 5)
    273 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sint64, 6)
    274 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Fixed32, 7U)
    275 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Fixed64, 8U)
    276 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sfixed32, 9)
    277 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sfixed64, 10)
    278 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Float, 11.0f)
    279 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Double, 12.0)
    280 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Bool, BOOL_NON_DEFAULT)
    281 //%TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, String, @"foo", Objects)
    282 //%TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, Bytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding], Objects)
    283 //%GROUP_TEST##SYNTAX()TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, Message, subMessage, Objects)
    284 //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Enum, Message2_Enum_Bar)
    285 //%GROUP_CLEANUP##SYNTAX()  [subMessage release];
    286 //%}
    287 //%
    288 //%PDDM-DEFINE GROUP_INIT2()
    289 //%  Message2_OneofGroup *group = [[Message2_OneofGroup alloc] init];
    290 //%  XCTAssertNotNil(group);
    291 //%  group.a = 777;
    292 //%
    293 //%PDDM-DEFINE GROUP_CLEANUP2()
    294 //%  [group release];
    295 //%
    296 //%PDDM-DEFINE GROUP_TEST2()
    297 //%TEST_ROUNDTRIP_ONEOF_ADV(Message2, Group, group, Objects)
    298 //%
    299 //%PDDM-DEFINE GROUP_INIT3()
    300 // Empty
    301 //%PDDM-DEFINE GROUP_CLEANUP3()
    302 // Empty
    303 //%PDDM-DEFINE GROUP_TEST3()
    304 //%  // Not "group" in proto3.
    305 //%
    306 //%
    307 //%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(2, NO)
    308 // This block of code is generated, do not edit it directly.
    309 
    310 - (void)testProto2RoundTripOneof {
    311 
    312   Message2_OneofGroup *group = [[Message2_OneofGroup alloc] init];
    313   XCTAssertNotNil(group);
    314   group.a = 777;
    315   Message2 *subMessage = [[Message2 alloc] init];
    316   XCTAssertNotNil(subMessage);
    317   subMessage.optionalInt32 = 666;
    318 
    319   {  // oneofInt32
    320     Message2 *orig = [[Message2 alloc] init];
    321     orig.oneofInt32 = 1;
    322     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
    323     NSData *data = [orig data];
    324     XCTAssertNotNil(data);
    325     Message2 *msg = [Message2 parseFromData:data error:NULL];
    326     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
    327     XCTAssertEqual(msg.oneofInt32, 1);
    328     [orig release];
    329   }
    330 
    331   {  // oneofInt64
    332     Message2 *orig = [[Message2 alloc] init];
    333     orig.oneofInt64 = 2;
    334     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
    335     NSData *data = [orig data];
    336     XCTAssertNotNil(data);
    337     Message2 *msg = [Message2 parseFromData:data error:NULL];
    338     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
    339     XCTAssertEqual(msg.oneofInt64, 2);
    340     [orig release];
    341   }
    342 
    343   {  // oneofUint32
    344     Message2 *orig = [[Message2 alloc] init];
    345     orig.oneofUint32 = 3U;
    346     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
    347     NSData *data = [orig data];
    348     XCTAssertNotNil(data);
    349     Message2 *msg = [Message2 parseFromData:data error:NULL];
    350     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
    351     XCTAssertEqual(msg.oneofUint32, 3U);
    352     [orig release];
    353   }
    354 
    355   {  // oneofUint64
    356     Message2 *orig = [[Message2 alloc] init];
    357     orig.oneofUint64 = 4U;
    358     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
    359     NSData *data = [orig data];
    360     XCTAssertNotNil(data);
    361     Message2 *msg = [Message2 parseFromData:data error:NULL];
    362     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
    363     XCTAssertEqual(msg.oneofUint64, 4U);
    364     [orig release];
    365   }
    366 
    367   {  // oneofSint32
    368     Message2 *orig = [[Message2 alloc] init];
    369     orig.oneofSint32 = 5;
    370     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
    371     NSData *data = [orig data];
    372     XCTAssertNotNil(data);
    373     Message2 *msg = [Message2 parseFromData:data error:NULL];
    374     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
    375     XCTAssertEqual(msg.oneofSint32, 5);
    376     [orig release];
    377   }
    378 
    379   {  // oneofSint64
    380     Message2 *orig = [[Message2 alloc] init];
    381     orig.oneofSint64 = 6;
    382     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
    383     NSData *data = [orig data];
    384     XCTAssertNotNil(data);
    385     Message2 *msg = [Message2 parseFromData:data error:NULL];
    386     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
    387     XCTAssertEqual(msg.oneofSint64, 6);
    388     [orig release];
    389   }
    390 
    391   {  // oneofFixed32
    392     Message2 *orig = [[Message2 alloc] init];
    393     orig.oneofFixed32 = 7U;
    394     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
    395     NSData *data = [orig data];
    396     XCTAssertNotNil(data);
    397     Message2 *msg = [Message2 parseFromData:data error:NULL];
    398     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
    399     XCTAssertEqual(msg.oneofFixed32, 7U);
    400     [orig release];
    401   }
    402 
    403   {  // oneofFixed64
    404     Message2 *orig = [[Message2 alloc] init];
    405     orig.oneofFixed64 = 8U;
    406     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
    407     NSData *data = [orig data];
    408     XCTAssertNotNil(data);
    409     Message2 *msg = [Message2 parseFromData:data error:NULL];
    410     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
    411     XCTAssertEqual(msg.oneofFixed64, 8U);
    412     [orig release];
    413   }
    414 
    415   {  // oneofSfixed32
    416     Message2 *orig = [[Message2 alloc] init];
    417     orig.oneofSfixed32 = 9;
    418     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
    419     NSData *data = [orig data];
    420     XCTAssertNotNil(data);
    421     Message2 *msg = [Message2 parseFromData:data error:NULL];
    422     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
    423     XCTAssertEqual(msg.oneofSfixed32, 9);
    424     [orig release];
    425   }
    426 
    427   {  // oneofSfixed64
    428     Message2 *orig = [[Message2 alloc] init];
    429     orig.oneofSfixed64 = 10;
    430     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
    431     NSData *data = [orig data];
    432     XCTAssertNotNil(data);
    433     Message2 *msg = [Message2 parseFromData:data error:NULL];
    434     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
    435     XCTAssertEqual(msg.oneofSfixed64, 10);
    436     [orig release];
    437   }
    438 
    439   {  // oneofFloat
    440     Message2 *orig = [[Message2 alloc] init];
    441     orig.oneofFloat = 11.0f;
    442     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
    443     NSData *data = [orig data];
    444     XCTAssertNotNil(data);
    445     Message2 *msg = [Message2 parseFromData:data error:NULL];
    446     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
    447     XCTAssertEqual(msg.oneofFloat, 11.0f);
    448     [orig release];
    449   }
    450 
    451   {  // oneofDouble
    452     Message2 *orig = [[Message2 alloc] init];
    453     orig.oneofDouble = 12.0;
    454     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
    455     NSData *data = [orig data];
    456     XCTAssertNotNil(data);
    457     Message2 *msg = [Message2 parseFromData:data error:NULL];
    458     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
    459     XCTAssertEqual(msg.oneofDouble, 12.0);
    460     [orig release];
    461   }
    462 
    463   {  // oneofBool
    464     Message2 *orig = [[Message2 alloc] init];
    465     orig.oneofBool = NO;
    466     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBool);
    467     NSData *data = [orig data];
    468     XCTAssertNotNil(data);
    469     Message2 *msg = [Message2 parseFromData:data error:NULL];
    470     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBool);
    471     XCTAssertEqual(msg.oneofBool, NO);
    472     [orig release];
    473   }
    474 
    475   {  // oneofString
    476     Message2 *orig = [[Message2 alloc] init];
    477     orig.oneofString = @"foo";
    478     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofString);
    479     NSData *data = [orig data];
    480     XCTAssertNotNil(data);
    481     Message2 *msg = [Message2 parseFromData:data error:NULL];
    482     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofString);
    483     XCTAssertEqualObjects(msg.oneofString, @"foo");
    484     [orig release];
    485   }
    486 
    487   {  // oneofBytes
    488     Message2 *orig = [[Message2 alloc] init];
    489     orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
    490     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
    491     NSData *data = [orig data];
    492     XCTAssertNotNil(data);
    493     Message2 *msg = [Message2 parseFromData:data error:NULL];
    494     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
    495     XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
    496     [orig release];
    497   }
    498 
    499   {  // oneofGroup
    500     Message2 *orig = [[Message2 alloc] init];
    501     orig.oneofGroup = group;
    502     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
    503     NSData *data = [orig data];
    504     XCTAssertNotNil(data);
    505     Message2 *msg = [Message2 parseFromData:data error:NULL];
    506     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
    507     XCTAssertEqualObjects(msg.oneofGroup, group);
    508     [orig release];
    509   }
    510 
    511   {  // oneofMessage
    512     Message2 *orig = [[Message2 alloc] init];
    513     orig.oneofMessage = subMessage;
    514     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
    515     NSData *data = [orig data];
    516     XCTAssertNotNil(data);
    517     Message2 *msg = [Message2 parseFromData:data error:NULL];
    518     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
    519     XCTAssertEqualObjects(msg.oneofMessage, subMessage);
    520     [orig release];
    521   }
    522 
    523   {  // oneofEnum
    524     Message2 *orig = [[Message2 alloc] init];
    525     orig.oneofEnum = Message2_Enum_Bar;
    526     XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
    527     NSData *data = [orig data];
    528     XCTAssertNotNil(data);
    529     Message2 *msg = [Message2 parseFromData:data error:NULL];
    530     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
    531     XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar);
    532     [orig release];
    533   }
    534 
    535   [group release];
    536   [subMessage release];
    537 }
    538 
    539 //%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(3, YES)
    540 // This block of code is generated, do not edit it directly.
    541 
    542 - (void)testProto3RoundTripOneof {
    543 
    544   Message3 *subMessage = [[Message3 alloc] init];
    545   XCTAssertNotNil(subMessage);
    546   subMessage.optionalInt32 = 666;
    547 
    548   {  // oneofInt32
    549     Message3 *orig = [[Message3 alloc] init];
    550     orig.oneofInt32 = 1;
    551     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
    552     NSData *data = [orig data];
    553     XCTAssertNotNil(data);
    554     Message3 *msg = [Message3 parseFromData:data error:NULL];
    555     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
    556     XCTAssertEqual(msg.oneofInt32, 1);
    557     [orig release];
    558   }
    559 
    560   {  // oneofInt64
    561     Message3 *orig = [[Message3 alloc] init];
    562     orig.oneofInt64 = 2;
    563     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
    564     NSData *data = [orig data];
    565     XCTAssertNotNil(data);
    566     Message3 *msg = [Message3 parseFromData:data error:NULL];
    567     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
    568     XCTAssertEqual(msg.oneofInt64, 2);
    569     [orig release];
    570   }
    571 
    572   {  // oneofUint32
    573     Message3 *orig = [[Message3 alloc] init];
    574     orig.oneofUint32 = 3U;
    575     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
    576     NSData *data = [orig data];
    577     XCTAssertNotNil(data);
    578     Message3 *msg = [Message3 parseFromData:data error:NULL];
    579     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
    580     XCTAssertEqual(msg.oneofUint32, 3U);
    581     [orig release];
    582   }
    583 
    584   {  // oneofUint64
    585     Message3 *orig = [[Message3 alloc] init];
    586     orig.oneofUint64 = 4U;
    587     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
    588     NSData *data = [orig data];
    589     XCTAssertNotNil(data);
    590     Message3 *msg = [Message3 parseFromData:data error:NULL];
    591     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
    592     XCTAssertEqual(msg.oneofUint64, 4U);
    593     [orig release];
    594   }
    595 
    596   {  // oneofSint32
    597     Message3 *orig = [[Message3 alloc] init];
    598     orig.oneofSint32 = 5;
    599     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
    600     NSData *data = [orig data];
    601     XCTAssertNotNil(data);
    602     Message3 *msg = [Message3 parseFromData:data error:NULL];
    603     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
    604     XCTAssertEqual(msg.oneofSint32, 5);
    605     [orig release];
    606   }
    607 
    608   {  // oneofSint64
    609     Message3 *orig = [[Message3 alloc] init];
    610     orig.oneofSint64 = 6;
    611     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
    612     NSData *data = [orig data];
    613     XCTAssertNotNil(data);
    614     Message3 *msg = [Message3 parseFromData:data error:NULL];
    615     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
    616     XCTAssertEqual(msg.oneofSint64, 6);
    617     [orig release];
    618   }
    619 
    620   {  // oneofFixed32
    621     Message3 *orig = [[Message3 alloc] init];
    622     orig.oneofFixed32 = 7U;
    623     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
    624     NSData *data = [orig data];
    625     XCTAssertNotNil(data);
    626     Message3 *msg = [Message3 parseFromData:data error:NULL];
    627     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
    628     XCTAssertEqual(msg.oneofFixed32, 7U);
    629     [orig release];
    630   }
    631 
    632   {  // oneofFixed64
    633     Message3 *orig = [[Message3 alloc] init];
    634     orig.oneofFixed64 = 8U;
    635     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
    636     NSData *data = [orig data];
    637     XCTAssertNotNil(data);
    638     Message3 *msg = [Message3 parseFromData:data error:NULL];
    639     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
    640     XCTAssertEqual(msg.oneofFixed64, 8U);
    641     [orig release];
    642   }
    643 
    644   {  // oneofSfixed32
    645     Message3 *orig = [[Message3 alloc] init];
    646     orig.oneofSfixed32 = 9;
    647     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
    648     NSData *data = [orig data];
    649     XCTAssertNotNil(data);
    650     Message3 *msg = [Message3 parseFromData:data error:NULL];
    651     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
    652     XCTAssertEqual(msg.oneofSfixed32, 9);
    653     [orig release];
    654   }
    655 
    656   {  // oneofSfixed64
    657     Message3 *orig = [[Message3 alloc] init];
    658     orig.oneofSfixed64 = 10;
    659     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
    660     NSData *data = [orig data];
    661     XCTAssertNotNil(data);
    662     Message3 *msg = [Message3 parseFromData:data error:NULL];
    663     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
    664     XCTAssertEqual(msg.oneofSfixed64, 10);
    665     [orig release];
    666   }
    667 
    668   {  // oneofFloat
    669     Message3 *orig = [[Message3 alloc] init];
    670     orig.oneofFloat = 11.0f;
    671     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
    672     NSData *data = [orig data];
    673     XCTAssertNotNil(data);
    674     Message3 *msg = [Message3 parseFromData:data error:NULL];
    675     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
    676     XCTAssertEqual(msg.oneofFloat, 11.0f);
    677     [orig release];
    678   }
    679 
    680   {  // oneofDouble
    681     Message3 *orig = [[Message3 alloc] init];
    682     orig.oneofDouble = 12.0;
    683     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
    684     NSData *data = [orig data];
    685     XCTAssertNotNil(data);
    686     Message3 *msg = [Message3 parseFromData:data error:NULL];
    687     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
    688     XCTAssertEqual(msg.oneofDouble, 12.0);
    689     [orig release];
    690   }
    691 
    692   {  // oneofBool
    693     Message3 *orig = [[Message3 alloc] init];
    694     orig.oneofBool = YES;
    695     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBool);
    696     NSData *data = [orig data];
    697     XCTAssertNotNil(data);
    698     Message3 *msg = [Message3 parseFromData:data error:NULL];
    699     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBool);
    700     XCTAssertEqual(msg.oneofBool, YES);
    701     [orig release];
    702   }
    703 
    704   {  // oneofString
    705     Message3 *orig = [[Message3 alloc] init];
    706     orig.oneofString = @"foo";
    707     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofString);
    708     NSData *data = [orig data];
    709     XCTAssertNotNil(data);
    710     Message3 *msg = [Message3 parseFromData:data error:NULL];
    711     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofString);
    712     XCTAssertEqualObjects(msg.oneofString, @"foo");
    713     [orig release];
    714   }
    715 
    716   {  // oneofBytes
    717     Message3 *orig = [[Message3 alloc] init];
    718     orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
    719     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
    720     NSData *data = [orig data];
    721     XCTAssertNotNil(data);
    722     Message3 *msg = [Message3 parseFromData:data error:NULL];
    723     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
    724     XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
    725     [orig release];
    726   }
    727 
    728   // Not "group" in proto3.
    729 
    730   {  // oneofMessage
    731     Message3 *orig = [[Message3 alloc] init];
    732     orig.oneofMessage = subMessage;
    733     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
    734     NSData *data = [orig data];
    735     XCTAssertNotNil(data);
    736     Message3 *msg = [Message3 parseFromData:data error:NULL];
    737     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
    738     XCTAssertEqualObjects(msg.oneofMessage, subMessage);
    739     [orig release];
    740   }
    741 
    742   {  // oneofEnum
    743     Message3 *orig = [[Message3 alloc] init];
    744     orig.oneofEnum = Message2_Enum_Bar;
    745     XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
    746     NSData *data = [orig data];
    747     XCTAssertNotNil(data);
    748     Message3 *msg = [Message3 parseFromData:data error:NULL];
    749     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
    750     XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar);
    751     [orig release];
    752   }
    753 
    754   [subMessage release];
    755 }
    756 
    757 //%PDDM-EXPAND-END (2 expansions)
    758 
    759 - (void)testPackedUnpackedMessageParsing {
    760   // packed is optional, a repeated field should parse when packed or unpacked.
    761 
    762   TestPackedTypes *packedOrig = [TestPackedTypes message];
    763   TestUnpackedTypes *unpackedOrig = [TestUnpackedTypes message];
    764   [self setPackedFields:packedOrig repeatedCount:4];
    765   [self setUnpackedFields:unpackedOrig repeatedCount:4];
    766 
    767   NSData *packedData = [packedOrig data];
    768   NSData *unpackedData = [unpackedOrig data];
    769   XCTAssertNotNil(packedData);
    770   XCTAssertNotNil(unpackedData);
    771   XCTAssertNotEqualObjects(packedData, unpackedData,
    772                            @"Data should differ (packed vs unpacked) use");
    773 
    774   NSError *error = nil;
    775   TestPackedTypes *packedParse =
    776       [TestPackedTypes parseFromData:unpackedData error:&error];
    777   XCTAssertNotNil(packedParse);
    778   XCTAssertNil(error);
    779   XCTAssertEqualObjects(packedParse, packedOrig);
    780 
    781   error = nil;
    782   TestUnpackedTypes *unpackedParsed =
    783       [TestUnpackedTypes parseFromData:packedData error:&error];
    784   XCTAssertNotNil(unpackedParsed);
    785   XCTAssertNil(error);
    786   XCTAssertEqualObjects(unpackedParsed, unpackedOrig);
    787 }
    788 
    789 - (void)testPackedUnpackedExtensionParsing {
    790   // packed is optional, a repeated extension should parse when packed or
    791   // unpacked.
    792 
    793   TestPackedExtensions *packedOrig = [TestPackedExtensions message];
    794   TestUnpackedExtensions *unpackedOrig = [TestUnpackedExtensions message];
    795   [self setPackedExtensions:packedOrig repeatedCount:kGPBDefaultRepeatCount];
    796   [self setUnpackedExtensions:unpackedOrig repeatedCount:kGPBDefaultRepeatCount];
    797 
    798   NSData *packedData = [packedOrig data];
    799   NSData *unpackedData = [unpackedOrig data];
    800   XCTAssertNotNil(packedData);
    801   XCTAssertNotNil(unpackedData);
    802   XCTAssertNotEqualObjects(packedData, unpackedData,
    803                            @"Data should differ (packed vs unpacked) use");
    804 
    805   NSError *error = nil;
    806   TestPackedExtensions *packedParse =
    807       [TestPackedExtensions parseFromData:unpackedData
    808                         extensionRegistry:[UnittestRoot extensionRegistry]
    809                                     error:&error];
    810   XCTAssertNotNil(packedParse);
    811   XCTAssertNil(error);
    812   XCTAssertEqualObjects(packedParse, packedOrig);
    813 
    814   error = nil;
    815   TestUnpackedExtensions *unpackedParsed =
    816       [TestUnpackedExtensions parseFromData:packedData
    817                           extensionRegistry:[UnittestRoot extensionRegistry]
    818                                       error:&error];
    819   XCTAssertNotNil(unpackedParsed);
    820   XCTAssertNil(error);
    821   XCTAssertEqualObjects(unpackedParsed, unpackedOrig);
    822 }
    823 
    824 - (void)testPackedExtensionVsFieldParsing {
    825   // Extensions and fields end up on the wire the same way, so they can parse
    826   // each other.
    827 
    828   TestPackedTypes *fieldsOrig = [TestPackedTypes message];
    829   TestPackedExtensions *extsOrig = [TestPackedExtensions message];
    830   [self setPackedFields:fieldsOrig repeatedCount:kGPBDefaultRepeatCount];
    831   [self setPackedExtensions:extsOrig repeatedCount:kGPBDefaultRepeatCount];
    832 
    833   NSData *fieldsData = [fieldsOrig data];
    834   NSData *extsData = [extsOrig data];
    835   XCTAssertNotNil(fieldsData);
    836   XCTAssertNotNil(extsData);
    837   XCTAssertEqualObjects(fieldsData, extsData);
    838 
    839   NSError *error = nil;
    840   TestPackedTypes *fieldsParse =
    841       [TestPackedTypes parseFromData:extsData error:&error];
    842   XCTAssertNotNil(fieldsParse);
    843   XCTAssertNil(error);
    844   XCTAssertEqualObjects(fieldsParse, fieldsOrig);
    845 
    846   error = nil;
    847   TestPackedExtensions *extsParse =
    848       [TestPackedExtensions parseFromData:fieldsData
    849                         extensionRegistry:[UnittestRoot extensionRegistry]
    850                                     error:&error];
    851   XCTAssertNotNil(extsParse);
    852   XCTAssertNil(error);
    853   XCTAssertEqualObjects(extsParse, extsOrig);
    854 }
    855 
    856 - (void)testUnpackedExtensionVsFieldParsing {
    857   // Extensions and fields end up on the wire the same way, so they can parse
    858   // each other.
    859 
    860   TestUnpackedTypes *fieldsOrig = [TestUnpackedTypes message];
    861   TestUnpackedExtensions *extsOrig = [TestUnpackedExtensions message];
    862   [self setUnpackedFields:fieldsOrig repeatedCount:3];
    863   [self setUnpackedExtensions:extsOrig repeatedCount:3];
    864 
    865   NSData *fieldsData = [fieldsOrig data];
    866   NSData *extsData = [extsOrig data];
    867   XCTAssertNotNil(fieldsData);
    868   XCTAssertNotNil(extsData);
    869   XCTAssertEqualObjects(fieldsData, extsData);
    870 
    871   TestUnpackedTypes *fieldsParse =
    872       [TestUnpackedTypes parseFromData:extsData error:NULL];
    873   XCTAssertNotNil(fieldsParse);
    874   XCTAssertEqualObjects(fieldsParse, fieldsOrig);
    875 
    876   TestUnpackedExtensions *extsParse =
    877       [TestUnpackedExtensions parseFromData:fieldsData
    878                           extensionRegistry:[UnittestRoot extensionRegistry]
    879                                       error:NULL];
    880   XCTAssertNotNil(extsParse);
    881   XCTAssertEqualObjects(extsParse, extsOrig);
    882 }
    883 
    884 #pragma mark - Subset from from map_tests.cc
    885 
    886 // TEST(GeneratedMapFieldTest, StandardWireFormat)
    887 - (void)testMap_StandardWireFormat {
    888   NSData *data = DataFromCStr("\x0A\x04\x08\x01\x10\x01");
    889 
    890   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
    891   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
    892   int32_t val = 666;
    893   XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
    894   XCTAssertEqual(val, 1);
    895 
    896   [msg release];
    897 }
    898 
    899 // TEST(GeneratedMapFieldTest, UnorderedWireFormat)
    900 - (void)testMap_UnorderedWireFormat {
    901   // put value before key in wire format
    902   NSData *data = DataFromCStr("\x0A\x04\x10\x01\x08\x02");
    903 
    904   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
    905   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
    906   int32_t val = 666;
    907   XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
    908   XCTAssertEqual(val, 1);
    909 
    910   [msg release];
    911 }
    912 
    913 // TEST(GeneratedMapFieldTest, DuplicatedKeyWireFormat)
    914 - (void)testMap_DuplicatedKeyWireFormat {
    915   // Two key fields in wire format
    916   NSData *data = DataFromCStr("\x0A\x06\x08\x01\x08\x02\x10\x01");
    917 
    918   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
    919   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
    920   int32_t val = 666;
    921   XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
    922   XCTAssertEqual(val, 1);
    923 
    924   [msg release];
    925 }
    926 
    927 // TEST(GeneratedMapFieldTest, DuplicatedValueWireFormat)
    928 - (void)testMap_DuplicatedValueWireFormat {
    929   // Two value fields in wire format
    930   NSData *data = DataFromCStr("\x0A\x06\x08\x01\x10\x01\x10\x02");
    931 
    932   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
    933   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
    934   int32_t val = 666;
    935   XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
    936   XCTAssertEqual(val, 2);
    937 
    938   [msg release];
    939 }
    940 
    941 // TEST(GeneratedMapFieldTest, MissedKeyWireFormat)
    942 - (void)testMap_MissedKeyWireFormat {
    943   // No key field in wire format
    944   NSData *data = DataFromCStr("\x0A\x02\x10\x01");
    945 
    946   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
    947   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
    948   int32_t val = 666;
    949   XCTAssertTrue([msg.mapInt32Int32 valueForKey:0 value:&val]);
    950   XCTAssertEqual(val, 1);
    951 
    952   [msg release];
    953 }
    954 
    955 // TEST(GeneratedMapFieldTest, MissedValueWireFormat)
    956 - (void)testMap_MissedValueWireFormat {
    957   // No value field in wire format
    958   NSData *data = DataFromCStr("\x0A\x02\x08\x01");
    959 
    960   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
    961   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
    962   int32_t val = 666;
    963   XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
    964   XCTAssertEqual(val, 0);
    965 
    966   [msg release];
    967 }
    968 
    969 // TEST(GeneratedMapFieldTest, UnknownFieldWireFormat)
    970 - (void)testMap_UnknownFieldWireFormat {
    971   // Unknown field in wire format
    972   NSData *data = DataFromCStr("\x0A\x06\x08\x02\x10\x03\x18\x01");
    973 
    974   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
    975   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
    976   int32_t val = 666;
    977   XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
    978   XCTAssertEqual(val, 3);
    979 
    980   [msg release];
    981 }
    982 
    983 // TEST(GeneratedMapFieldTest, CorruptedWireFormat)
    984 - (void)testMap_CorruptedWireFormat {
    985   // corrupted data in wire format
    986   NSData *data = DataFromCStr("\x0A\x06\x08\x02\x11\x03");
    987 
    988   NSError *error = nil;
    989   TestMap *msg = [TestMap parseFromData:data error:&error];
    990   XCTAssertNil(msg);
    991   XCTAssertNotNil(error);
    992   XCTAssertEqualObjects(error.domain, GPBMessageErrorDomain);
    993   XCTAssertEqual(error.code, GPBMessageErrorCodeMalformedData);
    994 }
    995 
    996 // TEST(GeneratedMapFieldTest, Proto2UnknownEnum)
    997 - (void)testMap_Proto2UnknownEnum {
    998   TestEnumMapPlusExtra *orig = [[TestEnumMapPlusExtra alloc] init];
    999 
   1000   orig.knownMapField = [GPBInt32EnumDictionary
   1001       dictionaryWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue];
   1002   orig.unknownMapField = [GPBInt32EnumDictionary
   1003       dictionaryWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue];
   1004   [orig.knownMapField setValue:Proto2MapEnumPlusExtra_EProto2MapEnumFoo
   1005                         forKey:0];
   1006   [orig.unknownMapField setValue:Proto2MapEnumPlusExtra_EProto2MapEnumExtra
   1007                           forKey:0];
   1008 
   1009   NSData *data = [orig data];
   1010   XCTAssertNotNil(data);
   1011   TestEnumMap *msg1 = [TestEnumMap parseFromData:data error:NULL];
   1012   XCTAssertEqual(msg1.knownMapField.count, 1U);
   1013   int32_t val = -1;
   1014   XCTAssertTrue([msg1.knownMapField valueForKey:0 value:&val]);
   1015   XCTAssertEqual(val, Proto2MapEnum_Proto2MapEnumFoo);
   1016   XCTAssertEqual(msg1.unknownFields.countOfFields, 1U);
   1017 
   1018   data = [msg1 data];
   1019   TestEnumMapPlusExtra *msg2 =
   1020       [TestEnumMapPlusExtra parseFromData:data error:NULL];
   1021   val = -1;
   1022   XCTAssertEqual(msg2.knownMapField.count, 1U);
   1023   XCTAssertTrue([msg2.knownMapField valueForKey:0 value:&val]);
   1024   XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumFoo);
   1025   val = -1;
   1026   XCTAssertEqual(msg2.unknownMapField.count, 1U);
   1027   XCTAssertTrue([msg2.unknownMapField valueForKey:0 value:&val]);
   1028   XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumExtra);
   1029   XCTAssertEqual(msg2.unknownFields.countOfFields, 0U);
   1030 
   1031   XCTAssertEqualObjects(orig, msg2);
   1032 
   1033   [orig release];
   1034 }
   1035 
   1036 #pragma mark - Map Round Tripping
   1037 
   1038 - (void)testProto2MapRoundTripping {
   1039   Message2 *msg = [[Message2 alloc] init];
   1040 
   1041   // Key/Value data should result in different byte lengths on wire to ensure
   1042   // everything is right.
   1043   [msg.mapInt32Int32 setValue:1000 forKey:200];
   1044   [msg.mapInt32Int32 setValue:101 forKey:2001];
   1045   [msg.mapInt64Int64 setValue:1002 forKey:202];
   1046   [msg.mapInt64Int64 setValue:103 forKey:2003];
   1047   [msg.mapUint32Uint32 setValue:1004 forKey:204];
   1048   [msg.mapUint32Uint32 setValue:105 forKey:2005];
   1049   [msg.mapUint64Uint64 setValue:1006 forKey:206];
   1050   [msg.mapUint64Uint64 setValue:107 forKey:2007];
   1051   [msg.mapSint32Sint32 setValue:1008 forKey:208];
   1052   [msg.mapSint32Sint32 setValue:109 forKey:2009];
   1053   [msg.mapSint64Sint64 setValue:1010 forKey:210];
   1054   [msg.mapSint64Sint64 setValue:111 forKey:2011];
   1055   [msg.mapFixed32Fixed32 setValue:1012 forKey:212];
   1056   [msg.mapFixed32Fixed32 setValue:113 forKey:2013];
   1057   [msg.mapFixed64Fixed64 setValue:1014 forKey:214];
   1058   [msg.mapFixed64Fixed64 setValue:115 forKey:2015];
   1059   [msg.mapSfixed32Sfixed32 setValue:1016 forKey:216];
   1060   [msg.mapSfixed32Sfixed32 setValue:117 forKey:2017];
   1061   [msg.mapSfixed64Sfixed64 setValue:1018 forKey:218];
   1062   [msg.mapSfixed64Sfixed64 setValue:119 forKey:2019];
   1063   [msg.mapInt32Float setValue:1020.f forKey:220];
   1064   [msg.mapInt32Float setValue:121.f forKey:2021];
   1065   [msg.mapInt32Double setValue:1022. forKey:222];
   1066   [msg.mapInt32Double setValue:123. forKey:2023];
   1067   [msg.mapBoolBool setValue:false forKey:true];
   1068   [msg.mapBoolBool setValue:true forKey:false];
   1069   msg.mapStringString[@"224"] = @"1024";
   1070   msg.mapStringString[@"2025"] = @"125";
   1071   msg.mapStringBytes[@"226"] = DataFromCStr("1026");
   1072   msg.mapStringBytes[@"2027"] = DataFromCStr("127");
   1073   Message2 *val1 = [[Message2 alloc] init];
   1074   val1.optionalInt32 = 1028;
   1075   Message2 *val2 = [[Message2 alloc] init];
   1076   val2.optionalInt32 = 129;
   1077   [msg.mapStringMessage setValue:val1 forKey:@"228"];
   1078   [msg.mapStringMessage setValue:val2 forKey:@"2029"];
   1079   [msg.mapInt32Bytes setObject:DataFromCStr("1030 bytes") forKey:230];
   1080   [msg.mapInt32Bytes setObject:DataFromCStr("131") forKey:2031];
   1081   [msg.mapInt32Enum setValue:Message2_Enum_Bar forKey:232];
   1082   [msg.mapInt32Enum setValue:Message2_Enum_Baz forKey:2033];
   1083   Message2 *val3 = [[Message2 alloc] init];
   1084   val3.optionalInt32 = 1034;
   1085   Message2 *val4 = [[Message2 alloc] init];
   1086   val4.optionalInt32 = 135;
   1087   [msg.mapInt32Message setObject:val3 forKey:234];
   1088   [msg.mapInt32Message setObject:val4 forKey:2035];
   1089 
   1090   NSData *data = [msg data];
   1091   XCTAssertNotNil(data);
   1092   Message2 *msg2 = [[Message2 alloc] initWithData:data error:NULL];
   1093 
   1094   XCTAssertNotEqual(msg2, msg);  // Pointer comparison
   1095   XCTAssertEqualObjects(msg2, msg);
   1096 
   1097   [val4 release];
   1098   [val3 release];
   1099   [val2 release];
   1100   [val1 release];
   1101   [msg2 release];
   1102   [msg release];
   1103 }
   1104 
   1105 @end
   1106